diff --git a/pkg/analyzer_experimental/bin/formatter.dart b/pkg/analyzer_experimental/bin/formatter.dart
index 3fc928d..d80a0e2 100755
--- a/pkg/analyzer_experimental/bin/formatter.dart
+++ b/pkg/analyzer_experimental/bin/formatter.dart
@@ -4,46 +4,75 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:convert';
 import 'dart:io';
 
 import 'package:args/args.dart';
+import 'package:path/path.dart' as path;
 
 import 'package:analyzer_experimental/src/services/formatter_impl.dart';
 
 
 const BINARY_NAME = 'dartfmt';
+final dartFileRegExp = new RegExp(r'^[^.].*\.dart$', caseSensitive: false);
 final argParser = _initArgParser();
 
+bool overwriteFileContents;
+
 void main() {
   var options = argParser.parse(new Options().arguments);
   if (options['help']) {
     _printUsage();
     return;
   }
+  overwriteFileContents = options['write'];
+  
   if (options.rest.isEmpty) {
     _formatStdin(options);
   } else {
-    _formatFiles(options.rest);
+    _formatPaths(options.rest);
   }
 }
 
-_formatFiles(files) {
-  for (var file in files) {
-    _formatFile(file);
+_formatPaths(paths) {
+  paths.forEach((path) {
+    if (FileSystemEntity.isDirectorySync(path)) {
+      _formatDirectory(new Directory(path));
+    } else {
+      _formatFile(new File(path));
+    }
+  });
+}
+
+_formatResource(resource) {
+  if (resource is Directory) {
+    _formatDirectory(resource);
+  } else if (resource is File) {
+    _formatFile(resource);
   }
 }
 
-_formatFile(path) {
-  var buffer = new StringBuffer();
-  var file = new File(path);
-  file.openRead()
-      .transform(UTF8.decoder)
-      .listen((data) =>  buffer.write(data),
-        onError: (error) => print('Error, could not open "$path"'),
-        onDone: () => print(_formatCU(buffer.toString())));
+_formatDirectory(dir) => 
+    dir.listSync().forEach((resource) => _formatResource(resource));
+
+void _formatFile(file) {
+  if (_isDartFile(file)) {
+    try {
+      var buffer = new StringBuffer();
+      var rawSource = file.readAsStringSync();
+      var formatted = _formatCU(rawSource);
+      if (overwriteFileContents) {
+        file.writeAsStringSync(formatted);
+      } else {
+        print(formatted);
+      }
+    } catch (e) {
+      _log('Error formatting "${file.path}": $e');
+    }
+  }
 }
 
+_isDartFile(file) => dartFileRegExp.hasMatch(path.basename(file.path));
+
 _formatStdin(options) {
   _log('not supported yet!');
 //  stdin.transform(new StringDecoder())
diff --git a/pkg/analyzer_experimental/example/parser_driver.dart b/pkg/analyzer_experimental/example/parser_driver.dart
index 8501552..e69c33b 100644
--- a/pkg/analyzer_experimental/example/parser_driver.dart
+++ b/pkg/analyzer_experimental/example/parser_driver.dart
@@ -6,7 +6,6 @@
 
 import 'package:analyzer_experimental/src/generated/ast.dart';
 import 'package:analyzer_experimental/src/generated/error.dart';
-import 'package:analyzer_experimental/src/generated/java_core.dart';
 import 'package:analyzer_experimental/src/generated/parser.dart';
 import 'package:analyzer_experimental/src/generated/scanner.dart';
 
diff --git a/pkg/analyzer_experimental/example/resolver_driver.dart b/pkg/analyzer_experimental/example/resolver_driver.dart
index 883816e..2207cf1 100644
--- a/pkg/analyzer_experimental/example/resolver_driver.dart
+++ b/pkg/analyzer_experimental/example/resolver_driver.dart
@@ -45,7 +45,7 @@
   visitNode(ASTNode node) {
     String text = '${node.runtimeType} : <"${node.toString()}">';
     if (node is SimpleIdentifier) {
-      Element element = (node as SimpleIdentifier).element;
+      Element element = (node as SimpleIdentifier).staticElement;
       if (element != null) {
         text += " element: ${element.runtimeType}";
         LibraryElement library = element.library;
diff --git a/pkg/analyzer_experimental/example/scanner_driver.dart b/pkg/analyzer_experimental/example/scanner_driver.dart
index 0455cbe..346eb61 100644
--- a/pkg/analyzer_experimental/example/scanner_driver.dart
+++ b/pkg/analyzer_experimental/example/scanner_driver.dart
@@ -4,7 +4,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer_experimental/src/generated/java_core.dart';
 import 'package:analyzer_experimental/src/generated/scanner.dart';
 
 import 'dart:io';
diff --git a/pkg/analyzer_experimental/lib/src/generated/ast.dart b/pkg/analyzer_experimental/lib/src/generated/ast.dart
index 8fc097e..f3e9d2e 100644
--- a/pkg/analyzer_experimental/lib/src/generated/ast.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/ast.dart
@@ -209,7 +209,7 @@
    *
    * @param visitor the visitor that will be used to visit the children of this node
    */
-  void visitChildren(ASTVisitor<Object> visitor);
+  void visitChildren(ASTVisitor visitor);
 
   /**
    * Make this node the parent of the given child node.
@@ -231,7 +231,7 @@
    * @param child the child to be visited
    * @param visitor the visitor that will be used to visit the child
    */
-  void safelyVisitChild(ASTNode child, ASTVisitor<Object> visitor) {
+  void safelyVisitChild(ASTNode child, ASTVisitor visitor) {
     if (child != null) {
       child.accept(visitor);
     }
@@ -406,7 +406,7 @@
    * @return the strings that are implicitly concatenated
    */
   NodeList<StringLiteral> get strings => _strings;
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     _strings.accept(visitor);
   }
   void appendStringValue(JavaStringBuilder builder) {
@@ -504,7 +504,7 @@
     this._metadata.clear();
     this._metadata.addAll(metadata2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     if (commentIsBeforeAnnotations()) {
       safelyVisitChild(_comment, visitor);
       _metadata.accept(visitor);
@@ -674,7 +674,7 @@
       return _element;
     }
     if (_name != null) {
-      return _name.element;
+      return _name.staticElement;
     }
     return null;
   }
@@ -757,7 +757,7 @@
   void set period(Token period2) {
     this._period = period2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_constructorName, visitor);
     safelyVisitChild(_arguments, visitor);
@@ -838,7 +838,7 @@
   void set question(Token question2) {
     this._question = question2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_identifier, visitor);
   }
 }
@@ -988,7 +988,7 @@
   void set rightParenthesis(Token parenthesis) {
     _rightParenthesis = parenthesis;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     _arguments.accept(visitor);
   }
 
@@ -1139,7 +1139,7 @@
   void set type(TypeName name) {
     this._type = becomeParentOf(name);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
     safelyVisitChild(_type, visitor);
   }
@@ -1291,7 +1291,7 @@
   void set semicolon(Token semicolon2) {
     this._semicolon = semicolon2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_condition, visitor);
   }
 }
@@ -1464,7 +1464,7 @@
   void set staticElement(MethodElement element) {
     _staticElement = element;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_leftHandSide, visitor);
     safelyVisitChild(_rightHandSide, visitor);
   }
@@ -1680,7 +1680,7 @@
   void set staticElement(MethodElement element) {
     _staticElement = element;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_leftOperand, visitor);
     safelyVisitChild(_rightOperand, visitor);
   }
@@ -1818,7 +1818,7 @@
   void set rightBracket(Token rightBracket2) {
     this._rightBracket = rightBracket2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     _statements.accept(visitor);
   }
 }
@@ -1874,7 +1874,7 @@
   void set block(Block block2) {
     this._block = becomeParentOf(block2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_block, visitor);
   }
 }
@@ -1954,7 +1954,7 @@
   void set value(bool value2) {
     this._value = value2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
   }
 }
 /**
@@ -2056,7 +2056,7 @@
   void set semicolon(Token semicolon2) {
     this._semicolon = semicolon2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_label, visitor);
   }
 }
@@ -2137,7 +2137,7 @@
   void set target(Expression target2) {
     this._target = becomeParentOf(target2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_target, visitor);
     _cascadeSections.accept(visitor);
   }
@@ -2402,7 +2402,7 @@
   void set stackTraceParameter(SimpleIdentifier parameter) {
     _stackTraceParameter = becomeParentOf(parameter);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_exceptionType, visitor);
     safelyVisitChild(_exceptionParameter, visitor);
     safelyVisitChild(_stackTraceParameter, visitor);
@@ -2543,7 +2543,7 @@
    * @return the token representing the 'class' keyword
    */
   Token get classKeyword => _classKeyword;
-  ClassElement get element => _name != null ? (_name.element as ClassElement) : null;
+  ClassElement get element => _name != null ? (_name.staticElement as ClassElement) : null;
   Token get endToken => _rightBracket;
 
   /**
@@ -2702,7 +2702,7 @@
   void set withClause(WithClause withClause2) {
     this._withClause = becomeParentOf(withClause2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_typeParameters, visitor);
@@ -2845,7 +2845,7 @@
    * @return the token for the 'abstract' keyword
    */
   Token get abstractKeyword => _abstractKeyword;
-  ClassElement get element => _name != null ? (_name.element as ClassElement) : null;
+  ClassElement get element => _name != null ? (_name.staticElement as ClassElement) : null;
 
   /**
    * Return the token for the '=' separating the name from the definition.
@@ -2952,7 +2952,7 @@
   void set withClause(WithClause withClause2) {
     this._withClause = becomeParentOf(withClause2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_typeParameters, visitor);
@@ -3150,7 +3150,7 @@
    * @return `true` if this is an end-of-line comment
    */
   bool get isEndOfLine => identical(_type, CommentType.END_OF_LINE);
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     _references.accept(visitor);
   }
 }
@@ -3158,7 +3158,7 @@
  * The enumeration `CommentType` encodes all the different types of comments that are
  * recognized by the parser.
  */
-class CommentType implements Enum<CommentType> {
+class CommentType extends Enum<CommentType> {
 
   /**
    * An end-of-line comment.
@@ -3175,16 +3175,7 @@
    */
   static final CommentType DOCUMENTATION = new CommentType('DOCUMENTATION', 2);
   static final List<CommentType> values = [END_OF_LINE, BLOCK, DOCUMENTATION];
-
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-  CommentType(this.name, this.ordinal);
-  int compareTo(CommentType other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
+  CommentType(String name, int ordinal) : super(name, ordinal);
 }
 /**
  * Instances of the class `CommentReference` represent a reference to a Dart element that is
@@ -3262,7 +3253,7 @@
   void set newKeyword(Token newKeyword2) {
     this._newKeyword = newKeyword2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_identifier, visitor);
   }
 }
@@ -3500,7 +3491,7 @@
   void set scriptTag(ScriptTag scriptTag2) {
     this._scriptTag = becomeParentOf(scriptTag2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_scriptTag, visitor);
     if (directivesAreBeforeDeclarations()) {
       _directives.accept(visitor);
@@ -3730,7 +3721,7 @@
   void set thenExpression(Expression expression) {
     _thenExpression = becomeParentOf(expression);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_condition, visitor);
     safelyVisitChild(_thenExpression, visitor);
     safelyVisitChild(_elseExpression, visitor);
@@ -4077,7 +4068,7 @@
   void set separator(Token separator2) {
     this._separator = separator2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
     safelyVisitChild(_name, visitor);
@@ -4270,7 +4261,7 @@
   void set period(Token period2) {
     this._period = period2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_fieldName, visitor);
     safelyVisitChild(_expression, visitor);
   }
@@ -4449,7 +4440,7 @@
   void set type(TypeName type2) {
     this._type = becomeParentOf(type2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_type, visitor);
     safelyVisitChild(_name, visitor);
   }
@@ -4553,7 +4544,7 @@
   void set semicolon(Token semicolon2) {
     this._semicolon = semicolon2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_label, visitor);
   }
 }
@@ -4650,7 +4641,7 @@
     if (identifier == null) {
       return null;
     }
-    return identifier.element as LocalVariableElement;
+    return identifier.staticElement as LocalVariableElement;
   }
   Token get endToken => _identifier.endToken;
 
@@ -4710,7 +4701,7 @@
   void set type(TypeName typeName) {
     _type = becomeParentOf(typeName);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_type, visitor);
     safelyVisitChild(_identifier, visitor);
@@ -4858,7 +4849,7 @@
   void set separator(Token separator2) {
     this._separator = separator2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_parameter, visitor);
     safelyVisitChild(_defaultValue, visitor);
   }
@@ -5123,7 +5114,7 @@
   void set whileKeyword(Token whileKeyword2) {
     this._whileKeyword = whileKeyword2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_body, visitor);
     safelyVisitChild(_condition, visitor);
   }
@@ -5207,7 +5198,7 @@
   void set value(double value2) {
     this._value = value2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
   }
 }
 /**
@@ -5263,7 +5254,7 @@
   void set semicolon(Token semicolon2) {
     this._semicolon = semicolon2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
   }
 }
 /**
@@ -5317,7 +5308,7 @@
   void set semicolon(Token semicolon2) {
     this._semicolon = semicolon2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
   }
 }
 /**
@@ -5374,7 +5365,7 @@
     }
     return null;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     combinators.accept(visitor);
   }
@@ -5646,7 +5637,7 @@
   void set semicolon(Token semicolon2) {
     this._semicolon = semicolon2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
 }
@@ -5733,7 +5724,7 @@
   void set semicolon(Token semicolon2) {
     this._semicolon = semicolon2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
 }
@@ -5813,7 +5804,7 @@
   void set superclass(TypeName name) {
     _superclass = becomeParentOf(name);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_superclass, visitor);
   }
 }
@@ -5833,7 +5824,7 @@
   /**
    * The token representing the 'static' keyword, or `null` if the fields are not static.
    */
-  Token _keyword;
+  Token _staticKeyword;
 
   /**
    * The fields being declared.
@@ -5850,12 +5841,12 @@
    *
    * @param comment the documentation comment associated with this field
    * @param metadata the annotations associated with this field
-   * @param keyword the token representing the 'static' keyword
+   * @param staticKeyword the token representing the 'static' keyword
    * @param fieldList the fields being declared
    * @param semicolon the semicolon terminating the declaration
    */
-  FieldDeclaration.full(Comment comment, List<Annotation> metadata, Token keyword, VariableDeclarationList fieldList, Token semicolon) : super.full(comment, metadata) {
-    this._keyword = keyword;
+  FieldDeclaration.full(Comment comment, List<Annotation> metadata, Token staticKeyword, VariableDeclarationList fieldList, Token semicolon) : super.full(comment, metadata) {
+    this._staticKeyword = staticKeyword;
     this._fieldList = becomeParentOf(fieldList);
     this._semicolon = semicolon;
   }
@@ -5865,11 +5856,11 @@
    *
    * @param comment the documentation comment associated with this field
    * @param metadata the annotations associated with this field
-   * @param keyword the token representing the 'static' keyword
+   * @param staticKeyword the token representing the 'static' keyword
    * @param fieldList the fields being declared
    * @param semicolon the semicolon terminating the declaration
    */
-  FieldDeclaration({Comment comment, List<Annotation> metadata, Token keyword, VariableDeclarationList fieldList, Token semicolon}) : this.full(comment, metadata, keyword, fieldList, semicolon);
+  FieldDeclaration({Comment comment, List<Annotation> metadata, Token staticKeyword, VariableDeclarationList fieldList, Token semicolon}) : this.full(comment, metadata, staticKeyword, fieldList, semicolon);
   accept(ASTVisitor visitor) => visitor.visitFieldDeclaration(this);
   Element get element => null;
   Token get endToken => _semicolon;
@@ -5887,7 +5878,7 @@
    *
    * @return the token representing the 'static' keyword
    */
-  Token get keyword => _keyword;
+  Token get staticKeyword => _staticKeyword;
 
   /**
    * Return the semicolon terminating the declaration.
@@ -5901,7 +5892,7 @@
    *
    * @return `true` if the fields are declared to be static
    */
-  bool get isStatic => _keyword != null;
+  bool get isStatic => _staticKeyword != null;
 
   /**
    * Set the fields being declared to the given list of variables.
@@ -5917,8 +5908,8 @@
    *
    * @param keyword the token representing the 'static' keyword
    */
-  void set keyword(Token keyword2) {
-    this._keyword = keyword2;
+  void set staticKeyword(Token keyword) {
+    this._staticKeyword = keyword;
   }
 
   /**
@@ -5929,13 +5920,13 @@
   void set semicolon(Token semicolon2) {
     this._semicolon = semicolon2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_fieldList, visitor);
   }
   Token get firstTokenAfterCommentAndMetadata {
-    if (_keyword != null) {
-      return _keyword;
+    if (_staticKeyword != null) {
+      return _staticKeyword;
     }
     return _fieldList.beginToken;
   }
@@ -6111,7 +6102,7 @@
   void set type(TypeName typeName) {
     _type = becomeParentOf(typeName);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_type, visitor);
     safelyVisitChild(identifier, visitor);
@@ -6311,7 +6302,7 @@
   void set rightParenthesis(Token rightParenthesis2) {
     this._rightParenthesis = rightParenthesis2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_loopVariable, visitor);
     safelyVisitChild(_iterator, visitor);
     safelyVisitChild(_body, visitor);
@@ -6589,7 +6580,7 @@
   void set variables(VariableDeclarationList variableList) {
     variableList = becomeParentOf(variableList);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_variableList, visitor);
     safelyVisitChild(_initialization, visitor);
     safelyVisitChild(_condition, visitor);
@@ -6623,7 +6614,7 @@
     if (identifier == null) {
       return null;
     }
-    return identifier.element as ParameterElement;
+    return identifier.staticElement as ParameterElement;
   }
 
   /**
@@ -6839,7 +6830,7 @@
   void set rightParenthesis(Token parenthesis) {
     _rightParenthesis = parenthesis;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     _parameters.accept(visitor);
   }
 }
@@ -6933,7 +6924,7 @@
    */
   FunctionDeclaration({Comment comment, List<Annotation> metadata, Token externalKeyword, TypeName returnType, Token propertyKeyword, SimpleIdentifier name, FunctionExpression functionExpression}) : this.full(comment, metadata, externalKeyword, returnType, propertyKeyword, name, functionExpression);
   accept(ASTVisitor visitor) => visitor.visitFunctionDeclaration(this);
-  ExecutableElement get element => _name != null ? (_name.element as ExecutableElement) : null;
+  ExecutableElement get element => _name != null ? (_name.staticElement as ExecutableElement) : null;
   Token get endToken => _functionExpression.endToken;
 
   /**
@@ -7031,7 +7022,7 @@
   void set returnType(TypeName name) {
     _returnType = becomeParentOf(name);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
     safelyVisitChild(_name, visitor);
@@ -7098,7 +7089,7 @@
   void set functionExpression(FunctionDeclaration functionDeclaration2) {
     this._functionDeclaration = becomeParentOf(functionDeclaration2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_functionDeclaration, visitor);
   }
 }
@@ -7214,7 +7205,7 @@
   void set parameters(FormalParameterList parameters2) {
     this._parameters = becomeParentOf(parameters2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_parameters, visitor);
     safelyVisitChild(_body, visitor);
   }
@@ -7366,7 +7357,7 @@
   void set staticElement(ExecutableElement element) {
     this._staticElement = element;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_function, visitor);
     safelyVisitChild(_argumentList, visitor);
   }
@@ -7441,7 +7432,7 @@
    */
   FunctionTypeAlias({Comment comment, List<Annotation> metadata, Token keyword, TypeName returnType, SimpleIdentifier name, TypeParameterList typeParameters, FormalParameterList parameters, Token semicolon}) : this.full(comment, metadata, keyword, returnType, name, typeParameters, parameters, semicolon);
   accept(ASTVisitor visitor) => visitor.visitFunctionTypeAlias(this);
-  FunctionTypeAliasElement get element => _name != null ? (_name.element as FunctionTypeAliasElement) : null;
+  FunctionTypeAliasElement get element => _name != null ? (_name.staticElement as FunctionTypeAliasElement) : null;
 
   /**
    * Return the name of the function type being declared.
@@ -7508,7 +7499,7 @@
   void set typeParameters(TypeParameterList typeParameters2) {
     this._typeParameters = becomeParentOf(typeParameters2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
     safelyVisitChild(_name, visitor);
@@ -7608,7 +7599,7 @@
   void set returnType(TypeName returnType2) {
     this._returnType = becomeParentOf(returnType2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
     safelyVisitChild(identifier, visitor);
@@ -7660,7 +7651,7 @@
    * @return the list of names from the library that are hidden by this combinator
    */
   NodeList<SimpleIdentifier> get hiddenNames => _hiddenNames;
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     _hiddenNames.accept(visitor);
   }
 }
@@ -7688,14 +7679,14 @@
   static bool isPrivateName(String name) => name.startsWith("_");
 
   /**
-   * Return the element associated with this identifier based on propagated type information, or
-   * `null` if the AST structure has not been resolved or if this identifier could not be
-   * resolved. One example of the latter case is an identifier that is not defined within the scope
-   * in which it appears.
+   * Return the best element available for this operator. If resolution was able to find a better
+   * element based on type propagation, that element will be returned. Otherwise, the element found
+   * using the result of static analysis will be returned. If resolution has not been performed,
+   * then `null` will be returned.
    *
-   * @return the element associated with this identifier
+   * @return the best element available for this operator
    */
-  Element get element;
+  Element get bestElement;
 
   /**
    * Return the lexical representation of the identifier.
@@ -7705,6 +7696,16 @@
   String get name;
 
   /**
+   * Return the element associated with this identifier based on propagated type information, or
+   * `null` if the AST structure has not been resolved or if this identifier could not be
+   * resolved. One example of the latter case is an identifier that is not defined within the scope
+   * in which it appears.
+   *
+   * @return the element associated with this identifier
+   */
+  Element get propagatedElement;
+
+  /**
    * Return the element associated with this identifier based on static type information, or
    * `null` if the AST structure has not been resolved or if this identifier could not be
    * resolved. One example of the latter case is an identifier that is not defined within the scope
@@ -7921,7 +7922,7 @@
   void set thenStatement(Statement statement) {
     _thenStatement = becomeParentOf(statement);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_condition, visitor);
     safelyVisitChild(_thenStatement, visitor);
     safelyVisitChild(_elseStatement, visitor);
@@ -7995,7 +7996,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     _interfaces.accept(visitor);
   }
 }
@@ -8094,7 +8095,7 @@
   void set prefix(SimpleIdentifier prefix2) {
     this._prefix = becomeParentOf(prefix2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_prefix, visitor);
     combinators.accept(visitor);
@@ -8154,6 +8155,13 @@
   MethodElement _propagatedElement;
 
   /**
+   * If this expression is both in a getter and setter context, the [AuxiliaryElements] will
+   * be set to hold onto the static and propagated information. The auxiliary element will hold onto
+   * the elements from the getter context.
+   */
+  AuxiliaryElements _auxiliaryElements = null;
+
+  /**
    * Initialize a newly created index expression.
    *
    * @param target the expression used to compute the object being indexed
@@ -8203,6 +8211,12 @@
    */
   IndexExpression.forCascade({Token period, Token leftBracket, Expression index, Token rightBracket}) : this.forCascade_full(period, leftBracket, index, rightBracket);
   accept(ASTVisitor visitor) => visitor.visitIndexExpression(this);
+
+  /**
+   * Get the auxiliary elements, this will be `null` if the node is not in a getter and setter
+   * context, or if it is not yet fully resolved.
+   */
+  AuxiliaryElements get auxiliaryElements => _auxiliaryElements;
   Token get beginToken {
     if (_target != null) {
       return _target.beginToken;
@@ -8361,6 +8375,13 @@
   bool get isCascaded => _period != null;
 
   /**
+   * Set the auxiliary elements.
+   */
+  void set auxiliaryElements(AuxiliaryElements auxiliaryElements2) {
+    this._auxiliaryElements = auxiliaryElements2;
+  }
+
+  /**
    * Set the expression used to compute the index to the given expression.
    *
    * @param expression the expression used to compute the index
@@ -8424,7 +8445,7 @@
   void set target(Expression expression) {
     _target = becomeParentOf(expression);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_target, visitor);
     safelyVisitChild(_index, visitor);
   }
@@ -8629,7 +8650,7 @@
   void set staticElement(ConstructorElement element) {
     this._staticElement = element;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_constructorName, visitor);
     safelyVisitChild(_argumentList, visitor);
   }
@@ -8717,7 +8738,7 @@
   void set value(int value2) {
     this._value = value2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
   }
 }
 /**
@@ -8842,7 +8863,7 @@
   void set rightBracket(Token rightBracket2) {
     this._rightBracket = rightBracket2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
 }
@@ -8922,7 +8943,7 @@
   void set value(String string) {
     _value = string;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
   }
 }
 /**
@@ -9049,7 +9070,7 @@
   void set type(TypeName name) {
     this._type = becomeParentOf(name);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
     safelyVisitChild(_type, visitor);
   }
@@ -9129,7 +9150,7 @@
   void set label(SimpleIdentifier label2) {
     this._label = becomeParentOf(label2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_label, visitor);
   }
 }
@@ -9206,7 +9227,7 @@
   void set statement(Statement statement2) {
     this._statement = becomeParentOf(statement2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     _labels.accept(visitor);
     safelyVisitChild(_statement, visitor);
   }
@@ -9314,7 +9335,7 @@
   void set semicolon(Token semicolon2) {
     this._semicolon = semicolon2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
   }
@@ -9355,6 +9376,7 @@
   LibraryIdentifier({List<SimpleIdentifier> components}) : this.full(components);
   accept(ASTVisitor visitor) => visitor.visitLibraryIdentifier(this);
   Token get beginToken => _components.beginToken;
+  Element get bestElement => staticElement;
 
   /**
    * Return the components of the identifier.
@@ -9362,7 +9384,6 @@
    * @return the components of the identifier
    */
   NodeList<SimpleIdentifier> get components => _components;
-  Element get element => null;
   Token get endToken => _components.endToken;
   String get name {
     JavaStringBuilder builder = new JavaStringBuilder();
@@ -9377,8 +9398,9 @@
     }
     return builder.toString();
   }
+  Element get propagatedElement => null;
   Element get staticElement => null;
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     _components.accept(visitor);
   }
 }
@@ -9412,14 +9434,14 @@
   /**
    * Initialize a newly created list literal.
    *
-   * @param modifier the const modifier associated with this literal
+   * @param constKeyword the token representing the 'const' keyword
    * @param typeArguments the type argument associated with this literal, or `null` if no type
    *          arguments were declared
    * @param leftBracket the left square bracket
    * @param elements the expressions used to compute the elements of the list
    * @param rightBracket the right square bracket
    */
-  ListLiteral.full(Token modifier, TypeArgumentList typeArguments, Token leftBracket, List<Expression> elements, Token rightBracket) : super.full(modifier, typeArguments) {
+  ListLiteral.full(Token constKeyword, TypeArgumentList typeArguments, Token leftBracket, List<Expression> elements, Token rightBracket) : super.full(constKeyword, typeArguments) {
     this._elements = new NodeList<Expression>(this);
     this._leftBracket = leftBracket;
     this._elements.addAll(elements);
@@ -9429,17 +9451,17 @@
   /**
    * Initialize a newly created list literal.
    *
-   * @param modifier the const modifier associated with this literal
+   * @param constKeyword the token representing the 'const' keyword
    * @param typeArguments the type argument associated with this literal, or `null` if no type
    *          arguments were declared
    * @param leftBracket the left square bracket
    * @param elements the expressions used to compute the elements of the list
    * @param rightBracket the right square bracket
    */
-  ListLiteral({Token modifier, TypeArgumentList typeArguments, Token leftBracket, List<Expression> elements, Token rightBracket}) : this.full(modifier, typeArguments, leftBracket, elements, rightBracket);
+  ListLiteral({Token constKeyword, TypeArgumentList typeArguments, Token leftBracket, List<Expression> elements, Token rightBracket}) : this.full(constKeyword, typeArguments, leftBracket, elements, rightBracket);
   accept(ASTVisitor visitor) => visitor.visitListLiteral(this);
   Token get beginToken {
-    Token token = modifier;
+    Token token = constKeyword;
     if (token != null) {
       return token;
     }
@@ -9489,7 +9511,7 @@
   void set rightBracket(Token bracket) {
     _rightBracket = bracket;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     _elements.accept(visitor);
   }
@@ -9543,14 +9565,14 @@
   /**
    * Initialize a newly created map literal.
    *
-   * @param modifier the const modifier associated with this literal
+   * @param constKeyword the token representing the 'const' keyword
    * @param typeArguments the type argument associated with this literal, or `null` if no type
    *          arguments were declared
    * @param leftBracket the left curly bracket
    * @param entries the entries in the map
    * @param rightBracket the right curly bracket
    */
-  MapLiteral.full(Token modifier, TypeArgumentList typeArguments, Token leftBracket, List<MapLiteralEntry> entries, Token rightBracket) : super.full(modifier, typeArguments) {
+  MapLiteral.full(Token constKeyword, TypeArgumentList typeArguments, Token leftBracket, List<MapLiteralEntry> entries, Token rightBracket) : super.full(constKeyword, typeArguments) {
     this._entries = new NodeList<MapLiteralEntry>(this);
     this._leftBracket = leftBracket;
     this._entries.addAll(entries);
@@ -9560,17 +9582,17 @@
   /**
    * Initialize a newly created map literal.
    *
-   * @param modifier the const modifier associated with this literal
+   * @param constKeyword the token representing the 'const' keyword
    * @param typeArguments the type argument associated with this literal, or `null` if no type
    *          arguments were declared
    * @param leftBracket the left curly bracket
    * @param entries the entries in the map
    * @param rightBracket the right curly bracket
    */
-  MapLiteral({Token modifier, TypeArgumentList typeArguments, Token leftBracket, List<MapLiteralEntry> entries, Token rightBracket}) : this.full(modifier, typeArguments, leftBracket, entries, rightBracket);
+  MapLiteral({Token constKeyword, TypeArgumentList typeArguments, Token leftBracket, List<MapLiteralEntry> entries, Token rightBracket}) : this.full(constKeyword, typeArguments, leftBracket, entries, rightBracket);
   accept(ASTVisitor visitor) => visitor.visitMapLiteral(this);
   Token get beginToken {
-    Token token = modifier;
+    Token token = constKeyword;
     if (token != null) {
       return token;
     }
@@ -9620,7 +9642,7 @@
   void set rightBracket(Token bracket) {
     _rightBracket = bracket;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     _entries.accept(visitor);
   }
@@ -9727,7 +9749,7 @@
   void set value(Expression expression) {
     _value = becomeParentOf(expression);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_key, visitor);
     safelyVisitChild(_value, visitor);
   }
@@ -9854,7 +9876,7 @@
    *
    * @return the element associated with this method
    */
-  ExecutableElement get element => _name != null ? (_name.element as ExecutableElement) : null;
+  ExecutableElement get element => _name != null ? (_name.staticElement as ExecutableElement) : null;
   Token get endToken => _body.endToken;
 
   /**
@@ -10017,7 +10039,7 @@
   void set returnType(TypeName typeName) {
     _returnType = becomeParentOf(typeName);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_returnType, visitor);
     safelyVisitChild(_name, visitor);
@@ -10209,7 +10231,7 @@
   void set target(Expression expression) {
     _target = becomeParentOf(expression);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_target, visitor);
     safelyVisitChild(_methodName, visitor);
     safelyVisitChild(_argumentList, visitor);
@@ -10267,7 +10289,7 @@
    * @return the element representing the parameter being named by this expression
    */
   ParameterElement get element {
-    Element element = _name.label.element;
+    Element element = _name.label.staticElement;
     if (element is ParameterElement) {
       return element as ParameterElement;
     }
@@ -10306,7 +10328,7 @@
   void set name(Label identifier) {
     _name = becomeParentOf(identifier);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_expression, visitor);
   }
@@ -10481,7 +10503,7 @@
   void set name(StringLiteral name2) {
     this._name = name2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_name, visitor);
   }
 }
@@ -10560,7 +10582,7 @@
    * @return the string literal representing the string after the 'native' token
    */
   StringLiteral get stringLiteral => _stringLiteral;
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_stringLiteral, visitor);
   }
 }
@@ -10658,7 +10680,7 @@
   void set identifier(SimpleIdentifier identifier2) {
     this._identifier = becomeParentOf(identifier2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     if (commentIsBeforeAnnotations()) {
       safelyVisitChild(_comment, visitor);
       _metadata.accept(visitor);
@@ -10749,7 +10771,7 @@
   void set literal(Token literal2) {
     this._literal = literal2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
   }
 }
 /**
@@ -10851,7 +10873,7 @@
   void set rightParenthesis(Token parenthesis) {
     _rightParenthesis = parenthesis;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
 }
@@ -11066,7 +11088,7 @@
   void set semicolon(Token semicolon2) {
     this._semicolon = semicolon2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_libraryName, visitor);
   }
@@ -11217,7 +11239,7 @@
   void set staticElement(MethodElement element) {
     _staticElement = element;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_operand, visitor);
   }
 
@@ -11408,7 +11430,7 @@
   void set staticElement(MethodElement element) {
     _staticElement = element;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_operand, visitor);
   }
 
@@ -11506,11 +11528,11 @@
   PrefixedIdentifier({SimpleIdentifier prefix, Token period, SimpleIdentifier identifier}) : this.full(prefix, period, identifier);
   accept(ASTVisitor visitor) => visitor.visitPrefixedIdentifier(this);
   Token get beginToken => _prefix.beginToken;
-  Element get element {
+  Element get bestElement {
     if (_identifier == null) {
       return null;
     }
-    return _identifier.element;
+    return _identifier.bestElement;
   }
   Token get endToken => _identifier.endToken;
 
@@ -11535,6 +11557,12 @@
    * @return the prefix associated with the library in which the identifier is defined
    */
   SimpleIdentifier get prefix => _prefix;
+  Element get propagatedElement {
+    if (_identifier == null) {
+      return null;
+    }
+    return _identifier.propagatedElement;
+  }
   Element get staticElement {
     if (_identifier == null) {
       return null;
@@ -11569,7 +11597,7 @@
   void set prefix(SimpleIdentifier identifier) {
     _prefix = becomeParentOf(identifier);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_prefix, visitor);
     safelyVisitChild(_identifier, visitor);
   }
@@ -11718,7 +11746,7 @@
   void set target(Expression expression) {
     _target = becomeParentOf(expression);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_target, visitor);
     safelyVisitChild(_propertyName, visitor);
   }
@@ -11905,7 +11933,7 @@
   void set staticElement(ConstructorElement element) {
     this._staticElement = element;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_constructorName, visitor);
     safelyVisitChild(_argumentList, visitor);
   }
@@ -11961,7 +11989,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
   }
 }
 /**
@@ -12065,7 +12093,7 @@
   void set semicolon(Token semicolon2) {
     this._semicolon = semicolon2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
 }
@@ -12121,7 +12149,7 @@
   void set scriptTag(Token scriptTag2) {
     this._scriptTag = scriptTag2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
   }
 }
 /**
@@ -12169,7 +12197,7 @@
    * @return the list of names from the library that are made visible by this combinator
    */
   NodeList<SimpleIdentifier> get shownNames => _shownNames;
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     _shownNames.accept(visitor);
   }
 }
@@ -12266,7 +12294,7 @@
   void set type(TypeName typeName) {
     _type = becomeParentOf(typeName);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_type, visitor);
     safelyVisitChild(identifier, visitor);
@@ -12307,6 +12335,13 @@
   Element _propagatedElement;
 
   /**
+   * If this expression is both in a getter and setter context, the [AuxiliaryElements] will
+   * be set to hold onto the static and propagated information. The auxiliary element will hold onto
+   * the elements from the getter context.
+   */
+  AuxiliaryElements _auxiliaryElements = null;
+
+  /**
    * Initialize a newly created identifier.
    *
    * @param token the token representing the identifier
@@ -12322,10 +12357,22 @@
    */
   SimpleIdentifier({Token token}) : this.full(token);
   accept(ASTVisitor visitor) => visitor.visitSimpleIdentifier(this);
+
+  /**
+   * Get the auxiliary elements, this will be `null` if the node is not in a getter and setter
+   * context, or if it is not yet fully resolved.
+   */
+  AuxiliaryElements get auxiliaryElements => _auxiliaryElements;
   Token get beginToken => _token;
-  Element get element => _propagatedElement;
+  Element get bestElement {
+    if (_propagatedElement == null) {
+      return _staticElement;
+    }
+    return _propagatedElement;
+  }
   Token get endToken => _token;
   String get name => _token.lexeme;
+  Element get propagatedElement => _propagatedElement;
   Element get staticElement => _staticElement;
 
   /**
@@ -12449,13 +12496,20 @@
   bool get isSynthetic => _token.isSynthetic;
 
   /**
+   * Set the auxiliary elements.
+   */
+  void set auxiliaryElements(AuxiliaryElements auxiliaryElements2) {
+    this._auxiliaryElements = auxiliaryElements2;
+  }
+
+  /**
    * Set the element associated with this identifier based on propagated type information to the
    * given element.
    *
    * @param element the element to be associated with this identifier
    */
-  void set element(Element element2) {
-    _propagatedElement = element2;
+  void set propagatedElement(Element element) {
+    _propagatedElement = validateElement2(element);
   }
 
   /**
@@ -12465,7 +12519,7 @@
    * @param element the element to be associated with this identifier
    */
   void set staticElement(Element element) {
-    _staticElement = element;
+    _staticElement = validateElement2(element);
   }
 
   /**
@@ -12476,7 +12530,56 @@
   void set token(Token token2) {
     this._token = token2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
+  }
+
+  /**
+   * Return the given element if it is an appropriate element based on the parent of this
+   * identifier, or `null` if it is not appropriate.
+   *
+   * @param element the element to be associated with this identifier
+   * @return the element to be associated with this identifier
+   */
+  Element validateElement(ASTNode parent, Type expectedClass, Element element) {
+    if (!isInstanceOf(element, expectedClass)) {
+      AnalysisEngine.instance.logger.logInformation2("Internal error: attempting to set the name of a ${parent.runtimeType.toString()} to a ${element.runtimeType.toString()}", new JavaException());
+      return null;
+    }
+    return element;
+  }
+
+  /**
+   * Return the given element if it is an appropriate element based on the parent of this
+   * identifier, or `null` if it is not appropriate.
+   *
+   * @param element the element to be associated with this identifier
+   * @return the element to be associated with this identifier
+   */
+  Element validateElement2(Element element) {
+    if (element == null) {
+      return null;
+    }
+    ASTNode parent = this.parent;
+    if (parent is ClassDeclaration && identical(((parent as ClassDeclaration)).name, this)) {
+      return validateElement(parent, ClassElement, element);
+    } else if (parent is ClassTypeAlias && identical(((parent as ClassTypeAlias)).name, this)) {
+      return validateElement(parent, ClassElement, element);
+    } else if (parent is DeclaredIdentifier && identical(((parent as DeclaredIdentifier)).identifier, this)) {
+      return validateElement(parent, LocalVariableElement, element);
+    } else if (parent is FormalParameter && identical(((parent as FormalParameter)).identifier, this)) {
+      return validateElement(parent, ParameterElement, element);
+    } else if (parent is FunctionDeclaration && identical(((parent as FunctionDeclaration)).name, this)) {
+      return validateElement(parent, ExecutableElement, element);
+    } else if (parent is FunctionTypeAlias && identical(((parent as FunctionTypeAlias)).name, this)) {
+      return validateElement(parent, FunctionTypeAliasElement, element);
+    } else if (parent is MethodDeclaration && identical(((parent as MethodDeclaration)).name, this)) {
+      return validateElement(parent, ExecutableElement, element);
+    } else if (parent is TypeParameter && identical(((parent as TypeParameter)).name, this)) {
+      return validateElement(parent, TypeVariableElement, element);
+    } else if (parent is VariableDeclaration && identical(((parent as VariableDeclaration)).name, this)) {
+      return validateElement(parent, VariableElement, element);
+    }
+    return element;
   }
 }
 /**
@@ -12591,7 +12694,7 @@
   void set value(String string) {
     _value = StringUtilities.intern(_value);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
   }
   void appendStringValue(JavaStringBuilder builder) {
     builder.append(value);
@@ -12667,7 +12770,7 @@
    */
   NodeList<InterpolationElement> get elements => _elements;
   Token get endToken => _elements.endToken;
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     _elements.accept(visitor);
   }
   void appendStringValue(JavaStringBuilder builder) {
@@ -12894,7 +12997,7 @@
   void set staticElement(ConstructorElement element) {
     this._staticElement = element;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_constructorName, visitor);
     safelyVisitChild(_argumentList, visitor);
   }
@@ -12950,7 +13053,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
   }
 }
 /**
@@ -13010,7 +13113,7 @@
   void set expression(Expression expression2) {
     this._expression = becomeParentOf(expression2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     labels.accept(visitor);
     safelyVisitChild(_expression, visitor);
     statements.accept(visitor);
@@ -13048,7 +13151,7 @@
    */
   SwitchDefault({List<Label> labels, Token keyword, Token colon, List<Statement> statements}) : this.full(labels, keyword, colon, statements);
   accept(ASTVisitor visitor) => visitor.visitSwitchDefault(this);
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     labels.accept(visitor);
     statements.accept(visitor);
   }
@@ -13360,7 +13463,7 @@
   void set rightParenthesis(Token rightParenthesis2) {
     this._rightParenthesis = rightParenthesis2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
     _members.accept(visitor);
   }
@@ -13431,7 +13534,7 @@
   void set poundSign(Token poundSign2) {
     this._poundSign = poundSign2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
   }
 }
 /**
@@ -13485,7 +13588,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
   }
 }
 /**
@@ -13568,7 +13671,7 @@
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_expression, visitor);
   }
 }
@@ -13653,7 +13756,7 @@
   void set variables(VariableDeclarationList variableList) {
     variableList = becomeParentOf(variableList);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_variableList, visitor);
   }
@@ -13696,10 +13799,10 @@
   Token _finallyKeyword;
 
   /**
-   * The finally clause contained in the try statement, or `null` if the statement does not
+   * The finally block contained in the try statement, or `null` if the statement does not
    * contain a finally clause.
    */
-  Block _finallyClause;
+  Block _finallyBlock;
 
   /**
    * Initialize a newly created try statement.
@@ -13708,15 +13811,15 @@
    * @param body the body of the statement
    * @param catchClauses the catch clauses contained in the try statement
    * @param finallyKeyword the token representing the 'finally' keyword
-   * @param finallyClause the finally clause contained in the try statement
+   * @param finallyBlock the finally block contained in the try statement
    */
-  TryStatement.full(Token tryKeyword, Block body, List<CatchClause> catchClauses, Token finallyKeyword, Block finallyClause) {
+  TryStatement.full(Token tryKeyword, Block body, List<CatchClause> catchClauses, Token finallyKeyword, Block finallyBlock) {
     this._catchClauses = new NodeList<CatchClause>(this);
     this._tryKeyword = tryKeyword;
     this._body = becomeParentOf(body);
     this._catchClauses.addAll(catchClauses);
     this._finallyKeyword = finallyKeyword;
-    this._finallyClause = becomeParentOf(finallyClause);
+    this._finallyBlock = becomeParentOf(finallyBlock);
   }
 
   /**
@@ -13726,9 +13829,9 @@
    * @param body the body of the statement
    * @param catchClauses the catch clauses contained in the try statement
    * @param finallyKeyword the token representing the 'finally' keyword
-   * @param finallyClause the finally clause contained in the try statement
+   * @param finallyBlock the finally block contained in the try statement
    */
-  TryStatement({Token tryKeyword, Block body, List<CatchClause> catchClauses, Token finallyKeyword, Block finallyClause}) : this.full(tryKeyword, body, catchClauses, finallyKeyword, finallyClause);
+  TryStatement({Token tryKeyword, Block body, List<CatchClause> catchClauses, Token finallyKeyword, Block finallyBlock}) : this.full(tryKeyword, body, catchClauses, finallyKeyword, finallyBlock);
   accept(ASTVisitor visitor) => visitor.visitTryStatement(this);
   Token get beginToken => _tryKeyword;
 
@@ -13746,8 +13849,8 @@
    */
   NodeList<CatchClause> get catchClauses => _catchClauses;
   Token get endToken {
-    if (_finallyClause != null) {
-      return _finallyClause.endToken;
+    if (_finallyBlock != null) {
+      return _finallyBlock.endToken;
     } else if (_finallyKeyword != null) {
       return _finallyKeyword;
     } else if (!_catchClauses.isEmpty) {
@@ -13757,12 +13860,12 @@
   }
 
   /**
-   * Return the finally clause contained in the try statement, or `null` if the statement does
+   * Return the finally block contained in the try statement, or `null` if the statement does
    * not contain a finally clause.
    *
-   * @return the finally clause contained in the try statement
+   * @return the finally block contained in the try statement
    */
-  Block get finallyClause => _finallyClause;
+  Block get finallyBlock => _finallyBlock;
 
   /**
    * Return the token representing the 'finally' keyword, or `null` if the statement does not
@@ -13789,12 +13892,12 @@
   }
 
   /**
-   * Set the finally clause contained in the try statement to the given block.
+   * Set the finally block contained in the try statement to the given block.
    *
-   * @param block the finally clause contained in the try statement
+   * @param block the finally block contained in the try statement
    */
-  void set finallyClause(Block block) {
-    _finallyClause = becomeParentOf(block);
+  void set finallyBlock(Block block) {
+    _finallyBlock = becomeParentOf(block);
   }
 
   /**
@@ -13814,10 +13917,10 @@
   void set tryKeyword(Token tryKeyword2) {
     this._tryKeyword = tryKeyword2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_body, visitor);
     _catchClauses.accept(visitor);
-    safelyVisitChild(_finallyClause, visitor);
+    safelyVisitChild(_finallyBlock, visitor);
   }
 }
 /**
@@ -13994,7 +14097,7 @@
   void set rightBracket(Token rightBracket2) {
     this._rightBracket = rightBracket2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     _arguments.accept(visitor);
   }
 }
@@ -14104,7 +14207,7 @@
   void set typeArguments(TypeArgumentList typeArguments2) {
     this._typeArguments = becomeParentOf(typeArguments2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_typeArguments, visitor);
   }
@@ -14172,7 +14275,7 @@
    * @return the name of the upper bound for legal arguments
    */
   TypeName get bound => _bound;
-  TypeVariableElement get element => _name != null ? (_name.element as TypeVariableElement) : null;
+  TypeVariableElement get element => _name != null ? (_name.staticElement as TypeVariableElement) : null;
   Token get endToken {
     if (_bound == null) {
       return _name.endToken;
@@ -14221,7 +14324,7 @@
   void set name(SimpleIdentifier identifier) {
     _name = becomeParentOf(identifier);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_bound, visitor);
@@ -14301,7 +14404,7 @@
    * @return the type parameters for the type
    */
   NodeList<TypeParameter> get typeParameters => _typeParameters;
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     _typeParameters.accept(visitor);
   }
 }
@@ -14320,10 +14423,9 @@
 abstract class TypedLiteral extends Literal {
 
   /**
-   * The const modifier associated with this literal, or `null` if the literal is not a
-   * constant.
+   * The token representing the 'const' keyword, or `null` if the literal is not a constant.
    */
-  Token _modifier;
+  Token _constKeyword;
 
   /**
    * The type argument associated with this literal, or `null` if no type arguments were
@@ -14334,30 +14436,30 @@
   /**
    * Initialize a newly created typed literal.
    *
-   * @param modifier the const modifier associated with this literal
+   * @param constKeyword the token representing the 'const' keyword
    * @param typeArguments the type argument associated with this literal, or `null` if no type
    *          arguments were declared
    */
-  TypedLiteral.full(Token modifier, TypeArgumentList typeArguments) {
-    this._modifier = modifier;
+  TypedLiteral.full(Token constKeyword, TypeArgumentList typeArguments) {
+    this._constKeyword = constKeyword;
     this._typeArguments = becomeParentOf(typeArguments);
   }
 
   /**
    * Initialize a newly created typed literal.
    *
-   * @param modifier the const modifier associated with this literal
+   * @param constKeyword the token representing the 'const' keyword
    * @param typeArguments the type argument associated with this literal, or `null` if no type
    *          arguments were declared
    */
-  TypedLiteral({Token modifier, TypeArgumentList typeArguments}) : this.full(modifier, typeArguments);
+  TypedLiteral({Token constKeyword, TypeArgumentList typeArguments}) : this.full(constKeyword, typeArguments);
 
   /**
-   * Return the const modifier associated with this literal.
+   * Return the token representing the 'const' keyword.
    *
-   * @return the const modifier associated with this literal
+   * @return the token representing the 'const' keyword
    */
-  Token get modifier => _modifier;
+  Token get constKeyword => _constKeyword;
 
   /**
    * Return the type argument associated with this literal, or `null` if no type arguments
@@ -14368,12 +14470,12 @@
   TypeArgumentList get typeArguments => _typeArguments;
 
   /**
-   * Set the modifiers associated with this literal to the given modifiers.
+   * Set the token representing the 'const' keyword to the given keyword.
    *
-   * @param modifiers the modifiers associated with this literal
+   * @param keyword the token representing the 'const' keyword
    */
-  void set modifier(Token modifier2) {
-    this._modifier = modifier2;
+  void set constKeyword(Token keyword) {
+    this._constKeyword = keyword;
   }
 
   /**
@@ -14384,7 +14486,7 @@
   void set typeArguments(TypeArgumentList typeArguments2) {
     this._typeArguments = typeArguments2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_typeArguments, visitor);
   }
 }
@@ -14452,7 +14554,7 @@
   void set uri(StringLiteral uri2) {
     this._uri = becomeParentOf(uri2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_uri, visitor);
   }
@@ -14531,7 +14633,7 @@
     }
     return comment;
   }
-  VariableElement get element => _name != null ? (_name.element as VariableElement) : null;
+  VariableElement get element => _name != null ? (_name.staticElement as VariableElement) : null;
   Token get endToken {
     if (_initializer != null) {
       return _initializer.endToken;
@@ -14610,7 +14712,7 @@
   void set name(SimpleIdentifier name2) {
     this._name = becomeParentOf(name2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
     safelyVisitChild(_initializer, visitor);
@@ -14736,7 +14838,7 @@
   void set type(TypeName typeName) {
     _type = becomeParentOf(typeName);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_type, visitor);
     _variables.accept(visitor);
   }
@@ -14825,7 +14927,7 @@
   void set variables(VariableDeclarationList variableList2) {
     this._variableList = becomeParentOf(variableList2);
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_variableList, visitor);
   }
 }
@@ -14977,7 +15079,7 @@
   void set rightParenthesis(Token rightParenthesis2) {
     this._rightParenthesis = rightParenthesis2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     safelyVisitChild(_condition, visitor);
     safelyVisitChild(_body, visitor);
   }
@@ -15049,7 +15151,7 @@
   void set mixinKeyword(Token withKeyword2) {
     this._withKeyword = withKeyword2;
   }
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
     _mixinTypes.accept(visitor);
   }
 }
@@ -15213,7 +15315,7 @@
         }
       } else if (node.operator.type == TokenType.EQ_EQ) {
         if (leftOperand is bool && rightOperand is bool) {
-          return identical(((leftOperand as bool)), ((rightOperand as bool)));
+          return identical(leftOperand as bool, rightOperand as bool);
         } else if (leftOperand is int && rightOperand is int) {
           return ((leftOperand as int)) == rightOperand;
         } else if (leftOperand is double && rightOperand is double) {
@@ -15223,15 +15325,15 @@
         }
       } else if (node.operator.type == TokenType.GT) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)).compareTo((rightOperand as int)) > 0;
+          return ((leftOperand as int)).compareTo(rightOperand as int) > 0;
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)).compareTo((rightOperand as double)) > 0;
+          return ((leftOperand as double)).compareTo(rightOperand as double) > 0;
         }
       } else if (node.operator.type == TokenType.GT_EQ) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)).compareTo((rightOperand as int)) >= 0;
+          return ((leftOperand as int)).compareTo(rightOperand as int) >= 0;
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)).compareTo((rightOperand as double)) >= 0;
+          return ((leftOperand as double)).compareTo(rightOperand as double) >= 0;
         }
       } else if (node.operator.type == TokenType.GT_GT) {
         if (leftOperand is int && rightOperand is int) {
@@ -15239,15 +15341,15 @@
         }
       } else if (node.operator.type == TokenType.LT) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)).compareTo((rightOperand as int)) < 0;
+          return ((leftOperand as int)).compareTo(rightOperand as int) < 0;
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)).compareTo((rightOperand as double)) < 0;
+          return ((leftOperand as double)).compareTo(rightOperand as double) < 0;
         }
       } else if (node.operator.type == TokenType.LT_EQ) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)).compareTo((rightOperand as int)) <= 0;
+          return ((leftOperand as int)).compareTo(rightOperand as int) <= 0;
         } else if (leftOperand is double && rightOperand is double) {
-          return ((leftOperand as double)).compareTo((rightOperand as double)) <= 0;
+          return ((leftOperand as double)).compareTo(rightOperand as double) <= 0;
         }
       } else if (node.operator.type == TokenType.LT_LT) {
         if (leftOperand is int && rightOperand is int) {
@@ -15261,7 +15363,7 @@
         }
       } else if (node.operator.type == TokenType.PERCENT) {
         if (leftOperand is int && rightOperand is int) {
-          return ((leftOperand as int)).remainder((rightOperand as int));
+          return ((leftOperand as int)).remainder(rightOperand as int);
         } else if (leftOperand is double && rightOperand is double) {
           return ((leftOperand as double)) % ((rightOperand as double));
         }
@@ -15447,9 +15549,9 @@
       if (identical(returnType, node)) {
         SimpleIdentifier name = decl.name;
         if (name != null) {
-          return name.element;
+          return name.bestElement;
         }
-        Element element = node.element;
+        Element element = node.bestElement;
         if (element is ClassElement) {
           return ((element as ClassElement)).unnamedConstructor;
         }
@@ -15464,7 +15566,7 @@
         }
       }
     }
-    Element element = node.element;
+    Element element = node.bestElement;
     if (element == null) {
       element = node.staticElement;
     }
@@ -15472,12 +15574,12 @@
   }
   Element visitImportDirective(ImportDirective node) => node.element;
   Element visitIndexExpression(IndexExpression node) => node.bestElement;
-  Element visitInstanceCreationExpression(InstanceCreationExpression node) => node.element;
+  Element visitInstanceCreationExpression(InstanceCreationExpression node) => node.staticElement;
   Element visitLibraryDirective(LibraryDirective node) => node.element;
   Element visitMethodDeclaration(MethodDeclaration node) => node.element;
-  Element visitMethodInvocation(MethodInvocation node) => node.methodName.element;
+  Element visitMethodInvocation(MethodInvocation node) => node.methodName.bestElement;
   Element visitPostfixExpression(PostfixExpression node) => node.bestElement;
-  Element visitPrefixedIdentifier(PrefixedIdentifier node) => node.element;
+  Element visitPrefixedIdentifier(PrefixedIdentifier node) => node.bestElement;
   Element visitPrefixExpression(PrefixExpression node) => node.bestElement;
   Element visitStringLiteral(StringLiteral node) {
     ASTNode parent = node.parent;
@@ -16530,7 +16632,7 @@
     return null;
   }
   Object visitFieldDeclaration(FieldDeclaration node) {
-    visit5(node.keyword, " ");
+    visit5(node.staticKeyword, " ");
     visit(node.fields);
     _writer.print(";");
     return null;
@@ -16726,8 +16828,8 @@
     return null;
   }
   Object visitListLiteral(ListLiteral node) {
-    if (node.modifier != null) {
-      _writer.print(node.modifier.lexeme);
+    if (node.constKeyword != null) {
+      _writer.print(node.constKeyword.lexeme);
       _writer.print(' ');
     }
     visit2(node.typeArguments, " ");
@@ -16737,8 +16839,8 @@
     return null;
   }
   Object visitMapLiteral(MapLiteral node) {
-    if (node.modifier != null) {
-      _writer.print(node.modifier.lexeme);
+    if (node.constKeyword != null) {
+      _writer.print(node.constKeyword.lexeme);
       _writer.print(' ');
     }
     visit2(node.typeArguments, " ");
@@ -16948,7 +17050,7 @@
     _writer.print("try ");
     visit(node.body);
     visitList4(" ", node.catchClauses, " ");
-    visit3(" finally ", node.finallyClause);
+    visit3(" finally ", node.finallyBlock);
     return null;
   }
   Object visitTypeArgumentList(TypeArgumentList node) {
@@ -17194,7 +17296,7 @@
   ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node) => new ExpressionFunctionBody.full(node.functionDefinition, clone2(node.expression), node.semicolon);
   ExpressionStatement visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement.full(clone2(node.expression), node.semicolon);
   ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause.full(node.keyword, clone2(node.superclass));
-  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration.full(clone2(node.documentationComment), clone3(node.metadata), node.keyword, clone2(node.fields), node.semicolon);
+  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration.full(clone2(node.documentationComment), clone3(node.metadata), node.staticKeyword, clone2(node.fields), node.semicolon);
   FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) => new FieldFormalParameter.full(clone2(node.documentationComment), clone3(node.metadata), node.keyword, clone2(node.type), node.thisToken, node.period, clone2(node.identifier), clone2(node.parameters));
   ForEachStatement visitForEachStatement(ForEachStatement node) => new ForEachStatement.full(node.forKeyword, node.leftParenthesis, clone2(node.loopVariable), node.inKeyword, clone2(node.iterator), node.rightParenthesis, clone2(node.body));
   FormalParameterList visitFormalParameterList(FormalParameterList node) => new FormalParameterList.full(node.leftParenthesis, clone3(node.parameters), node.leftDelimiter, node.rightDelimiter, node.rightParenthesis);
@@ -17226,8 +17328,8 @@
   LabeledStatement visitLabeledStatement(LabeledStatement node) => new LabeledStatement.full(clone3(node.labels), clone2(node.statement));
   LibraryDirective visitLibraryDirective(LibraryDirective node) => new LibraryDirective.full(clone2(node.documentationComment), clone3(node.metadata), node.libraryToken, clone2(node.name), node.semicolon);
   LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) => new LibraryIdentifier.full(clone3(node.components));
-  ListLiteral visitListLiteral(ListLiteral node) => new ListLiteral.full(node.modifier, clone2(node.typeArguments), node.leftBracket, clone3(node.elements), node.rightBracket);
-  MapLiteral visitMapLiteral(MapLiteral node) => new MapLiteral.full(node.modifier, clone2(node.typeArguments), node.leftBracket, clone3(node.entries), node.rightBracket);
+  ListLiteral visitListLiteral(ListLiteral node) => new ListLiteral.full(node.constKeyword, clone2(node.typeArguments), node.leftBracket, clone3(node.elements), node.rightBracket);
+  MapLiteral visitMapLiteral(MapLiteral node) => new MapLiteral.full(node.constKeyword, clone2(node.typeArguments), node.leftBracket, clone3(node.entries), node.rightBracket);
   MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) => new MapLiteralEntry.full(clone2(node.key), node.separator, clone2(node.value));
   MethodDeclaration visitMethodDeclaration(MethodDeclaration node) => new MethodDeclaration.full(clone2(node.documentationComment), clone3(node.metadata), node.externalKeyword, node.modifierKeyword, clone2(node.returnType), node.propertyKeyword, node.operatorKeyword, clone2(node.name), clone2(node.parameters), clone2(node.body));
   MethodInvocation visitMethodInvocation(MethodInvocation node) => new MethodInvocation.full(clone2(node.target), node.period, clone2(node.methodName), clone2(node.argumentList));
@@ -17260,7 +17362,7 @@
   ThisExpression visitThisExpression(ThisExpression node) => new ThisExpression.full(node.keyword);
   ThrowExpression visitThrowExpression(ThrowExpression node) => new ThrowExpression.full(node.keyword, clone2(node.expression));
   TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration.full(clone2(node.documentationComment), clone3(node.metadata), clone2(node.variables), node.semicolon);
-  TryStatement visitTryStatement(TryStatement node) => new TryStatement.full(node.tryKeyword, clone2(node.body), clone3(node.catchClauses), node.finallyKeyword, clone2(node.finallyClause));
+  TryStatement visitTryStatement(TryStatement node) => new TryStatement.full(node.tryKeyword, clone2(node.body), clone3(node.catchClauses), node.finallyKeyword, clone2(node.finallyBlock));
   TypeArgumentList visitTypeArgumentList(TypeArgumentList node) => new TypeArgumentList.full(node.leftBracket, clone3(node.arguments), node.rightBracket);
   TypeName visitTypeName(TypeName node) => new TypeName.full(clone2(node.name), clone2(node.typeArguments));
   TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter.full(clone2(node.documentationComment), clone3(node.metadata), clone2(node.name), node.keyword, clone2(node.bound));
@@ -17279,7 +17381,7 @@
   List clone3(NodeList nodes) {
     List clonedNodes = new List();
     for (ASTNode node in nodes) {
-      clonedNodes.add((node.accept(this) as ASTNode));
+      clonedNodes.add(node.accept(this) as ASTNode);
     }
     return clonedNodes;
   }
@@ -17347,7 +17449,7 @@
     return super.visitFunctionDeclarationStatement(node);
   }
   Object visitFunctionExpression(FunctionExpression node) {
-    if (_immediateChild != node.parameters) {
+    if (node.parameters != null && _immediateChild != node.parameters) {
       addParameters(node.parameters.parameters);
     }
     return super.visitFunctionExpression(node);
diff --git a/pkg/analyzer_experimental/lib/src/generated/constant.dart b/pkg/analyzer_experimental/lib/src/generated/constant.dart
index bb5a292..176f8b3 100644
--- a/pkg/analyzer_experimental/lib/src/generated/constant.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/constant.dart
@@ -379,7 +379,7 @@
     if (!node.isConst) {
       return error(node, null);
     }
-    ConstructorElement constructor = node.element;
+    ConstructorElement constructor = node.staticElement;
     if (constructor != null && constructor.isConst) {
       node.argumentList.accept(this);
       return ValidResult.RESULT_OBJECT;
@@ -393,7 +393,7 @@
   }
   EvaluationResultImpl visitInterpolationString(InterpolationString node) => new ValidResult(node.value);
   EvaluationResultImpl visitListLiteral(ListLiteral node) {
-    if (node.modifier == null) {
+    if (node.constKeyword == null) {
       return new ErrorResult.con1(node, CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL);
     }
     ErrorResult result = null;
@@ -406,7 +406,7 @@
     return ValidResult.RESULT_OBJECT;
   }
   EvaluationResultImpl visitMapLiteral(MapLiteral node) {
-    if (node.modifier == null) {
+    if (node.constKeyword == null) {
       return new ErrorResult.con1(node, CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL);
     }
     ErrorResult result = null;
@@ -420,7 +420,7 @@
     return ValidResult.RESULT_OBJECT;
   }
   EvaluationResultImpl visitMethodInvocation(MethodInvocation node) {
-    Element element = node.methodName.element;
+    Element element = node.methodName.staticElement;
     if (element is FunctionElement) {
       FunctionElement function = element as FunctionElement;
       if (function.name == "identical") {
@@ -440,19 +440,20 @@
     }
     return error(node, null);
   }
+  EvaluationResultImpl visitNamedExpression(NamedExpression node) => node.expression.accept(this);
   EvaluationResultImpl visitNode(ASTNode node) => error(node, null);
   EvaluationResultImpl visitNullLiteral(NullLiteral node) => ValidResult.RESULT_NULL;
   EvaluationResultImpl visitParenthesizedExpression(ParenthesizedExpression node) => node.expression.accept(this);
   EvaluationResultImpl visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefixNode = node.prefix;
-    Element prefixElement = prefixNode.element;
+    Element prefixElement = prefixNode.staticElement;
     if (prefixElement is! PrefixElement) {
       EvaluationResultImpl prefixResult = prefixNode.accept(this);
       if (prefixResult is! ValidResult) {
         return error(node, null);
       }
     }
-    return getConstantValue(node, node.element);
+    return getConstantValue(node, node.staticElement);
   }
   EvaluationResultImpl visitPrefixExpression(PrefixExpression node) {
     EvaluationResultImpl operand = node.operand.accept(this);
@@ -471,8 +472,8 @@
     }
     return error(node, null);
   }
-  EvaluationResultImpl visitPropertyAccess(PropertyAccess node) => getConstantValue(node, node.propertyName.element);
-  EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) => getConstantValue(node, node.element);
+  EvaluationResultImpl visitPropertyAccess(PropertyAccess node) => getConstantValue(node, node.propertyName.staticElement);
+  EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) => getConstantValue(node, node.staticElement);
   EvaluationResultImpl visitSimpleStringLiteral(SimpleStringLiteral node) => new ValidResult(node.value);
   EvaluationResultImpl visitStringInterpolation(StringInterpolation node) {
     EvaluationResultImpl result = null;
@@ -534,7 +535,7 @@
   ErrorResult union(ErrorResult leftResult, EvaluationResultImpl rightResult) {
     if (rightResult is ErrorResult) {
       if (leftResult != null) {
-        return new ErrorResult.con2(leftResult, (rightResult as ErrorResult));
+        return new ErrorResult.con2(leftResult, rightResult as ErrorResult);
       } else {
         return rightResult as ErrorResult;
       }
@@ -939,7 +940,7 @@
     this._referenceGraph = referenceGraph;
   }
   Object visitSimpleIdentifier(SimpleIdentifier node) {
-    Element element = node.element;
+    Element element = node.staticElement;
     if (element is PropertyAccessorElement) {
       element = ((element as PropertyAccessorElement)).variable;
     }
@@ -1104,7 +1105,9 @@
     if (!isAnyNum || !leftOperand2.isAnyNum) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
     }
-    if (isSomeNum || leftOperand2.isSomeNum) {
+    if (isSomeInt || leftOperand2.isSomeInt) {
+      return RESULT_INT;
+    } else if (isSomeNum || leftOperand2.isSomeNum) {
       return RESULT_NUM;
     }
     Object leftValue = leftOperand2.value;
@@ -1254,19 +1257,19 @@
       return valueOf2(_value == null);
     } else if (leftValue is bool) {
       if (_value is bool) {
-        return valueOf2(identical(((leftValue as bool)), ((_value as bool))));
+        return valueOf2(identical(leftValue as bool, _value as bool));
       }
       return RESULT_FALSE;
     } else if (leftValue is int) {
       if (_value is int) {
         return valueOf2(((leftValue as int)) == _value);
       } else if (_value is double) {
-        return valueOf2(toDouble((leftValue as int)) == _value);
+        return valueOf2(toDouble(leftValue as int) == _value);
       }
       return RESULT_FALSE;
     } else if (leftValue is double) {
       if (_value is int) {
-        return valueOf2(((leftValue as double)) == toDouble((_value as int)));
+        return valueOf2(((leftValue as double)) == toDouble(_value as int));
       } else if (_value is double) {
         return valueOf2(((leftValue as double)) == _value);
       }
@@ -1295,7 +1298,7 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (_value is int) {
-        return valueOf2(((leftValue as int)).compareTo((_value as int)) >= 0);
+        return valueOf2(((leftValue as int)).compareTo(_value as int) >= 0);
       } else if (_value is double) {
         return valueOf2(((leftValue as int)).toDouble() >= ((_value as double)));
       }
@@ -1322,7 +1325,7 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (_value is int) {
-        return valueOf2(((leftValue as int)).compareTo((_value as int)) > 0);
+        return valueOf2(((leftValue as int)).compareTo(_value as int) > 0);
       } else if (_value is double) {
         return valueOf2(((leftValue as int)).toDouble() > ((_value as double)));
       }
@@ -1385,7 +1388,7 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (_value is int) {
-        return valueOf2(((leftValue as int)).compareTo((_value as int)) <= 0);
+        return valueOf2(((leftValue as int)).compareTo(_value as int) <= 0);
       } else if (_value is double) {
         return valueOf2(((leftValue as int)).toDouble() <= ((_value as double)));
       }
@@ -1412,7 +1415,7 @@
       return error(node.rightOperand);
     } else if (leftValue is int) {
       if (_value is int) {
-        return valueOf2(((leftValue as int)).compareTo((_value as int)) < 0);
+        return valueOf2(((leftValue as int)).compareTo(_value as int) < 0);
       } else if (_value is double) {
         return valueOf2(((leftValue as int)).toDouble() < ((_value as double)));
       }
@@ -1461,7 +1464,9 @@
     if (!isAnyNum || !leftOperand2.isAnyNum) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
     }
-    if (isSomeNum || leftOperand2.isSomeNum) {
+    if (isSomeInt || leftOperand2.isSomeInt) {
+      return RESULT_INT;
+    } else if (isSomeNum || leftOperand2.isSomeNum) {
       return RESULT_NUM;
     }
     Object leftValue = leftOperand2.value;
@@ -1501,12 +1506,12 @@
       if (_value is int) {
         return valueOf2(((leftValue as int)) != _value);
       } else if (_value is double) {
-        return valueOf2(toDouble((leftValue as int)) != _value);
+        return valueOf2(toDouble(leftValue as int) != _value);
       }
       return RESULT_TRUE;
     } else if (leftValue is double) {
       if (_value is int) {
-        return valueOf2(((leftValue as double)) != toDouble((_value as int)));
+        return valueOf2(((leftValue as double)) != toDouble(_value as int));
       } else if (_value is double) {
         return valueOf2(((leftValue as double)) != _value);
       }
@@ -1524,7 +1529,9 @@
     if (!isAnyNum || !leftOperand2.isAnyNum) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
     }
-    if (isSomeNum || leftOperand2.isSomeNum) {
+    if (isSomeInt || leftOperand2.isSomeInt) {
+      return RESULT_INT;
+    } else if (isSomeNum || leftOperand2.isSomeNum) {
       return RESULT_NUM;
     }
     Object leftValue = leftOperand2.value;
@@ -1537,7 +1544,7 @@
         if (((_value as int)) == 0) {
           return valueOf3(((leftValue as int)).toDouble() % ((_value as int)).toDouble());
         }
-        return valueOf(((leftValue as int)).remainder((_value as int)));
+        return valueOf(((leftValue as int)).remainder(_value as int));
       } else if (_value is double) {
         return valueOf3(((leftValue as int)).toDouble() % ((_value as double)));
       }
@@ -1603,7 +1610,9 @@
     if (!isAnyNum || !leftOperand2.isAnyNum) {
       return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
     }
-    if (isSomeNum || leftOperand2.isSomeNum) {
+    if (isSomeInt || leftOperand2.isSomeInt) {
+      return RESULT_INT;
+    } else if (isSomeNum || leftOperand2.isSomeNum) {
       return RESULT_NUM;
     }
     Object leftValue = leftOperand2.value;
diff --git a/pkg/analyzer_experimental/lib/src/generated/element.dart b/pkg/analyzer_experimental/lib/src/generated/element.dart
index 5df3e1e..254fdbd 100644
--- a/pkg/analyzer_experimental/lib/src/generated/element.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/element.dart
@@ -275,6 +275,14 @@
    * @return the type in which this member is defined
    */
   ClassElement get enclosingElement;
+
+  /**
+   * Return `true` if this element is a static element. A static element is an element that is
+   * not associated with a particular instance, but rather with an entire library or class.
+   *
+   * @return `true` if this executable element is a static element
+   */
+  bool get isStatic;
 }
 /**
  * The interface `CompilationUnitElement` defines the behavior of elements representing a
@@ -539,7 +547,7 @@
    *
    * @param visitor the visitor that will be used to visit the children of this element
    */
-  void visitChildren(ElementVisitor<Object> visitor);
+  void visitChildren(ElementVisitor visitor);
 }
 /**
  * The interface `ElementAnnotation` defines the behavior of objects representing a single
@@ -562,7 +570,7 @@
  *
  * @coverage dart.engine.element
  */
-class ElementKind implements Enum<ElementKind> {
+class ElementKind extends Enum<ElementKind> {
   static final ElementKind CLASS = new ElementKind('CLASS', 0, "class");
   static final ElementKind COMPILATION_UNIT = new ElementKind('COMPILATION_UNIT', 1, "compilation unit");
   static final ElementKind CONSTRUCTOR = new ElementKind('CONSTRUCTOR', 2, "constructor");
@@ -615,12 +623,6 @@
       TYPE_VARIABLE,
       UNIVERSE];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
    * Return the kind of the given element, or [ERROR] if the element is `null`. This is
    * a utility method that can reduce the need for null checks in other places.
@@ -645,7 +647,7 @@
    *
    * @param displayName the name displayed in the UI for this kind of element
    */
-  ElementKind(this.name, this.ordinal, String displayName) {
+  ElementKind(String name, int ordinal, String displayName) : super(name, ordinal) {
     this._displayName = displayName;
   }
 
@@ -655,9 +657,6 @@
    * @return the name of this [ElementKind] to display in UI.
    */
   String get displayName => _displayName;
-  int compareTo(ElementKind other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 /**
  * The interface `ElementLocation` defines the behavior of objects that represent the location
@@ -1557,11 +1556,11 @@
   R visitLibraryElement(LibraryElement element) => visitElement(element);
   R visitLocalElement(LocalElement element) {
     if (element is LocalVariableElement) {
-      return visitVariableElement((element as LocalVariableElement));
+      return visitVariableElement(element as LocalVariableElement);
     } else if (element is ParameterElement) {
-      return visitVariableElement((element as ParameterElement));
+      return visitVariableElement(element as ParameterElement);
     } else if (element is FunctionElement) {
-      return visitExecutableElement((element as FunctionElement));
+      return visitExecutableElement(element as FunctionElement);
     }
     return null;
   }
@@ -1711,6 +1710,48 @@
   R visitTypeVariableElement(TypeVariableElement element) => null;
 }
 /**
+ * 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]. Since 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 this identifier could not be resolved.
+   */
+  ExecutableElement _propagatedElement;
+
+  /**
+   * The element associated with this identifier based on static type information, or `null`
+   * if the AST structure has not been resolved or if this identifier could not be resolved.
+   */
+  ExecutableElement _staticElement;
+
+  /**
+   * Create the [AuxiliaryElements] with a static and propagated [ExecutableElement].
+   *
+   * @param staticElement the static element
+   * @param propagatedElement the propagated element
+   */
+  AuxiliaryElements(ExecutableElement staticElement, ExecutableElement propagatedElement) {
+    this._staticElement = staticElement;
+    this._propagatedElement = propagatedElement;
+  }
+
+  /**
+   * Get the propagated element.
+   */
+  ExecutableElement get propagatedElement => _propagatedElement;
+
+  /**
+   * Get the static element.
+   */
+  ExecutableElement get staticElement => _staticElement;
+}
+/**
  * Instances of the class `ClassElementImpl` implement a `ClassElement`.
  *
  * @coverage dart.engine.element
@@ -2121,7 +2162,7 @@
   void set validMixin(bool isValidMixin) {
     setModifier(Modifier.MIXIN, isValidMixin);
   }
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_accessors, visitor);
     safelyVisitChildren(_constructors, visitor);
@@ -2361,7 +2402,7 @@
   void set uri(String uri2) {
     this._uri = uri2;
   }
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_accessors, visitor);
     safelyVisitChildren(_functions, visitor);
@@ -2796,7 +2837,7 @@
     appendTo(builder);
     return builder.toString();
   }
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
   }
 
   /**
@@ -2836,7 +2877,7 @@
    * @param child the child to be visited
    * @param visitor the visitor to be used to visit the child
    */
-  void safelyVisitChild(Element child, ElementVisitor<Object> visitor) {
+  void safelyVisitChild(Element child, ElementVisitor visitor) {
     if (child != null) {
       child.accept(visitor);
     }
@@ -2848,7 +2889,7 @@
    * @param children the children to be visited
    * @param visitor the visitor being used to visit the children
    */
-  void safelyVisitChildren(List<Element> children, ElementVisitor<Object> visitor) {
+  void safelyVisitChildren(List<Element> children, ElementVisitor visitor) {
     if (children != null) {
       for (Element child in children) {
         child.accept(visitor);
@@ -3088,7 +3129,7 @@
     scriptLibrary2.enclosingElement = this;
     this._scriptLibrary = scriptLibrary2;
   }
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
     safelyVisitChild(_scriptLibrary, visitor);
   }
 }
@@ -3246,7 +3287,7 @@
   void set type(FunctionType type2) {
     this._type = type2;
   }
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_functions, visitor);
     safelyVisitChildren(_labels, visitor);
@@ -3641,7 +3682,7 @@
   void shareTypeVariables(List<TypeVariableElement> typeVariables2) {
     this._typeVariables = typeVariables2;
   }
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_parameters, visitor);
     safelyVisitChildren(_typeVariables, visitor);
@@ -3779,7 +3820,7 @@
   void set source(Source source2) {
     this._source = source2;
   }
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_scripts, visitor);
   }
@@ -3887,7 +3928,7 @@
   void set uri(String uri2) {
     this._uri = uri2;
   }
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_prefix, visitor);
   }
@@ -4183,7 +4224,7 @@
     }
     this._parts = parts2;
   }
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_definingCompilationUnit, visitor);
     safelyVisitChildren(_exports, visitor);
@@ -4357,7 +4398,7 @@
  *
  * @coverage dart.engine.element
  */
-class Modifier implements Enum<Modifier> {
+class Modifier extends Enum<Modifier> {
   static final Modifier ABSTRACT = new Modifier('ABSTRACT', 0);
   static final Modifier CONST = new Modifier('CONST', 1);
   static final Modifier FACTORY = new Modifier('FACTORY', 2);
@@ -4381,16 +4422,7 @@
       STATIC,
       SYNTHETIC,
       TYPEDEF];
-
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-  Modifier(this.name, this.ordinal);
-  int compareTo(Modifier other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
+  Modifier(String name, int ordinal) : super(name, ordinal);
 }
 /**
  * Instances of the class `MultiplyDefinedElementImpl` represent a collection of elements that
@@ -4463,7 +4495,7 @@
     builder.append("]");
     return builder.toString();
   }
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
   }
 
   /**
@@ -4623,7 +4655,7 @@
     _visibleRangeOffset = offset;
     _visibleRangeLength = length;
   }
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_parameters, visitor);
   }
@@ -5094,7 +5126,7 @@
   void set type(Type2 type2) {
     this._type = type2;
   }
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_initializer, visitor);
   }
@@ -5219,7 +5251,7 @@
   FunctionType get type => substituteFor(baseElement.type);
   bool get isOperator => baseElement.isOperator;
   bool get isStatic => baseElement.isStatic;
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(baseElement.functions, visitor);
     safelyVisitChildren(labels, visitor);
@@ -5322,7 +5354,7 @@
   Source get source => _baseElement.source;
   bool isAccessibleIn(LibraryElement library) => _baseElement.isAccessibleIn(library);
   bool get isSynthetic => _baseElement.isSynthetic;
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
   }
 
   /**
@@ -5338,7 +5370,7 @@
    * @param child the child to be visited
    * @param visitor the visitor to be used to visit the child
    */
-  void safelyVisitChild(Element child, ElementVisitor<Object> visitor) {
+  void safelyVisitChild(Element child, ElementVisitor visitor) {
     if (child != null) {
       child.accept(visitor);
     }
@@ -5350,7 +5382,7 @@
    * @param children the children to be visited
    * @param visitor the visitor being used to visit the children
    */
-  void safelyVisitChildren(List<Element> children, ElementVisitor<Object> visitor) {
+  void safelyVisitChildren(List<Element> children, ElementVisitor visitor) {
     if (children != null) {
       for (Element child in children) {
         child.accept(visitor);
@@ -5498,11 +5530,11 @@
     if (definingType is InterfaceType) {
       InterfaceType definingInterfaceType = definingType as InterfaceType;
       if (element is ConstructorElement) {
-        return ConstructorMember.from((element as ConstructorElement), definingInterfaceType) as Element;
+        return ConstructorMember.from(element as ConstructorElement, definingInterfaceType) as Element;
       } else if (element is MethodElement) {
-        return MethodMember.from((element as MethodElement), definingInterfaceType) as Element;
+        return MethodMember.from(element as MethodElement, definingInterfaceType) as Element;
       } else if (element is PropertyAccessorElement) {
-        return PropertyAccessorMember.from((element as PropertyAccessorElement), definingInterfaceType) as Element;
+        return PropertyAccessorMember.from(element as PropertyAccessorElement, definingInterfaceType) as Element;
       }
     }
     return element;
@@ -5547,7 +5579,7 @@
     builder.append(right);
     return builder.toString();
   }
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(parameters, visitor);
   }
@@ -5599,13 +5631,41 @@
   PropertyInducingElement get variable {
     PropertyInducingElement variable = baseElement.variable;
     if (variable is FieldElement) {
-      return FieldMember.from(((variable as FieldElement)), definingType);
+      return FieldMember.from(variable as FieldElement, definingType);
     }
     return variable;
   }
   bool get isAbstract => baseElement.isAbstract;
   bool get isGetter => baseElement.isGetter;
   bool get isSetter => baseElement.isSetter;
+  String toString() {
+    PropertyAccessorElement baseElement = this.baseElement;
+    List<ParameterElement> parameters = this.parameters;
+    FunctionType type = this.type;
+    JavaStringBuilder builder = new JavaStringBuilder();
+    if (isGetter) {
+      builder.append("get ");
+    } else {
+      builder.append("set ");
+    }
+    builder.append(baseElement.enclosingElement.displayName);
+    builder.append(".");
+    builder.append(baseElement.displayName);
+    builder.append("(");
+    int parameterCount = parameters.length;
+    for (int i = 0; i < parameterCount; i++) {
+      if (i > 0) {
+        builder.append(", ");
+      }
+      builder.append(parameters[i]).toString();
+    }
+    builder.append(")");
+    if (type != null) {
+      builder.append(" -> ");
+      builder.append(type.returnType);
+    }
+    return builder.toString();
+  }
   InterfaceType get definingType => super.definingType as InterfaceType;
 }
 /**
@@ -5630,7 +5690,7 @@
   Type2 get type => substituteFor(baseElement.type);
   bool get isConst => baseElement.isConst;
   bool get isFinal => baseElement.isFinal;
-  void visitChildren(ElementVisitor<Object> visitor) {
+  void visitChildren(ElementVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(baseElement.initializer, visitor);
   }
@@ -5908,6 +5968,7 @@
     }
     return element.hashCode;
   }
+  bool isAssignableTo(Type2 type) => this.isSubtypeOf(type);
   bool isSubtypeOf(Type2 type) {
     if (type == null) {
       return false;
@@ -6009,7 +6070,7 @@
       return this;
     }
     Element element = this.element;
-    FunctionTypeImpl newType = (element is ExecutableElement) ? new FunctionTypeImpl.con1((element as ExecutableElement)) : new FunctionTypeImpl.con2((element as FunctionTypeAliasElement));
+    FunctionTypeImpl newType = (element is ExecutableElement) ? new FunctionTypeImpl.con1(element as ExecutableElement) : new FunctionTypeImpl.con2(element as FunctionTypeAliasElement);
     newType.typeArguments = TypeImpl.substitute(_typeArguments, argumentTypes, parameterTypes);
     return newType;
   }
@@ -6461,7 +6522,7 @@
     } else if (type is! InterfaceType) {
       return false;
     }
-    return isMoreSpecificThan2((type as InterfaceType), new Set<ClassElement>());
+    return isMoreSpecificThan2(type as InterfaceType, new Set<ClassElement>());
   }
   bool get isObject => element.supertype == null;
   bool isSubtypeOf(Type2 type2) {
@@ -6481,7 +6542,7 @@
     } else if (this == type2) {
       return true;
     }
-    return isSubtypeOf2((type2 as InterfaceType), new Set<ClassElement>());
+    return isSubtypeOf2(type2 as InterfaceType, new Set<ClassElement>());
   }
   ConstructorElement lookUpConstructor(String constructorName, LibraryElement library) {
     ConstructorElement constructorElement;
@@ -6705,17 +6766,17 @@
     } else if (typeS.isDartCoreFunction && elementT.getMethod("call") != null) {
       return true;
     }
-    InterfaceType supertype = elementT.supertype;
+    InterfaceType supertype = superclass;
     if (supertype != null && ((supertype as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClasses)) {
       return true;
     }
-    List<InterfaceType> interfaceTypes = elementT.interfaces;
+    List<InterfaceType> interfaceTypes = interfaces;
     for (InterfaceType interfaceType in interfaceTypes) {
       if (((interfaceType as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClasses)) {
         return true;
       }
     }
-    List<InterfaceType> mixinTypes = elementT.mixins;
+    List<InterfaceType> mixinTypes = mixins;
     for (InterfaceType mixinType in mixinTypes) {
       if (((mixinType as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClasses)) {
         return true;
diff --git a/pkg/analyzer_experimental/lib/src/generated/engine.dart b/pkg/analyzer_experimental/lib/src/generated/engine.dart
index 1570f8c..909e4f7 100644
--- a/pkg/analyzer_experimental/lib/src/generated/engine.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/engine.dart
@@ -800,6 +800,181 @@
   }
 }
 /**
+ * Instances of the class `AnalysisCache` implement an LRU cache of information related to
+ * analysis.
+ */
+class AnalysisCache {
+
+  /**
+   * A table mapping the sources known to the context to the information known about the source.
+   */
+  Map<Source, SourceEntry> _sourceMap = new Map<Source, SourceEntry>();
+
+  /**
+   * The maximum number of sources for which AST structures should be kept in the cache.
+   */
+  int _maxCacheSize = 0;
+
+  /**
+   * A list containing the most recently accessed sources with the most recently used at the end of
+   * the list. When more sources are added than the maximum allowed then the least recently used
+   * source will be removed and will have it's cached AST structure flushed.
+   */
+  List<Source> _recentlyUsed;
+
+  /**
+   * An array containing sources for which data should not be flushed.
+   */
+  List<Source> _priorityOrder = Source.EMPTY_ARRAY;
+
+  /**
+   * The number of times that the flushing of information from the cache has been disabled without
+   * being re-enabled.
+   */
+  int _cacheRemovalCount = 0;
+
+  /**
+   * Initialize a newly created cache to maintain at most the given number of AST structures in the
+   * cache.
+   *
+   * @param maxCacheSize the maximum number of sources for which AST structures should be kept in
+   *          the cache
+   */
+  AnalysisCache(int maxCacheSize) {
+    this._maxCacheSize = maxCacheSize;
+    _recentlyUsed = new List<Source>();
+  }
+
+  /**
+   * Record that the given source was just accessed.
+   *
+   * @param source the source that was accessed
+   */
+  void accessed(Source source) {
+    if (_recentlyUsed.remove(source)) {
+      _recentlyUsed.add(source);
+      return;
+    }
+    if (_cacheRemovalCount == 0 && _recentlyUsed.length >= _maxCacheSize) {
+      flushAstFromCache();
+    }
+    _recentlyUsed.add(source);
+  }
+
+  /**
+   * Disable flushing information from the cache until [enableCacheRemoval] has been
+   * called.
+   */
+  void disableCacheRemoval() {
+    _cacheRemovalCount++;
+  }
+
+  /**
+   * Re-enable flushing information from the cache.
+   */
+  void enableCacheRemoval() {
+    if (_cacheRemovalCount > 0) {
+      _cacheRemovalCount--;
+    }
+    if (_cacheRemovalCount == 0) {
+      while (_recentlyUsed.length > _maxCacheSize) {
+        flushAstFromCache();
+      }
+    }
+  }
+
+  /**
+   * Return a set containing all of the map entries mapping sources to cache entries. Clients should
+   * not modify the returned set.
+   *
+   * @return a set containing all of the map entries mapping sources to cache entries
+   */
+  Set<MapEntry<Source, SourceEntry>> entrySet() => getMapEntrySet(_sourceMap);
+
+  /**
+   * Return the entry associated with the given source.
+   *
+   * @param source the source whose entry is to be returned
+   * @return the entry associated with the given source
+   */
+  SourceEntry get(Source source) => _sourceMap[source];
+
+  /**
+   * Return an array containing sources for which data should not be flushed.
+   *
+   * @return an array containing sources for which data should not be flushed
+   */
+  List<Source> get priorityOrder => _priorityOrder;
+
+  /**
+   * Associate the given entry with the given source.
+   *
+   * @param source the source with which the entry is to be associated
+   * @param entry the entry to be associated with the source
+   */
+  void put(Source source, SourceEntry entry) {
+    _sourceMap[source] = entry;
+  }
+
+  /**
+   * Set the sources for which data should not be flushed to the given array.
+   *
+   * @param sources the sources for which data should not be flushed
+   */
+  void set priorityOrder(List<Source> sources) {
+    _priorityOrder = sources;
+  }
+
+  /**
+   * Flush one AST structure from the cache.
+   */
+  void flushAstFromCache() {
+    Source removedSource = removeAstToFlush();
+    SourceEntry sourceEntry = _sourceMap[removedSource];
+    if (sourceEntry is HtmlEntry) {
+      HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
+      htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.FLUSHED);
+      _sourceMap[removedSource] = htmlCopy;
+    } else if (sourceEntry is DartEntry) {
+      DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
+      dartCopy.flushAstStructures();
+      _sourceMap[removedSource] = dartCopy;
+    }
+  }
+
+  /**
+   * Return `true` if the given source is in the array of priority sources.
+   *
+   * @return `true` if the given source is in the array of priority sources
+   */
+  bool isPrioritySource(Source source) {
+    for (Source prioritySource in _priorityOrder) {
+      if (source == prioritySource) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Remove and return one source from the list of recently used sources whose AST structure can be
+   * flushed from the cache. The source that will be returned will be the source that has been
+   * unreferenced for the longest period of time but that is not a priority for analysis.
+   *
+   * @return the source that was removed
+   */
+  Source removeAstToFlush() {
+    for (int i = 0; i < _recentlyUsed.length; i++) {
+      Source source = _recentlyUsed[i];
+      if (!isPrioritySource(source)) {
+        return _recentlyUsed.removeAt(i);
+      }
+    }
+    AnalysisEngine.instance.logger.logError2("Internal error: The number of priority sources (${_priorityOrder.length}) is greater than the maximum cache size (${_maxCacheSize})", new JavaException());
+    return _recentlyUsed.removeAt(0);
+  }
+}
+/**
  * The interface `DartEntry` defines the behavior of objects that maintain the information
  * cached by an analysis context about an individual Dart file.
  *
@@ -912,7 +1087,7 @@
    *          context for the data
    * @return the value of the data represented by the given descriptor and library
    */
-  CacheState getState2(DataDescriptor<Object> descriptor, Source librarySource);
+  CacheState getState2(DataDescriptor descriptor, Source librarySource);
 
   /**
    * Return the value of the data represented by the given descriptor in the context of the given
@@ -949,6 +1124,12 @@
   CacheState _parsedUnitState = CacheState.INVALID;
 
   /**
+   * A flag indicating whether the parsed AST structure has been accessed since it was set. This is
+   * used to determine whether the structure needs to be copied before it is resolved.
+   */
+  bool _parsedUnitAccessed = false;
+
+  /**
    * The parsed compilation unit, or `null` if the parsed compilation unit is not currently
    * cached.
    */
@@ -1049,6 +1230,18 @@
    * If the library is not "client code", then it is referenced as "server code".
    */
   static int _CLIENT_CODE = 1 << 2;
+
+  /**
+   * Flush any AST structures being maintained by this entry.
+   */
+  void flushAstStructures() {
+    if (identical(_parsedUnitState, CacheState.VALID)) {
+      _parsedUnitState = CacheState.FLUSHED;
+      _parsedUnitAccessed = false;
+      _parsedUnit = null;
+    }
+    _resolutionState.flushAstStructures();
+  }
   List<AnalysisError> get allErrors {
     List<AnalysisError> errors = new List<AnalysisError>();
     for (AnalysisError error in _parseErrors) {
@@ -1072,6 +1265,7 @@
   }
   CompilationUnit get anyParsedCompilationUnit {
     if (identical(_parsedUnitState, CacheState.VALID)) {
+      _parsedUnitAccessed = true;
       return _parsedUnit;
     }
     return anyResolvedCompilationUnit;
@@ -1088,7 +1282,35 @@
     return null;
   }
   SourceKind get kind => _sourceKind;
-  CacheState getState(DataDescriptor<Object> descriptor) {
+
+  /**
+   * Return a compilation unit that has not been accessed by any other client and can therefore
+   * safely be modified by the reconciler.
+   *
+   * @return a compilation unit that can be modified by the reconciler
+   */
+  CompilationUnit get resolvableCompilationUnit {
+    if (identical(_parsedUnitState, CacheState.VALID)) {
+      if (_parsedUnitAccessed) {
+        return _parsedUnit.accept(new ASTCloner()) as CompilationUnit;
+      }
+      CompilationUnit unit = _parsedUnit;
+      _parsedUnitState = CacheState.FLUSHED;
+      _parsedUnitAccessed = false;
+      _parsedUnit = null;
+      return unit;
+    }
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (identical(state._resolvedUnitState, CacheState.VALID)) {
+        return state._resolvedUnit.accept(new ASTCloner()) as CompilationUnit;
+      }
+      state = state._nextState;
+    }
+    ;
+    return null;
+  }
+  CacheState getState(DataDescriptor descriptor) {
     if (identical(descriptor, DartEntry.ELEMENT)) {
       return _elementState;
     } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
@@ -1113,7 +1335,7 @@
       return super.getState(descriptor);
     }
   }
-  CacheState getState2(DataDescriptor<Object> descriptor, Source librarySource2) {
+  CacheState getState2(DataDescriptor descriptor, Source librarySource2) {
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
       if (librarySource2 == state._librarySource) {
@@ -1152,6 +1374,7 @@
     } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
       return _parseErrors as Object;
     } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
+      _parsedUnitAccessed = true;
       return _parsedUnit as Object;
     } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
       return _publicNamespace as Object;
@@ -1201,6 +1424,7 @@
     _parseErrors = AnalysisError.NO_ERRORS;
     _parseErrorsState = CacheState.INVALID;
     _parsedUnit = null;
+    _parsedUnitAccessed = false;
     _parsedUnitState = CacheState.INVALID;
     invalidateAllResolutionInformation();
   }
@@ -1237,6 +1461,7 @@
     _parseErrors = AnalysisError.NO_ERRORS;
     _parseErrorsState = CacheState.ERROR;
     _parsedUnit = null;
+    _parsedUnitAccessed = false;
     _parsedUnitState = CacheState.ERROR;
     _exportedLibraries = Source.EMPTY_ARRAY;
     _exportedLibrariesState = CacheState.ERROR;
@@ -1336,6 +1561,7 @@
     }
     if (_parsedUnitState != CacheState.VALID) {
       _parsedUnit = unit;
+      _parsedUnitAccessed = false;
       _parsedUnitState = CacheState.VALID;
     }
     if (_parseErrorsState != CacheState.VALID) {
@@ -1343,7 +1569,7 @@
       _parseErrorsState = CacheState.VALID;
     }
   }
-  void setState(DataDescriptor<Object> descriptor, CacheState state) {
+  void setState(DataDescriptor descriptor, CacheState state) {
     if (identical(descriptor, DartEntry.ELEMENT)) {
       _element = updatedValue(state, _element, null);
       _elementState = state;
@@ -1366,7 +1592,11 @@
       _parseErrors = updatedValue(state, _parseErrors, AnalysisError.NO_ERRORS);
       _parseErrorsState = state;
     } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
-      _parsedUnit = updatedValue(state, _parsedUnit, null);
+      CompilationUnit newUnit = updatedValue(state, _parsedUnit, null);
+      if (newUnit != _parsedUnit) {
+        _parsedUnitAccessed = false;
+      }
+      _parsedUnit = newUnit;
       _parsedUnitState = state;
     } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
       _publicNamespace = updatedValue(state, _publicNamespace, null);
@@ -1388,7 +1618,7 @@
    *          context for the data
    * @param cacheState the new state of the data represented by the given descriptor
    */
-  void setState2(DataDescriptor<Object> descriptor, Source librarySource, CacheState cacheState) {
+  void setState2(DataDescriptor descriptor, Source librarySource, CacheState cacheState) {
     DartEntryImpl_ResolutionState state = getOrCreateResolutionState(librarySource);
     if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
       state._resolutionErrors = updatedValue(cacheState, state._resolutionErrors, AnalysisError.NO_ERRORS);
@@ -1435,6 +1665,7 @@
       _parseErrorsState = CacheState.VALID;
     } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
       _parsedUnit = value as CompilationUnit;
+      _parsedUnitAccessed = false;
       _parsedUnitState = CacheState.VALID;
     } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
       _publicNamespace = value as Namespace;
@@ -1476,6 +1707,7 @@
     _sourceKind = other._sourceKind;
     _parsedUnitState = other._parsedUnitState;
     _parsedUnit = other._parsedUnit;
+    _parsedUnitAccessed = other._parsedUnitAccessed;
     _parseErrorsState = other._parseErrorsState;
     _parseErrors = other._parseErrors;
     _includedPartsState = other._includedPartsState;
@@ -1500,7 +1732,9 @@
     builder.append(_sourceKindState);
     builder.append("; parsedUnit = ");
     builder.append(_parsedUnitState);
-    builder.append("; parseErrors = ");
+    builder.append(" (");
+    builder.append(_parsedUnitAccessed ? "T" : "F");
+    builder.append("); parseErrors = ");
     builder.append(_parseErrorsState);
     builder.append("; exportedLibraries = ");
     builder.append(_exportedLibrariesState);
@@ -1633,6 +1867,19 @@
   }
 
   /**
+   * Flush any AST structures being maintained by this state.
+   */
+  void flushAstStructures() {
+    if (identical(_resolvedUnitState, CacheState.VALID)) {
+      _resolvedUnitState = CacheState.FLUSHED;
+      _resolvedUnit = null;
+    }
+    if (_nextState != null) {
+      _nextState.flushAstStructures();
+    }
+  }
+
+  /**
    * Invalidate all of the resolution information associated with the compilation unit.
    */
   void invalidateAllResolutionInformation() {
@@ -1817,7 +2064,7 @@
     return new List.from(errors);
   }
   SourceKind get kind => SourceKind.HTML;
-  CacheState getState(DataDescriptor<Object> descriptor) {
+  CacheState getState(DataDescriptor descriptor) {
     if (identical(descriptor, HtmlEntry.ELEMENT)) {
       return _elementState;
     } else if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
@@ -1862,7 +2109,7 @@
     _hints = AnalysisError.NO_ERRORS;
     _hintsState = CacheState.INVALID;
   }
-  void setState(DataDescriptor<Object> descriptor, CacheState state) {
+  void setState(DataDescriptor descriptor, CacheState state) {
     if (identical(descriptor, HtmlEntry.ELEMENT)) {
       _element = updatedValue(state, _element, null);
       _elementState = state;
@@ -1966,7 +2213,7 @@
    * @param descriptor the descriptor representing the data whose state is to be returned
    * @return the state of the data represented by the given descriptor
    */
-  CacheState getState(DataDescriptor<Object> descriptor);
+  CacheState getState(DataDescriptor descriptor);
 
   /**
    * Return the value of the data represented by the given descriptor, or `null` if the data
@@ -2010,7 +2257,7 @@
    */
   LineInfo _lineInfo;
   int get modificationTime => _modificationTime;
-  CacheState getState(DataDescriptor<Object> descriptor) {
+  CacheState getState(DataDescriptor descriptor) {
     if (identical(descriptor, SourceEntry.LINE_INFO)) {
       return _lineInfoState;
     } else {
@@ -2041,7 +2288,7 @@
    * @param descriptor the descriptor representing the data whose state is to be set
    * @param the new state of the data represented by the given descriptor
    */
-  void setState(DataDescriptor<Object> descriptor, CacheState state) {
+  void setState(DataDescriptor descriptor, CacheState state) {
     if (identical(descriptor, SourceEntry.LINE_INFO)) {
       _lineInfo = updatedValue(state, _lineInfo, null);
       _lineInfoState = state;
@@ -2121,7 +2368,7 @@
     Iterable<AnalysisContentStatistics_CacheRow> items = _dataMap.values;
     return new List.from(items);
   }
-  void putCacheItem(DataDescriptor<Object> rowDesc, CacheState state) {
+  void putCacheItem(DataDescriptor rowDesc, CacheState state) {
     String rowName = rowDesc.toString();
     AnalysisContentStatisticsImpl_CacheRowImpl row = _dataMap[rowName] as AnalysisContentStatisticsImpl_CacheRowImpl;
     if (row == null) {
@@ -2178,7 +2425,7 @@
    * Helper for [getStatistics], puts the library-specific state into the given statistics
    * object.
    */
-  static void putStatCacheItem(AnalysisContentStatisticsImpl statistics, DartEntry dartEntry, Source librarySource, DataDescriptor<Object> key) {
+  static void putStatCacheItem(AnalysisContentStatisticsImpl statistics, DartEntry dartEntry, Source librarySource, DataDescriptor key) {
     statistics.putCacheItem(key, dartEntry.getState2(key, librarySource));
   }
 
@@ -2186,7 +2433,7 @@
    * Helper for [getStatistics], puts the library independent state into the given
    * statistics object.
    */
-  static void putStatCacheItem2(AnalysisContentStatisticsImpl statistics, SourceEntry entry, DataDescriptor<Object> key) {
+  static void putStatCacheItem2(AnalysisContentStatisticsImpl statistics, SourceEntry entry, DataDescriptor key) {
     statistics.putCacheItem(key, entry.getState(key));
   }
 
@@ -2380,7 +2627,7 @@
       return SourceKind.UNKNOWN;
     } else if (sourceEntry is DartEntry) {
       try {
-        return internalGetDartParseData(source, (sourceEntry as DartEntry), DartEntry.SOURCE_KIND);
+        return internalGetDartParseData(source, sourceEntry as DartEntry, DartEntry.SOURCE_KIND);
       } on AnalysisException catch (exception) {
         return SourceKind.UNKNOWN;
       }
@@ -2418,22 +2665,28 @@
     }
     return null;
   }
-  CompilationUnit computeResolvableCompilationUnit(Source source) {
-    DartEntry dartEntry = getReadableDartEntry(source);
-    if (dartEntry == null) {
-      return null;
-    }
-    CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
-    if (unit == null) {
-      try {
-        unit = parseCompilationUnit(source);
-      } on AnalysisException catch (exception) {
-        return null;
+  ResolvableCompilationUnit computeResolvableCompilationUnit(Source source) {
+    while (true) {
+      {
+        SourceEntry sourceEntry = getSourceEntry(source);
+        if (sourceEntry is! DartEntry) {
+          throw new AnalysisException.con1("computeResolvableCompilationUnit for non-Dart: ${source.fullName}");
+        }
+        DartEntry dartEntry = sourceEntry as DartEntry;
+        if (identical(dartEntry.getState(DartEntry.PARSED_UNIT), CacheState.ERROR)) {
+          throw new AnalysisException.con1("Internal error: computeResolvableCompilationUnit could not parse ${source.fullName}");
+        }
+        DartEntryImpl dartCopy = dartEntry.writableCopy;
+        CompilationUnit unit = dartCopy.resolvableCompilationUnit;
+        if (unit != null) {
+          _sourceMap[source] = dartCopy;
+          return new ResolvableCompilationUnit(dartCopy.modificationTime, unit);
+        }
       }
+      internalParseDart(source);
     }
-    return unit.accept(new ASTCloner()) as CompilationUnit;
   }
-  AnalysisContext extractContext(SourceContainer container) => extractContextInto(container, (AnalysisEngine.instance.createAnalysisContext() as InternalAnalysisContext));
+  AnalysisContext extractContext(SourceContainer container) => extractContextInto(container, AnalysisEngine.instance.createAnalysisContext() as InternalAnalysisContext);
   InternalAnalysisContext extractContextInto(SourceContainer container, InternalAnalysisContext newContext) {
     List<Source> sourcesToRemove = new List<Source>();
     {
@@ -2733,6 +2986,12 @@
     return false;
   }
   void mergeContext(AnalysisContext context) {
+    if (context is InstrumentedAnalysisContextImpl) {
+      context = ((context as InstrumentedAnalysisContextImpl)).basis;
+    }
+    if (context is! AnalysisContextImpl) {
+      return;
+    }
     {
       for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(((context as AnalysisContextImpl))._sourceMap)) {
         Source newSource = entry.getKey();
@@ -2812,7 +3071,8 @@
             Source coreLibrarySource = libraryElement.context.sourceFactory.forUri(DartSdk.DART_CORE);
             LibraryElement coreElement = computeLibraryElement(coreLibrarySource);
             TypeProvider typeProvider = new TypeProviderImpl(coreElement);
-            CompilationUnit unitAST = computeResolvableCompilationUnit(unitSource);
+            ResolvableCompilationUnit resolvableUnit = computeResolvableCompilationUnit(unitSource);
+            CompilationUnit unitAST = resolvableUnit.compilationUnit;
             new DeclarationResolver().resolve(unitAST, find(libraryElement, unitSource));
             RecordingErrorListener errorListener = new RecordingErrorListener();
             TypeResolverVisitor typeResolverVisitor = new TypeResolverVisitor.con2(libraryElement, unitSource, typeProvider, errorListener);
@@ -2820,6 +3080,11 @@
             InheritanceManager inheritanceManager = new InheritanceManager(libraryElement);
             ResolverVisitor resolverVisitor = new ResolverVisitor.con2(libraryElement, unitSource, typeProvider, inheritanceManager, errorListener);
             unitAST.accept(resolverVisitor);
+            for (ProxyConditionalAnalysisError conditionalCode in resolverVisitor.proxyConditionalAnalysisErrors) {
+              if (conditionalCode.shouldIncludeErrorCode()) {
+                resolverVisitor.reportError(conditionalCode.analysisError);
+              }
+            }
             ErrorReporter errorReporter = new ErrorReporter(errorListener, unitSource);
             ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, libraryElement, typeProvider, inheritanceManager);
             unitAST.accept(errorVerifier);
@@ -3332,8 +3597,8 @@
    * @param descriptor the descriptor representing the data to be returned
    * @return a cache entry containing the required data
    */
-  bool hasHtmlParseDataCached(HtmlEntry htmlEntry, List<DataDescriptor<Object>> descriptors) {
-    for (DataDescriptor<Object> descriptor in descriptors) {
+  bool hasHtmlParseDataCached(HtmlEntry htmlEntry, List<DataDescriptor> descriptors) {
+    for (DataDescriptor descriptor in descriptors) {
       CacheState state = htmlEntry.getState(descriptor);
       if (state != CacheState.VALID && state != CacheState.ERROR) {
         return false;
@@ -3354,7 +3619,7 @@
    * @throws AnalysisException if data could not be returned because the source could not be
    *           resolved
    */
-  DartEntry internalCacheDartParseData(Source source, DartEntry dartEntry, DataDescriptor<Object> descriptor) {
+  DartEntry internalCacheDartParseData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
     CacheState state = dartEntry.getState(descriptor);
     while (state != CacheState.ERROR && state != CacheState.VALID) {
       dartEntry = internalParseDart(source);
@@ -3376,7 +3641,7 @@
    * @return the requested data about the given source
    * @throws AnalysisException if data could not be returned because the source could not be parsed
    */
-  DartEntry internalCacheDartResolutionData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor<Object> descriptor) {
+  DartEntry internalCacheDartResolutionData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
     CacheState state = dartEntry.getState2(descriptor, librarySource);
     while (state != CacheState.ERROR && state != CacheState.VALID) {
       dartEntry = internalResolveDart(unitSource, librarySource);
@@ -3397,7 +3662,7 @@
    * @throws AnalysisException if data could not be returned because the source could not be
    *           resolved
    */
-  HtmlEntry internalCacheHtmlParseData(Source source, HtmlEntry htmlEntry, List<DataDescriptor<Object>> descriptors) {
+  HtmlEntry internalCacheHtmlParseData(Source source, HtmlEntry htmlEntry, List<DataDescriptor> descriptors) {
     while (!hasHtmlParseDataCached(htmlEntry, descriptors)) {
       htmlEntry = internalParseHtml(source);
     }
@@ -3537,19 +3802,19 @@
       Set<Source> includedSources = new Set<Source>();
       for (Directive directive in unit.directives) {
         if (directive is ExportDirective) {
-          Source exportSource = resolveSource(source, (directive as ExportDirective));
+          Source exportSource = resolveSource(source, directive as ExportDirective);
           if (exportSource != null) {
             javaSetAdd(exportedSources, exportSource);
           }
         } else if (directive is ImportDirective) {
-          Source importSource = resolveSource(source, (directive as ImportDirective));
+          Source importSource = resolveSource(source, directive as ImportDirective);
           if (importSource != null) {
             javaSetAdd(importedSources, importSource);
           }
         } else if (directive is LibraryDirective) {
           hasLibraryDirective = true;
         } else if (directive is PartDirective) {
-          Source partSource = resolveSource(source, (directive as PartDirective));
+          Source partSource = resolveSource(source, directive as PartDirective);
           if (partSource != null) {
             javaSetAdd(includedSources, partSource);
           }
@@ -3572,7 +3837,7 @@
       dartCopy.setValue(DartEntry.EXPORTED_LIBRARIES, toArray(exportedSources));
       dartCopy.setValue(DartEntry.IMPORTED_LIBRARIES, toArray(importedSources));
       dartCopy.setValue(DartEntry.INCLUDED_PARTS, toArray(includedSources));
-      return unit;
+      return dartCopy.getValue(DartEntry.PARSED_UNIT);
     } on AnalysisException catch (exception) {
       dartCopy.setState(SourceEntry.LINE_INFO, CacheState.ERROR);
       dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.ERROR);
@@ -3613,19 +3878,19 @@
       errors = errorListener.getErrors2(source);
       for (Directive directive in unit.directives) {
         if (directive is ExportDirective) {
-          Source exportSource = resolveSource(source, (directive as ExportDirective));
+          Source exportSource = resolveSource(source, directive as ExportDirective);
           if (exportSource != null) {
             javaSetAdd(exportedSources, exportSource);
           }
         } else if (directive is ImportDirective) {
-          Source importSource = resolveSource(source, (directive as ImportDirective));
+          Source importSource = resolveSource(source, directive as ImportDirective);
           if (importSource != null) {
             javaSetAdd(importedSources, importSource);
           }
         } else if (directive is LibraryDirective) {
           hasLibraryDirective = true;
         } else if (directive is PartDirective) {
-          Source partSource = resolveSource(source, (directive as PartDirective));
+          Source partSource = resolveSource(source, directive as PartDirective);
           if (partSource != null) {
             javaSetAdd(includedSources, partSource);
           }
@@ -3809,7 +4074,7 @@
       }
       resultTime = htmlEntry.modificationTime;
       HtmlUnitBuilder builder = new HtmlUnitBuilder(this);
-      element = builder.buildHtmlElement2(source, unit);
+      element = builder.buildHtmlElement2(source, resultTime, unit);
       resolutionErrors = builder.errorListener.getErrors2(source);
     } on AnalysisException catch (exception) {
       thrownException = exception;
@@ -4124,7 +4389,7 @@
       return null;
     }
     String uriContent = uriLiteral.stringValue.trim();
-    if (uriContent == null) {
+    if (uriContent == null || uriContent.isEmpty) {
       return null;
     }
     uriContent = Uri.encodeFull(uriContent);
@@ -4167,7 +4432,9 @@
     try {
       parseHtmlUnit(source);
     } on AnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logError2("Could not parse ${source.fullName}", exception);
+      if (exception.cause is! JavaIOException) {
+        AnalysisEngine.instance.logger.logError2("Could not parse ${source.fullName}", exception);
+      }
     }
   }
 
@@ -4515,21 +4782,25 @@
         if (javaStringEqualsIgnoreCase(attribute.name.lexeme, AnalysisContextImpl._ATTRIBUTE_SRC)) {
           scriptAttribute = attribute;
         } else if (javaStringEqualsIgnoreCase(attribute.name.lexeme, AnalysisContextImpl._ATTRIBUTE_TYPE)) {
-          if (javaStringEqualsIgnoreCase(attribute.text, AnalysisContextImpl._TYPE_DART)) {
+          String text = attribute.text;
+          if (text != null && javaStringEqualsIgnoreCase(text, AnalysisContextImpl._TYPE_DART)) {
             isDartScript = true;
           }
         }
       }
       if (isDartScript && scriptAttribute != null) {
-        try {
-          Uri uri = new Uri(path: scriptAttribute.text);
-          String fileName = uri.path;
-          Source librarySource = AnalysisContextImpl_this._sourceFactory.resolveUri(htmlSource, fileName);
-          if (librarySource.exists()) {
-            libraries.add(librarySource);
+        String text = scriptAttribute.text;
+        if (text != null) {
+          try {
+            Uri uri = new Uri(path: text);
+            String fileName = uri.path;
+            Source librarySource = AnalysisContextImpl_this._sourceFactory.resolveUri(htmlSource, fileName);
+            if (librarySource != null && librarySource.exists()) {
+              libraries.add(librarySource);
+            }
+          } catch (exception) {
+            AnalysisEngine.instance.logger.logInformation2("Invalid URI ('${text}') in script tag in '${htmlSource.fullName}'", exception);
           }
-        } catch (exception) {
-          AnalysisEngine.instance.logger.logInformation2("Invalid URL ('${scriptAttribute.text}') in script tag in '${htmlSource.fullName}'", exception);
         }
       }
     }
@@ -4606,7 +4877,7 @@
    * A flag indicating whether analysis is to use strict mode. In strict mode, error reporting is
    * based exclusively on the static type information.
    */
-  bool _strictMode = false;
+  bool _strictMode = true;
 
   /**
    * A flag indicating whether analysis is to generate hint results (e.g. type inference based
@@ -4646,7 +4917,7 @@
 /**
  * The enumeration `CacheState` defines the possible states of cached data.
  */
-class CacheState implements Enum<CacheState> {
+class CacheState extends Enum<CacheState> {
 
   /**
    * The data is not in the cache and the last time an attempt was made to compute the data an
@@ -4703,16 +4974,7 @@
    */
   static final CacheState VALID = new CacheState('VALID', 4);
   static final List<CacheState> values = [ERROR, FLUSHED, IN_PROCESS, INVALID, VALID];
-
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-  CacheState(this.name, this.ordinal);
-  int compareTo(CacheState other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
+  CacheState(String name, int ordinal) : super(name, ordinal);
 }
 /**
  * Instances of the class `ChangeNoticeImpl` represent a change to the analysis results
@@ -4883,7 +5145,7 @@
       return super.computeLineInfo(source);
     }
   }
-  CompilationUnit computeResolvableCompilationUnit(Source source) {
+  ResolvableCompilationUnit computeResolvableCompilationUnit(Source source) {
     if (source.isInSystemLibrary) {
       return _sdkAnalysisContext.computeResolvableCompilationUnit(source);
     } else {
@@ -5196,7 +5458,7 @@
       instrumentation.log();
     }
   }
-  CompilationUnit computeResolvableCompilationUnit(Source source) => _basis.computeResolvableCompilationUnit(source);
+  ResolvableCompilationUnit computeResolvableCompilationUnit(Source source) => _basis.computeResolvableCompilationUnit(source);
   AnalysisContext extractContext(SourceContainer container) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-extractContext");
     try {
@@ -5599,7 +5861,7 @@
    * @return the AST structure representing the content of the source
    * @throws AnalysisException if the analysis could not be performed
    */
-  CompilationUnit computeResolvableCompilationUnit(Source source);
+  ResolvableCompilationUnit computeResolvableCompilationUnit(Source source);
 
   /**
    * Initialize the specified context by removing the specified sources from the receiver and adding
@@ -5786,7 +6048,7 @@
   }
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     node.staticElement = null;
-    node.element = null;
+    node.propagatedElement = null;
     return super.visitSimpleIdentifier(node);
   }
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
@@ -5796,6 +6058,48 @@
   }
 }
 /**
+ * Instances of the class `ResolvableCompilationUnit` represent a compilation unit that is not
+ * referenced by any other objects and for which we have modification stamp information. It is used
+ * by the [LibraryResolver] to resolve a library.
+ */
+class ResolvableCompilationUnit {
+
+  /**
+   * The modification time of the source from which the AST was created.
+   */
+  int _modificationStamp = 0;
+
+  /**
+   * The AST that was created from the source.
+   */
+  CompilationUnit _unit;
+
+  /**
+   * Initialize a newly created holder to hold the given values.
+   *
+   * @param modificationStamp the modification time of the source from which the AST was created
+   * @param unit the AST that was created from the source
+   */
+  ResolvableCompilationUnit(int modificationStamp, CompilationUnit unit) {
+    this._modificationStamp = modificationStamp;
+    this._unit = unit;
+  }
+
+  /**
+   * Return the AST that was created from the source.
+   *
+   * @return the AST that was created from the source
+   */
+  CompilationUnit get compilationUnit => _unit;
+
+  /**
+   * Return the modification time of the source from which the AST was created.
+   *
+   * @return the modification time of the source from which the AST was created
+   */
+  int get modificationStamp => _modificationStamp;
+}
+/**
  * The interface `Logger` defines the behavior of objects that can be used to receive
  * information about errors within the analysis engine. Implementations usually write this
  * information to a file, but can also record the information for later use (such as during testing)
diff --git a/pkg/analyzer_experimental/lib/src/generated/error.dart b/pkg/analyzer_experimental/lib/src/generated/error.dart
index 22e3162..5dfba2f 100644
--- a/pkg/analyzer_experimental/lib/src/generated/error.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/error.dart
@@ -11,7 +11,7 @@
  *
  * @coverage dart.engine.error
  */
-class ErrorSeverity implements Enum<ErrorSeverity> {
+class ErrorSeverity extends Enum<ErrorSeverity> {
 
   /**
    * The severity representing a non-error. This is never used for any error code, but is useful for
@@ -37,12 +37,6 @@
   static final ErrorSeverity ERROR = new ErrorSeverity('ERROR', 3, "E", "error");
   static final List<ErrorSeverity> values = [NONE, SUGGESTION, WARNING, ERROR];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
    * The name of the severity used when producing machine output.
    */
@@ -59,7 +53,7 @@
    * @param machineCode the name of the severity used when producing machine output
    * @param displayName the name of the severity used when producing readable output
    */
-  ErrorSeverity(this.name, this.ordinal, String machineCode, String displayName) {
+  ErrorSeverity(String name, int ordinal, String machineCode, String displayName) : super(name, ordinal) {
     this._machineCode = machineCode;
     this._displayName = displayName;
   }
@@ -85,9 +79,6 @@
    * @return the most sever of this or the given severity
    */
   ErrorSeverity max(ErrorSeverity severity) => this.ordinal >= severity.ordinal ? this : severity;
-  int compareTo(ErrorSeverity other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 /**
  * Instances of the class `AnalysisErrorWithProperties`
@@ -283,6 +274,12 @@
   String _message;
 
   /**
+   * The correction to be displayed for this error, or `null` if there is no correction
+   * information for this error.
+   */
+  String _correction;
+
+  /**
    * The source in which the error occurred, or `null` if unknown.
    */
   Source _source;
@@ -299,6 +296,12 @@
   int _length = 0;
 
   /**
+   * A flag indicating whether this error can be shown to be a non-issue because of the result of
+   * type propagation.
+   */
+  bool _isStaticOnly2 = false;
+
+  /**
    * Initialize a newly created analysis error for the specified source. The error has no location
    * information.
    *
@@ -327,9 +330,21 @@
     this._length = length;
     this._errorCode = errorCode;
     this._message = JavaString.format(errorCode.message, arguments);
+    String correctionTemplate = errorCode.correction;
+    if (correctionTemplate != null) {
+      this._correction = JavaString.format(correctionTemplate, arguments);
+    }
   }
 
   /**
+   * Return 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.
+   *
+   * @return the template used to create the correction to be displayed for this error
+   */
+  String get correction => _correction;
+
+  /**
    * Return the error code associated with the error.
    *
    * @return the error code associated with the error
@@ -345,9 +360,10 @@
   int get length => _length;
 
   /**
-   * Return the localized error message.
+   * Return the message to be displayed for this error. The message should indicate what is wrong
+   * and why it is wrong.
    *
-   * @return the localized error message
+   * @return the message to be displayed for this error
    */
   String get message => _message;
 
@@ -382,6 +398,24 @@
   }
 
   /**
+   * Return `true` if this error can be shown to be a non-issue because of the result of type
+   * propagation.
+   *
+   * @return `true` if this error can be shown to be a non-issue
+   */
+  bool get isStaticOnly => _isStaticOnly2;
+
+  /**
+   * Set whether this error can be shown to be a non-issue because of the result of type propagation
+   * to the given value.
+   *
+   * @param isStaticOnly `true` if this error can be shown to be a non-issue
+   */
+  void set isStaticOnly(bool isStaticOnly2) {
+    this._isStaticOnly2 = isStaticOnly2;
+  }
+
+  /**
    * Set the source in which the error occurred to the given source.
    *
    * @param source the source in which the error occurred
@@ -405,7 +439,7 @@
  * The enumeration `ErrorProperty` defines the properties that can be associated with an
  * [AnalysisError].
  */
-class ErrorProperty implements Enum<ErrorProperty> {
+class ErrorProperty extends Enum<ErrorProperty> {
 
   /**
    * A property whose value is an array of [ExecutableElement] that should
@@ -413,34 +447,25 @@
    */
   static final ErrorProperty UNIMPLEMENTED_METHODS = new ErrorProperty('UNIMPLEMENTED_METHODS', 0);
   static final List<ErrorProperty> values = [UNIMPLEMENTED_METHODS];
-
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-  ErrorProperty(this.name, this.ordinal);
-  int compareTo(ErrorProperty other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
+  ErrorProperty(String name, int ordinal) : super(name, ordinal);
 }
 /**
  * The enumeration `HintCode` defines the hints and coding recommendations for best practices
  * which are not mentioned in the Dart Language Specification.
  */
-class HintCode implements Enum<HintCode>, ErrorCode {
+class HintCode extends Enum<HintCode> implements ErrorCode {
 
   /**
    * Dead code is code that is never reached, this can happen for instance if a statement follows a
    * return statement.
    */
-  static final HintCode DEAD_CODE = new HintCode('DEAD_CODE', 0, "Dead code");
+  static final HintCode DEAD_CODE = new HintCode.con1('DEAD_CODE', 0, "Dead code");
 
   /**
    * Dead code is code that is never reached. This case covers cases where the user has catch
    * clauses after `catch (e)` or `on Object catch (e)`.
    */
-  static final HintCode DEAD_CODE_CATCH_FOLLOWING_CATCH = new HintCode('DEAD_CODE_CATCH_FOLLOWING_CATCH', 1, "Dead code, catch clauses after a 'catch (e)' or an 'on Object catch (e)' are never reached");
+  static final HintCode DEAD_CODE_CATCH_FOLLOWING_CATCH = new HintCode.con1('DEAD_CODE_CATCH_FOLLOWING_CATCH', 1, "Dead code, catch clauses after a 'catch (e)' or an 'on Object catch (e)' are never reached");
 
   /**
    * Dead code is code that is never reached. This case covers cases where the user has an on-catch
@@ -449,53 +474,75 @@
    * @param subtypeName name of the subtype
    * @param supertypeName name of the supertype
    */
-  static final HintCode DEAD_CODE_ON_CATCH_SUBTYPE = new HintCode('DEAD_CODE_ON_CATCH_SUBTYPE', 2, "Dead code, this on-catch block will never be executed since '%s' is a subtype of '%s'");
+  static final HintCode DEAD_CODE_ON_CATCH_SUBTYPE = new HintCode.con1('DEAD_CODE_ON_CATCH_SUBTYPE', 2, "Dead code, this on-catch block will never be executed since '%s' is a subtype of '%s'");
 
   /**
    * Unused imports are imports which are never not used.
    */
-  static final HintCode UNUSED_IMPORT = new HintCode('UNUSED_IMPORT', 3, "Unused import");
+  static final HintCode UNUSED_IMPORT = new HintCode.con1('UNUSED_IMPORT', 3, "Unused import");
   static final List<HintCode> values = [
       DEAD_CODE,
       DEAD_CODE_CATCH_FOLLOWING_CATCH,
       DEAD_CODE_ON_CATCH_SUBTYPE,
       UNUSED_IMPORT];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
-   * The message template used to create the message to be displayed for this error.
+   * The template used to create the message to be displayed for this error.
    */
   String _message;
 
   /**
+   * The template used to create the correction to be displayed for this error, or `null` if
+   * there is no correction information for this error.
+   */
+  String correction3;
+
+  /**
    * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  HintCode(this.name, this.ordinal, String message) {
+  HintCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
     this._message = message;
   }
+
+  /**
+   * Initialize a newly created error code to have the given message and correction.
+   *
+   * @param message the template used to create the message to be displayed for the error
+   * @param correction the template used to create the correction to be displayed for the error
+   */
+  HintCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this._message = message;
+    this.correction3 = correction;
+  }
+  String get correction => correction3;
   ErrorSeverity get errorSeverity => ErrorType.HINT.severity;
   String get message => _message;
   ErrorType get type => ErrorType.HINT;
-  int compareTo(HintCode other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 /**
  * The interface `ErrorCode` defines the behavior common to objects representing error codes
  * associated with [AnalysisError].
  *
+ * Generally, we want to provide messages that consist of three sentences: 1. what is wrong, 2. why
+ * is it wrong, and 3. how do I fix it. However, we combine the first two in the result of
+ * [getMessage] and the last in the result of [getCorrection].
+ *
  * @coverage dart.engine.error
  */
 abstract class ErrorCode {
 
   /**
+   * 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.
+   *
+   * @return the template used to create the correction to be displayed for this error
+   */
+  String get correction;
+
+  /**
    * Return the severity of this error.
    *
    * @return the severity of this error
@@ -503,9 +550,10 @@
   ErrorSeverity get errorSeverity;
 
   /**
-   * Return the message template used to create the message to be displayed for this error.
+   * Return the template used to create the message to be displayed for this error. The message
+   * should indicate what is wrong and why it is wrong.
    *
-   * @return the message template used to create the message to be displayed for this error
+   * @return the template used to create the message to be displayed for this error
    */
   String get message;
 
@@ -521,7 +569,7 @@
  *
  * @coverage dart.engine.error
  */
-class ErrorType implements Enum<ErrorType> {
+class ErrorType extends Enum<ErrorType> {
 
   /**
    * Extra analysis run over the code to follow best practices, which are not in the Dart Language
@@ -565,12 +613,6 @@
       STATIC_TYPE_WARNING,
       SYNTACTIC_ERROR];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
    * The severity of this type of error.
    */
@@ -581,7 +623,7 @@
    *
    * @param severity the severity of this type of error
    */
-  ErrorType(this.name, this.ordinal, ErrorSeverity severity) {
+  ErrorType(String name, int ordinal, ErrorSeverity severity) : super(name, ordinal) {
     this._severity = severity;
   }
 
@@ -591,9 +633,6 @@
    * @return the severity of this type of error
    */
   ErrorSeverity get severity => _severity;
-  int compareTo(ErrorType other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 /**
  * The enumeration `CompileTimeErrorCode` defines the error codes used for compile time
@@ -603,7 +642,7 @@
  *
  * @coverage dart.engine.error
  */
-class CompileTimeErrorCode implements Enum<CompileTimeErrorCode>, ErrorCode {
+class CompileTimeErrorCode extends Enum<CompileTimeErrorCode> implements ErrorCode {
 
   /**
    * 14.2 Exports: It is a compile-time error if a name <i>N</i> is re-exported by a library
@@ -614,7 +653,7 @@
    * @param firstLibraryName the name of the first library that the type is found
    * @param secondLibraryName the name of the second library that the type is found
    */
-  static final CompileTimeErrorCode AMBIGUOUS_EXPORT = new CompileTimeErrorCode('AMBIGUOUS_EXPORT', 0, "The element '%s' is defined in the libraries '%s' and '%s'");
+  static final CompileTimeErrorCode AMBIGUOUS_EXPORT = new CompileTimeErrorCode.con1('AMBIGUOUS_EXPORT', 0, "The element '%s' is defined in the libraries '%s' and '%s'");
 
   /**
    * 12.33 Argument Definition Test: It is a compile time error if <i>v</i> does not denote a formal
@@ -622,7 +661,7 @@
    *
    * @param the name of the identifier in the argument definition test that is not a parameter
    */
-  static final CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER = new CompileTimeErrorCode('ARGUMENT_DEFINITION_TEST_NON_PARAMETER', 1, "'%s' is not a parameter");
+  static final CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER = new CompileTimeErrorCode.con1('ARGUMENT_DEFINITION_TEST_NON_PARAMETER', 1, "'%s' is not a parameter");
 
   /**
    * 12.14.2 Binding Actuals to Formals: In checked mode, it is a dynamic type error if
@@ -635,57 +674,57 @@
    * @param requiredCount the maximum number of positional arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static final CompileTimeErrorCode ARGUMENT_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode('ARGUMENT_TYPE_NOT_ASSIGNABLE', 2, "The argument type '%s' cannot be assigned to the parameter type '%s'");
+  static final CompileTimeErrorCode ARGUMENT_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode.con1('ARGUMENT_TYPE_NOT_ASSIGNABLE', 2, "The argument type '%s' cannot be assigned to the parameter type '%s'");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error to use a built-in identifier other than
    * dynamic as a type annotation.
    */
-  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE', 3, "The built-in identifier '%s' cannot be as a type");
+  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE = new CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE', 3, "The built-in identifier '%s' cannot be as a type");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_NAME = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE_NAME', 4, "The built-in identifier '%s' cannot be used as a type name");
+  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_NAME = new CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_NAME', 4, "The built-in identifier '%s' cannot be used as a type name");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME', 5, "The built-in identifier '%s' cannot be used as a type alias name");
+  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME = new CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME', 5, "The built-in identifier '%s' cannot be used as a type alias name");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME', 6, "The built-in identifier '%s' cannot be used as a type variable name");
+  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME = new CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME', 6, "The built-in identifier '%s' cannot be used as a type variable name");
 
   /**
    * 13.9 Switch: It is a compile-time error if the class <i>C</i> implements the operator
    * <i>==</i>.
    */
-  static final CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = new CompileTimeErrorCode('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 7, "The switch case expression type '%s' cannot override the == operator");
+  static final CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = new CompileTimeErrorCode.con1('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 7, "The switch case expression type '%s' cannot override the == operator");
 
   /**
    * 12.1 Constants: It is a compile-time error if evaluation of a compile-time constant would raise
    * an exception.
    */
-  static final CompileTimeErrorCode COMPILE_TIME_CONSTANT_RAISES_EXCEPTION = new CompileTimeErrorCode('COMPILE_TIME_CONSTANT_RAISES_EXCEPTION', 8, "");
+  static final CompileTimeErrorCode COMPILE_TIME_CONSTANT_RAISES_EXCEPTION = new CompileTimeErrorCode.con1('COMPILE_TIME_CONSTANT_RAISES_EXCEPTION', 8, "");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
    * name. This restriction holds regardless of whether the getter is defined explicitly or
    * implicitly, or whether the getter or the method are inherited or not.
    */
-  static final CompileTimeErrorCode CONFLICTING_GETTER_AND_METHOD = new CompileTimeErrorCode('CONFLICTING_GETTER_AND_METHOD', 9, "Class '%s' cannot have both getter '%s.%s' and method with the same name");
+  static final CompileTimeErrorCode CONFLICTING_GETTER_AND_METHOD = new CompileTimeErrorCode.con1('CONFLICTING_GETTER_AND_METHOD', 9, "Class '%s' cannot have both getter '%s.%s' and method with the same name");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
    * name. This restriction holds regardless of whether the getter is defined explicitly or
    * implicitly, or whether the getter or the method are inherited or not.
    */
-  static final CompileTimeErrorCode CONFLICTING_METHOD_AND_GETTER = new CompileTimeErrorCode('CONFLICTING_METHOD_AND_GETTER', 10, "Class '%s' cannot have both method '%s.%s' and getter with the same name");
+  static final CompileTimeErrorCode CONFLICTING_METHOD_AND_GETTER = new CompileTimeErrorCode.con1('CONFLICTING_METHOD_AND_GETTER', 10, "Class '%s' cannot have both method '%s.%s' and getter with the same name");
 
   /**
    * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
@@ -693,7 +732,7 @@
    * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
    * class.
    */
-  static final CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD = new CompileTimeErrorCode('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD', 11, "'%s' cannot be used to name a constructor and a field in this class");
+  static final CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD = new CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD', 11, "'%s' cannot be used to name a constructor and a field in this class");
 
   /**
    * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
@@ -701,13 +740,20 @@
    * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
    * class.
    */
-  static final CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD = new CompileTimeErrorCode('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD', 12, "'%s' cannot be used to name a constructor and a method in this class");
+  static final CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD = new CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD', 12, "'%s' cannot be used to name a constructor and a method in this class");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static final CompileTimeErrorCode CONST_CONSTRUCTOR_THROWS_EXCEPTION = new CompileTimeErrorCode('CONST_CONSTRUCTOR_THROWS_EXCEPTION', 13, "'const' constructors cannot throw exceptions");
+  static final CompileTimeErrorCode CONST_CONSTRUCTOR_THROWS_EXCEPTION = new CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_THROWS_EXCEPTION', 13, "'const' constructors cannot throw exceptions");
+
+  /**
+   * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly or implicitly, in
+   * the initializer list of a constant constructor must specify a constant constructor of the
+   * superclass of the immediately enclosing class or a compile-time error occurs.
+   */
+  static final CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER = new CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER', 14, "Constant constructor cannot call non-constant super constructor");
 
   /**
    * 7.6.3 Constant Constructors: It is a compile-time error if a constant constructor is declared
@@ -715,7 +761,7 @@
    *
    * The above refers to both locally declared and inherited instance variables.
    */
-  static final CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = new CompileTimeErrorCode('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 14, "Cannot define the 'const' constructor for a class with non-final fields");
+  static final CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = new CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 15, "Cannot define the 'const' constructor for a class with non-final fields");
 
   /**
    * 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error if o is not
@@ -728,63 +774,63 @@
    * @param initializerType the name of the type of the initializer expression
    * @param fieldType the name of the type of the field
    */
-  static final CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = new CompileTimeErrorCode('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 15, "The initializer type '%s' cannot be assigned to the field type '%s'");
+  static final CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = new CompileTimeErrorCode.con1('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 16, "The initializer type '%s' cannot be assigned to the field type '%s'");
 
   /**
    * 6.2 Formal Parameters: It is a compile-time error if a formal parameter is declared as a
    * constant variable.
    */
-  static final CompileTimeErrorCode CONST_FORMAL_PARAMETER = new CompileTimeErrorCode('CONST_FORMAL_PARAMETER', 16, "Parameters cannot be 'const'");
+  static final CompileTimeErrorCode CONST_FORMAL_PARAMETER = new CompileTimeErrorCode.con1('CONST_FORMAL_PARAMETER', 17, "Parameters cannot be 'const'");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant or a
    * compile-time error occurs.
    */
-  static final CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = new CompileTimeErrorCode('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 17, "'const' variables must be constant value");
+  static final CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = new CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 18, "'const' variables must be constant value");
 
   /**
    * 7.5 Instance Variables: It is a compile-time error if an instance variable is declared to be
    * constant.
    */
-  static final CompileTimeErrorCode CONST_INSTANCE_FIELD = new CompileTimeErrorCode('CONST_INSTANCE_FIELD', 18, "Only static fields can be declared as 'const'");
+  static final CompileTimeErrorCode CONST_INSTANCE_FIELD = new CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 19, "Only static fields can be declared as 'const'");
 
   /**
    * 12.11.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2, where e, e1 and e2
    * are constant expressions that evaluate to a boolean value.
    */
-  static final CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = new CompileTimeErrorCode('CONST_EVAL_TYPE_BOOL', 19, "An expression of type 'bool' was expected");
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = new CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 20, "An expression of type 'bool' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms e1 == e2 or e1 != e2 where e1 and e2 are
    * constant expressions that evaluate to a numeric, string or boolean value or to null.
    */
-  static final CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = new CompileTimeErrorCode('CONST_EVAL_TYPE_BOOL_NUM_STRING', 20, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = new CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 21, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms ~e, e1 ^ e2, e1 & e2, e1 | e2, e1 >> e2 or e1
    * << e2, where e, e1 and e2 are constant expressions that evaluate to an integer value or to
    * null.
    */
-  static final CompileTimeErrorCode CONST_EVAL_TYPE_INT = new CompileTimeErrorCode('CONST_EVAL_TYPE_INT', 21, "An expression of type 'int' was expected");
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_INT = new CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 22, "An expression of type 'int' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms e, e1 + e2, e1 - e2, e1 * e2, e1 / e2, e1 ~/
    * e2, e1 > e2, e1 < e2, e1 >= e2, e1 <= e2 or e1 % e2, where e, e1 and e2 are constant
    * expressions that evaluate to a numeric value or to null..
    */
-  static final CompileTimeErrorCode CONST_EVAL_TYPE_NUM = new CompileTimeErrorCode('CONST_EVAL_TYPE_NUM', 22, "An expression of type 'num' was expected");
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_NUM = new CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 23, "An expression of type 'num' was expected");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static final CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = new CompileTimeErrorCode('CONST_EVAL_THROWS_EXCEPTION', 23, "Evaluation of this constant expression causes exception");
+  static final CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = new CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 24, "Evaluation of this constant expression causes exception");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static final CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = new CompileTimeErrorCode('CONST_EVAL_THROWS_IDBZE', 24, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
+  static final CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = new CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 25, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
 
   /**
    * 12.11.2 Const: If <i>T</i> is a parameterized type <i>S&lt;U<sub>1</sub>, &hellip;,
@@ -797,7 +843,7 @@
    * @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
    * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
    */
-  static final CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = new CompileTimeErrorCode('CONST_WITH_INVALID_TYPE_PARAMETERS', 25, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static final CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = new CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 26, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   /**
    * 12.11.2 Const: If <i>e</i> is of the form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
@@ -805,13 +851,13 @@
    * compile-time error if the type <i>T</i> does not declare a constant constructor with the same
    * name as the declaration of <i>T</i>.
    */
-  static final CompileTimeErrorCode CONST_WITH_NON_CONST = new CompileTimeErrorCode('CONST_WITH_NON_CONST', 26, "The constructor being called is not a 'const' constructor");
+  static final CompileTimeErrorCode CONST_WITH_NON_CONST = new CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 27, "The constructor being called is not a 'const' constructor");
 
   /**
    * 12.11.2 Const: In all of the above cases, it is a compile-time error if <i>a<sub>i</sub>, 1
    * &lt;= i &lt;= n + k</i>, is not a compile-time constant expression.
    */
-  static final CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = new CompileTimeErrorCode('CONST_WITH_NON_CONSTANT_ARGUMENT', 27, "Arguments of a constant creation must be constant expressions");
+  static final CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = new CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 28, "Arguments of a constant creation must be constant expressions");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
@@ -824,12 +870,12 @@
    *
    * @param name the name of the non-type element
    */
-  static final CompileTimeErrorCode CONST_WITH_NON_TYPE = new CompileTimeErrorCode('CONST_WITH_NON_TYPE', 28, "The name '%s' is not a class");
+  static final CompileTimeErrorCode CONST_WITH_NON_TYPE = new CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 29, "The name '%s' is not a class");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> includes any type parameters.
    */
-  static final CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = new CompileTimeErrorCode('CONST_WITH_TYPE_PARAMETERS', 29, "The constant creation cannot use a type parameter");
+  static final CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = new CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 30, "The constant creation cannot use a type parameter");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -838,7 +884,7 @@
    * @param typeName the name of the type
    * @param constructorName the name of the requested constant constructor
    */
-  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = new CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR', 30, "The class '%s' does not have a constant constructor '%s'");
+  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = new CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 31, "The class '%s' does not have a constant constructor '%s'");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -846,19 +892,26 @@
    *
    * @param typeName the name of the type
    */
-  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 31, "The class '%s' does not have a default constant constructor");
+  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 32, "The class '%s' does not have a default constant constructor");
 
   /**
    * 15.3.1 Typedef: It is a compile-time error if any default values are specified in the signature
    * of a function type alias.
    */
-  static final CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = new CompileTimeErrorCode('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 32, "Default values aren't allowed in typedefs");
+  static final CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = new CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 33, "Default values aren't allowed in typedefs");
+
+  /**
+   * 6.2.1 Required Formals: By means of a function signature that names the parameter and describes
+   * its type as a function type. It is a compile-time error if any default values are specified in
+   * the signature of such a function type.
+   */
+  static final CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = new CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 34, "Default values aren't allowed in function type parameters");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
    * declared in the same scope.
    */
-  static final CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = new CompileTimeErrorCode('DUPLICATE_CONSTRUCTOR_DEFAULT', 33, "The default constructor is already defined");
+  static final CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = new CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 35, "The default constructor is already defined");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -866,7 +919,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static final CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = new CompileTimeErrorCode('DUPLICATE_CONSTRUCTOR_NAME', 34, "The constructor with name '%s' is already defined");
+  static final CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = new CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 36, "The constructor with name '%s' is already defined");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -879,7 +932,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static final CompileTimeErrorCode DUPLICATE_DEFINITION = new CompileTimeErrorCode('DUPLICATE_DEFINITION', 35, "The name '%s' is already defined");
+  static final CompileTimeErrorCode DUPLICATE_DEFINITION = new CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 37, "The name '%s' is already defined");
 
   /**
    * 7. Classes: It is a compile-time error if a class has an instance member and a static member
@@ -891,21 +944,21 @@
    * @param name the name of the conflicting members
    * @see #DUPLICATE_DEFINITION
    */
-  static final CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = new CompileTimeErrorCode('DUPLICATE_DEFINITION_INHERITANCE', 36, "The name '%s' is already defined in '%s'");
+  static final CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = new CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 38, "The name '%s' is already defined in '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a compile-time error if <i>q<sub>i</sub> =
    * q<sub>j</sub></i> for any <i>i != j</i> [where <i>q<sub>i</sub></i> is the label for a named
    * argument].
    */
-  static final CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = new CompileTimeErrorCode('DUPLICATE_NAMED_ARGUMENT', 37, "The argument for the named parameter '%s' was already specified");
+  static final CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = new CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 39, "The argument for the named parameter '%s' was already specified");
 
   /**
    * SDK implementation libraries can be exported only by other SDK libraries.
    *
    * @param uri the uri pointing to a library
    */
-  static final CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = new CompileTimeErrorCode('EXPORT_INTERNAL_LIBRARY', 38, "The library %s is internal and cannot be exported");
+  static final CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = new CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 40, "The library '%s' is internal and cannot be exported");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -913,7 +966,7 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static final CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = new CompileTimeErrorCode('EXPORT_OF_NON_LIBRARY', 39, "The exported library '%s' must not have a part-of directive");
+  static final CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = new CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 41, "The exported library '%s' must not have a part-of directive");
 
   /**
    * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
@@ -921,7 +974,7 @@
    *
    * @param typeName the name of the superclass that was not found
    */
-  static final CompileTimeErrorCode EXTENDS_NON_CLASS = new CompileTimeErrorCode('EXTENDS_NON_CLASS', 40, "Classes can only extend other classes");
+  static final CompileTimeErrorCode EXTENDS_NON_CLASS = new CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 42, "Classes can only extend other classes");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -940,7 +993,7 @@
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
    */
-  static final CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = new CompileTimeErrorCode('EXTENDS_DISALLOWED_CLASS', 41, "Classes cannot extend '%s'");
+  static final CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = new CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 43, "Classes cannot extend '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -952,36 +1005,21 @@
    * @param requiredCount the maximum number of positional arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static final CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = new CompileTimeErrorCode('EXTRA_POSITIONAL_ARGUMENTS', 42, "%d positional arguments expected, but %d found");
+  static final CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = new CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 44, "%d positional arguments expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if more than one initializer corresponding to a given instance variable appears in
    * <i>k</i>'s list.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = new CompileTimeErrorCode('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 43, "The field '%s' cannot be initialized twice in the same constructor");
-
-  /**
-   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
-   * error if <i>k</i>'s initializer list contains an initializer for a final variable <i>f</i>
-   * whose declaration includes an initialization expression.
-   */
-  static final CompileTimeErrorCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = new CompileTimeErrorCode('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 44, "Values cannot be set in the constructor if they are final, and have already been set");
+  static final CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = new CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 45, "The field '%s' cannot be initialized twice in the same constructor");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if <i>k</i>'s initializer list contains an initializer for a variable that is initialized
    * by means of an initializing formal of <i>k</i>.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = new CompileTimeErrorCode('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 45, "Fields cannot be initialized in both the parameter list and the initializers");
-
-  /**
-   * 5 Variables: It is a compile-time error if a final instance variable that has been initialized
-   * at its point of declaration is also initialized in a constructor.
-   *
-   * @param name the name of the field in question
-   */
-  static final CompileTimeErrorCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = new CompileTimeErrorCode('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 46, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
+  static final CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = new CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 46, "Fields cannot be initialized in both the parameter list and the initializers");
 
   /**
    * 5 Variables: It is a compile-time error if a final instance variable that has is initialized by
@@ -990,19 +1028,19 @@
    *
    * @param name the name of the field in question
    */
-  static final CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = new CompileTimeErrorCode('FINAL_INITIALIZED_MULTIPLE_TIMES', 47, "'%s' is a final field and so can only be set once");
+  static final CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = new CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 47, "'%s' is a final field and so can only be set once");
 
   /**
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 48, "Initializing formal fields cannot be used in factory constructors");
+  static final CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = new CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 48, "Initializing formal fields cannot be used in factory constructors");
 
   /**
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 49, "Initializing formal fields can only be used in constructors");
+  static final CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = new CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 49, "Initializing formal fields can only be used in constructors");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1011,7 +1049,7 @@
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 50, "The redirecting constructor cannot have a field initializer");
+  static final CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 50, "The redirecting constructor cannot have a field initializer");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -1019,7 +1057,7 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static final CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = new CompileTimeErrorCode('GETTER_AND_METHOD_WITH_SAME_NAME', 51, "'%s' cannot be used to name a getter, there is already a method with the same name");
+  static final CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = new CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 51, "'%s' cannot be used to name a getter, there is already a method with the same name");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -1038,13 +1076,13 @@
    * @param typeName the name of the type that cannot be implemented
    * @see #EXTENDS_DISALLOWED_CLASS
    */
-  static final CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = new CompileTimeErrorCode('IMPLEMENTS_DISALLOWED_CLASS', 52, "Classes cannot implement '%s'");
+  static final CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = new CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 52, "Classes cannot implement '%s'");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class includes
    * type dynamic.
    */
-  static final CompileTimeErrorCode IMPLEMENTS_DYNAMIC = new CompileTimeErrorCode('IMPLEMENTS_DYNAMIC', 53, "Classes cannot implement 'dynamic'");
+  static final CompileTimeErrorCode IMPLEMENTS_DYNAMIC = new CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 53, "Classes cannot implement 'dynamic'");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
@@ -1053,7 +1091,7 @@
    *
    * @param typeName the name of the interface that was not found
    */
-  static final CompileTimeErrorCode IMPLEMENTS_NON_CLASS = new CompileTimeErrorCode('IMPLEMENTS_NON_CLASS', 54, "Classes can only implement other classes");
+  static final CompileTimeErrorCode IMPLEMENTS_NON_CLASS = new CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 54, "Classes can only implement other classes");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if a type <i>T</i> appears more than once in
@@ -1061,7 +1099,7 @@
    *
    * @param className the name of the class that is implemented more than once
    */
-  static final CompileTimeErrorCode IMPLEMENTS_REPEATED = new CompileTimeErrorCode('IMPLEMENTS_REPEATED', 55, "'%s' can only be implemented once");
+  static final CompileTimeErrorCode IMPLEMENTS_REPEATED = new CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 55, "'%s' can only be implemented once");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the superclass of a class <i>C</i> appears
@@ -1069,7 +1107,7 @@
    *
    * @param className the name of the class that appears in both "extends" and "implements" clauses
    */
-  static final CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = new CompileTimeErrorCode('IMPLEMENTS_SUPER_CLASS', 56, "'%s' cannot be used in both 'extends' and 'implements' clauses");
+  static final CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = new CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 56, "'%s' cannot be used in both 'extends' and 'implements' clauses");
 
   /**
    * 7.6.1 Generative Constructors: Note that <b>this</b> is not in scope on the right hand side of
@@ -1081,14 +1119,14 @@
    *
    * @param name the name of the type in question
    */
-  static final CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = new CompileTimeErrorCode('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 57, "The 'this' expression cannot be implicitly used in initializers");
+  static final CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = new CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 57, "The 'this' expression cannot be implicitly used in initializers");
 
   /**
    * SDK implementation libraries can be imported only by other SDK libraries.
    *
    * @param uri the uri pointing to a library
    */
-  static final CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = new CompileTimeErrorCode('IMPORT_INTERNAL_LIBRARY', 58, "The library %s is internal and cannot be imported");
+  static final CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = new CompileTimeErrorCode.con1('IMPORT_INTERNAL_LIBRARY', 58, "The library '%s' is internal and cannot be imported");
 
   /**
    * 14.1 Imports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1096,7 +1134,7 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static final CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = new CompileTimeErrorCode('IMPORT_OF_NON_LIBRARY', 59, "The imported library '%s' must not have a part-of directive");
+  static final CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = new CompileTimeErrorCode.con1('IMPORT_OF_NON_LIBRARY', 59, "The imported library '%s' must not have a part-of directive");
 
   /**
    * 13.9 Switch: It is a compile-time error if values of the expressions <i>e<sub>k</sub></i> are
@@ -1105,7 +1143,7 @@
    * @param expressionSource the expression source code that is the unexpected type
    * @param expectedType the name of the expected type
    */
-  static final CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = new CompileTimeErrorCode('INCONSISTENT_CASE_EXPRESSION_TYPES', 60, "Case expressions must have the same types, '%s' is not a %s'");
+  static final CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = new CompileTimeErrorCode.con1('INCONSISTENT_CASE_EXPRESSION_TYPES', 60, "Case expressions must have the same types, '%s' is not a %s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
@@ -1116,7 +1154,7 @@
    *          immediately enclosing class
    * @see #INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode('INITIALIZER_FOR_NON_EXISTANT_FIELD', 61, "'%s' is not a variable in the enclosing class");
+  static final CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode.con1('INITIALIZER_FOR_NON_EXISTANT_FIELD', 61, "'%s' is not a variable in the enclosing class");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
@@ -1127,7 +1165,7 @@
    *          enclosing class
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = new CompileTimeErrorCode('INITIALIZER_FOR_STATIC_FIELD', 62, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+  static final CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = new CompileTimeErrorCode.con1('INITIALIZER_FOR_STATIC_FIELD', 62, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -1139,7 +1177,7 @@
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    * @see #INITIALIZER_FOR_NON_EXISTANT_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 63, "'%s' is not a variable in the enclosing class");
+  static final CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 63, "'%s' is not a variable in the enclosing class");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -1150,20 +1188,20 @@
    *          enclosing class
    * @see #INITIALIZER_FOR_STATIC_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = new CompileTimeErrorCode('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 64, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+  static final CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = new CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 64, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
 
   /**
    * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
    * <b>this</b>.<i>id</i>.
    */
-  static final CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = new CompileTimeErrorCode('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 65, "Instance member cannot be accessed from static method");
+  static final CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = new CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 65, "Instance member cannot be accessed from static method");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static final CompileTimeErrorCode INVALID_ANNOTATION = new CompileTimeErrorCode('INVALID_ANNOTATION', 66, "Annotation can be only constant variable or constant constructor invocation");
+  static final CompileTimeErrorCode INVALID_ANNOTATION = new CompileTimeErrorCode.con1('INVALID_ANNOTATION', 66, "Annotation can be only constant variable or constant constructor invocation");
 
   /**
    * TODO(brianwilkerson) Remove this when we have decided on how to report errors in compile-time
@@ -1171,62 +1209,26 @@
    *
    * See TODOs in ConstantVisitor
    */
-  static final CompileTimeErrorCode INVALID_CONSTANT = new CompileTimeErrorCode('INVALID_CONSTANT', 67, "Invalid constant value");
+  static final CompileTimeErrorCode INVALID_CONSTANT = new CompileTimeErrorCode.con1('INVALID_CONSTANT', 67, "Invalid constant value");
 
   /**
    * 7.6 Constructors: It is a compile-time error if the name of a constructor is not a constructor
    * name.
    */
-  static final CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = new CompileTimeErrorCode('INVALID_CONSTRUCTOR_NAME', 68, "Invalid constructor name");
+  static final CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = new CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 68, "Invalid constructor name");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>M</i> is not the name of the immediately
    * enclosing class.
    */
-  static final CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = new CompileTimeErrorCode('INVALID_FACTORY_NAME_NOT_A_CLASS', 69, "The name of the immediately enclosing class expected");
-
-  /**
-   * 7.1 Instance Methods: It is a compile-time error if an instance method <i>m1</i> overrides an
-   * instance member <i>m2</i> and <i>m1</i> does not declare all the named parameters declared by
-   * <i>m2</i>.
-   *
-   * @param paramCount the number of named parameters in the overridden member
-   * @param className the name of the class from the overridden method
-   */
-  static final CompileTimeErrorCode INVALID_OVERRIDE_NAMED = new CompileTimeErrorCode('INVALID_OVERRIDE_NAMED', 70, "Missing the named parameter '%s' to match the overridden method from '%s'");
-
-  /**
-   * 7.1 Instance Methods: It is a compile-time error if an instance method <i>m1</i> overrides an
-   * instance member <i>m2</i> and <i>m1</i> has fewer optional positional parameters than
-   * <i>m2</i>.
-   *
-   * @param paramCount the number of positional parameters in the overridden member
-   * @param className the name of the class from the overridden method
-   */
-  static final CompileTimeErrorCode INVALID_OVERRIDE_POSITIONAL = new CompileTimeErrorCode('INVALID_OVERRIDE_POSITIONAL', 71, "Must have at least %d optional parameters to match the overridden method from '%s'");
-
-  /**
-   * 7.1 Instance Methods: It is a compile-time error if an instance method <i>m1</i> overrides an
-   * instance member <i>m2</i> and <i>m1</i> has a different number of required parameters than
-   * <i>m2</i>.
-   *
-   * @param paramCount the number of required parameters in the overridden member
-   * @param className the name of the class from the overridden method
-   */
-  static final CompileTimeErrorCode INVALID_OVERRIDE_REQUIRED = new CompileTimeErrorCode('INVALID_OVERRIDE_REQUIRED', 72, "Must have exactly %d required parameters to match the overridden method from '%s'");
+  static final CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = new CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 69, "The name of the immediately enclosing class expected");
 
   /**
    * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
    * initializer, in a factory constructor, or in a static method or variable initializer, or in the
    * initializer of an instance variable.
    */
-  static final CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = new CompileTimeErrorCode('INVALID_REFERENCE_TO_THIS', 73, "Invalid reference to 'this' expression");
-
-  /**
-   * 12.7 Maps: It is a compile-time error if the first type argument to a map literal is not
-   * String.
-   */
-  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_FOR_KEY = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_FOR_KEY', 74, "The first type argument to a map literal must be 'String'");
+  static final CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = new CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 70, "Invalid reference to 'this' expression");
 
   /**
    * 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
@@ -1234,7 +1236,7 @@
    *
    * @name the name of the type parameter
    */
-  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 75, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
+  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = new CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 71, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 12.7 Maps: It is a compile time error if the type arguments of a constant map literal include a
@@ -1242,7 +1244,7 @@
    *
    * @name the name of the type parameter
    */
-  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 76, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
+  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = new CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 72, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1257,7 +1259,7 @@
    * @param uri the URI that is invalid
    * @see #URI_DOES_NOT_EXIST
    */
-  static final CompileTimeErrorCode INVALID_URI = new CompileTimeErrorCode('INVALID_URI', 77, "Invalid URI syntax: '%s'");
+  static final CompileTimeErrorCode INVALID_URI = new CompileTimeErrorCode.con1('INVALID_URI', 73, "Invalid URI syntax: '%s'");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1268,7 +1270,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static final CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = new CompileTimeErrorCode('LABEL_IN_OUTER_SCOPE', 78, "Cannot reference label '%s' declared in an outer method");
+  static final CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = new CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 74, "Cannot reference label '%s' declared in an outer method");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1279,7 +1281,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static final CompileTimeErrorCode LABEL_UNDEFINED = new CompileTimeErrorCode('LABEL_UNDEFINED', 79, "Cannot reference undefined label '%s'");
+  static final CompileTimeErrorCode LABEL_UNDEFINED = new CompileTimeErrorCode.con1('LABEL_UNDEFINED', 75, "Cannot reference undefined label '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -1295,7 +1297,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 80, "The element type '%s' cannot be assigned to the list type '%s'");
+  static final CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 76, "The element type '%s' cannot be assigned to the list type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1311,7 +1313,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode('MAP_KEY_TYPE_NOT_ASSIGNABLE', 81, "The element type '%s' cannot be assigned to the map key type '%s'");
+  static final CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 77, "The element type '%s' cannot be assigned to the map key type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1327,13 +1329,13 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 82, "The element type '%s' cannot be assigned to the map value type '%s'");
+  static final CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 78, "The element type '%s' cannot be assigned to the map value type '%s'");
 
   /**
    * 7 Classes: It is a compile time error if a class <i>C</i> declares a member with the same name
    * as <i>C</i>.
    */
-  static final CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = new CompileTimeErrorCode('MEMBER_WITH_CLASS_NAME', 83, "Class members cannot have the same name as the enclosing class");
+  static final CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = new CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 79, "Class members cannot have the same name as the enclosing class");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -1341,17 +1343,17 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static final CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = new CompileTimeErrorCode('METHOD_AND_GETTER_WITH_SAME_NAME', 84, "'%s' cannot be used to name a method, there is already a getter with the same name");
+  static final CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = new CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 80, "'%s' cannot be used to name a method, there is already a getter with the same name");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant list literal.
    */
-  static final CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = new CompileTimeErrorCode('MISSING_CONST_IN_LIST_LITERAL', 85, "List literals must be prefixed with 'const' when used as a constant expression");
+  static final CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = new CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 81, "List literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant map literal.
    */
-  static final CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = new CompileTimeErrorCode('MISSING_CONST_IN_MAP_LITERAL', 86, "Map literals must be prefixed with 'const' when used as a constant expression");
+  static final CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = new CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 82, "Map literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin explicitly declares a
@@ -1359,7 +1361,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static final CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = new CompileTimeErrorCode('MIXIN_DECLARES_CONSTRUCTOR', 87, "The class '%s' cannot be used as a mixin because it declares a constructor");
+  static final CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = new CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 83, "The class '%s' cannot be used as a mixin because it declares a constructor");
 
   /**
    * 9 Mixins: It is a compile-time error if a mixin is derived from a class whose superclass is not
@@ -1367,43 +1369,62 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static final CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = new CompileTimeErrorCode('MIXIN_INHERITS_FROM_NOT_OBJECT', 88, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
+  static final CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = new CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 84, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
+
+  /**
+   * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
+   *
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement int.
+   *
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend or implement double.
+   *
+   * 12.3 Numbers: It is a compile-time error for any type other than the types int and double to
+   * attempt to extend or implement num.
+   *
+   * 12.4 Booleans: It is a compile-time error for a class to attempt to extend or implement bool.
+   *
+   * 12.5 Strings: It is a compile-time error for a class to attempt to extend or implement String.
+   *
+   * @param typeName the name of the type that cannot be extended
+   * @see #IMPLEMENTS_DISALLOWED_CLASS
+   */
+  static final CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = new CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 85, "Classes cannot mixin '%s'");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>M</i> does not denote a class or mixin
    * available in the immediately enclosing scope.
    */
-  static final CompileTimeErrorCode MIXIN_OF_NON_CLASS = new CompileTimeErrorCode('MIXIN_OF_NON_CLASS', 89, "Classes can only mixin other classes");
+  static final CompileTimeErrorCode MIXIN_OF_NON_CLASS = new CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 86, "Classes can only mixin other classes");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin refers to super.
    */
-  static final CompileTimeErrorCode MIXIN_REFERENCES_SUPER = new CompileTimeErrorCode('MIXIN_REFERENCES_SUPER', 90, "The class '%s' cannot be used as a mixin because it references 'super'");
+  static final CompileTimeErrorCode MIXIN_REFERENCES_SUPER = new CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 87, "The class '%s' cannot be used as a mixin because it references 'super'");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>S</i> does not denote a class available
    * in the immediately enclosing scope.
    */
-  static final CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = new CompileTimeErrorCode('MIXIN_WITH_NON_CLASS_SUPERCLASS', 91, "Mixin can only be applied to class");
+  static final CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = new CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 88, "Mixin can only be applied to class");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static final CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = new CompileTimeErrorCode('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 92, "Constructor may have at most one 'this' redirection");
+  static final CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = new CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 89, "Constructor may have at most one 'this' redirection");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. Then <i>k</i> may
    * include at most one superinitializer in its initializer list or a compile time error occurs.
    */
-  static final CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = new CompileTimeErrorCode('MULTIPLE_SUPER_INITIALIZERS', 93, "Constructor may have at most one 'super' initializer");
+  static final CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = new CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 90, "Constructor may have at most one 'super' initializer");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static final CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = new CompileTimeErrorCode('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 94, "Annotation creation must have arguments");
+  static final CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = new CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 91, "Annotation creation must have arguments");
 
   /**
    * 7.6.1 Generative Constructors: If no superinitializer is provided, an implicit superinitializer
@@ -1413,7 +1434,7 @@
    * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
    * generative constructor named <i>S</i> (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = new CompileTimeErrorCode('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 95, "The class '%s' does not have a default constructor");
+  static final CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = new CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 92, "The class '%s' does not have a default constructor");
 
   /**
    * 7.6 Constructors: Iff no constructor is specified for a class <i>C</i>, it implicitly has a
@@ -1422,13 +1443,13 @@
    * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
    * generative constructor named <i>S</i> (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = new CompileTimeErrorCode('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 96, "The class '%s' does not have a default constructor");
+  static final CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = new CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 93, "The class '%s' does not have a default constructor");
 
   /**
    * 13.2 Expression Statements: It is a compile-time error if a non-constant map literal that has
    * no explicit type arguments appears in a place where a statement is expected.
    */
-  static final CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = new CompileTimeErrorCode('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 97, "A non-constant map literal without type arguments cannot be used as an expression statement");
+  static final CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = new CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 94, "A non-constant map literal without type arguments cannot be used as an expression statement");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
@@ -1439,44 +1460,44 @@
    * s<sub>n</sub>}</i>, it is a compile-time error if the expressions <i>e<sub>k</sub></i> are not
    * compile-time constants, for all <i>1 &lt;= k &lt;= n</i>.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = new CompileTimeErrorCode('NON_CONSTANT_CASE_EXPRESSION', 98, "Case expressions must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = new CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 95, "Case expressions must be constant");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
    * parameter is not a compile-time constant.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = new CompileTimeErrorCode('NON_CONSTANT_DEFAULT_VALUE', 99, "Default values of an optional parameter must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = new CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 96, "Default values of an optional parameter must be constant");
 
   /**
    * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
    * compile-time constant.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = new CompileTimeErrorCode('NON_CONSTANT_LIST_ELEMENT', 100, "'const' lists must have all constant values");
+  static final CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = new CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 97, "'const' lists must have all constant values");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_MAP_KEY = new CompileTimeErrorCode('NON_CONSTANT_MAP_KEY', 101, "The keys in a map must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_MAP_KEY = new CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 98, "The keys in a map must be constant");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = new CompileTimeErrorCode('NON_CONSTANT_MAP_VALUE', 102, "The values in a 'const' map must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = new CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 99, "The values in a 'const' map must be constant");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = new CompileTimeErrorCode('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 103, "Annotation creation can use only 'const' constructor");
+  static final CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = new CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 100, "Annotation creation can use only 'const' constructor");
 
   /**
    * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
    * constant constructor must be a potentially constant expression, or a compile-time error occurs.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = new CompileTimeErrorCode('NON_CONSTANT_VALUE_IN_INITIALIZER', 104, "Initializer expressions in constant constructors must be constants");
+  static final CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = new CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 101, "Initializer expressions in constant constructors must be constants");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
@@ -1487,7 +1508,7 @@
    * @param requiredCount the expected number of required arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static final CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new CompileTimeErrorCode('NOT_ENOUGH_REQUIRED_ARGUMENTS', 105, "%d required argument(s) expected, but %d found");
+  static final CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 102, "%d required argument(s) expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1495,17 +1516,17 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode('NON_GENERATIVE_CONSTRUCTOR', 106, "The generative constructor '%s' expected, but factory found");
+  static final CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 103, "The generative constructor '%s' expected, but factory found");
 
   /**
    * 7.9 Superclasses: It is a compile-time error to specify an extends clause for class Object.
    */
-  static final CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = new CompileTimeErrorCode('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 107, "");
+  static final CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = new CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 104, "");
 
   /**
    * 7.1.1 Operators: It is a compile-time error to declare an optional parameter in an operator.
    */
-  static final CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = new CompileTimeErrorCode('OPTIONAL_PARAMETER_IN_OPERATOR', 108, "Optional parameters are not allowed when defining an operator");
+  static final CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = new CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 105, "Optional parameters are not allowed when defining an operator");
 
   /**
    * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
@@ -1513,25 +1534,25 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static final CompileTimeErrorCode PART_OF_NON_PART = new CompileTimeErrorCode('PART_OF_NON_PART', 109, "The included part '%s' must have a part-of directive");
+  static final CompileTimeErrorCode PART_OF_NON_PART = new CompileTimeErrorCode.con1('PART_OF_NON_PART', 106, "The included part '%s' must have a part-of directive");
 
   /**
    * 14.1 Imports: It is a compile-time error if the current library declares a top-level member
    * named <i>p</i>.
    */
-  static final CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = new CompileTimeErrorCode('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 110, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
+  static final CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = new CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 107, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the name of a named optional parameter
    * begins with an '_' character.
    */
-  static final CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = new CompileTimeErrorCode('PRIVATE_OPTIONAL_PARAMETER', 111, "Named optional parameters cannot start with an underscore");
+  static final CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = new CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 108, "Named optional parameters cannot start with an underscore");
 
   /**
    * 12.1 Constants: It is a compile-time error if the value of a compile-time constant expression
    * depends on itself.
    */
-  static final CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = new CompileTimeErrorCode('RECURSIVE_COMPILE_TIME_CONSTANT', 112, "");
+  static final CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = new CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 109, "");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1542,13 +1563,13 @@
    *
    * https://code.google.com/p/dart/issues/detail?id=954
    */
-  static final CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = new CompileTimeErrorCode('RECURSIVE_CONSTRUCTOR_REDIRECT', 113, "Cycle in redirecting generative constructors");
+  static final CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = new CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 110, "Cycle in redirecting generative constructors");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if a redirecting factory constructor redirects to
    * itself, either directly or indirectly via a sequence of redirections.
    */
-  static final CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = new CompileTimeErrorCode('RECURSIVE_FACTORY_REDIRECT', 114, "Cycle in redirecting factory constructors");
+  static final CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = new CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 111, "Cycle in redirecting factory constructors");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1561,7 +1582,7 @@
    * @param className the name of the class that implements itself recursively
    * @param strImplementsPath a string representation of the implements loop
    */
-  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE', 115, "'%s' cannot be a superinterface of itself: %s");
+  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = new CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 112, "'%s' cannot be a superinterface of itself: %s");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1573,7 +1594,7 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 116, "'%s' cannot extend itself");
+  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = new CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 113, "'%s' cannot extend itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1585,31 +1606,31 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 117, "'%s' cannot implement itself");
+  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = new CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 114, "'%s' cannot implement itself");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static final CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = new CompileTimeErrorCode('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 118, "Constant factory constructor cannot delegate to a non-constant constructor");
+  static final CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = new CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 115, "Constant factory constructor cannot delegate to a non-constant constructor");
 
   /**
    * 13.3 Local Variable Declaration: It is a compile-time error if <i>e</i> refers to the name
    * <i>v</i> or the name <i>v=</i>.
    */
-  static final CompileTimeErrorCode REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER = new CompileTimeErrorCode('REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER', 119, "The name '%s' cannot be referenced in the initializer of a variable with the same name");
+  static final CompileTimeErrorCode REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER = new CompileTimeErrorCode.con1('REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER', 116, "The name '%s' cannot be referenced in the initializer of a variable with the same name");
 
   /**
    * 12.8.1 Rethrow: It is a compile-time error if an expression of the form <i>rethrow;</i> is not
    * enclosed within a on-catch clause.
    */
-  static final CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = new CompileTimeErrorCode('RETHROW_OUTSIDE_CATCH', 120, "rethrow must be inside of a catch clause");
+  static final CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = new CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 117, "rethrow must be inside of a catch clause");
 
   /**
    * 13.11 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
    * appears in a generative constructor.
    */
-  static final CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode('RETURN_IN_GENERATIVE_CONSTRUCTOR', 121, "Constructors cannot return a value");
+  static final CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 118, "Constructors cannot return a value");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1619,19 +1640,19 @@
    * initializer list, in class Object, in a factory constructor, or in a static method or variable
    * initializer.
    */
-  static final CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = new CompileTimeErrorCode('SUPER_IN_INVALID_CONTEXT', 122, "Invalid context for 'super' invocation");
+  static final CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = new CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 119, "Invalid context for 'super' invocation");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static final CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode('SUPER_IN_REDIRECTING_CONSTRUCTOR', 123, "The redirecting constructor cannot have a 'super' initializer");
+  static final CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 120, "The redirecting constructor cannot have a 'super' initializer");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
    * error if a generative constructor of class Object includes a superinitializer.
    */
-  static final CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = new CompileTimeErrorCode('SUPER_INITIALIZER_IN_OBJECT', 124, "");
+  static final CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = new CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 121, "");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -1650,19 +1671,19 @@
    * @param boundingTypeName the name of the bounding type
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  static final CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = new CompileTimeErrorCode('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 125, "'%s' does not extend '%s'");
+  static final CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = new CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 122, "'%s' does not extend '%s'");
 
   /**
    * 15.3.1 Typedef: It is a compile-time error if a typedef refers to itself via a chain of
    * references that does not include a class declaration.
    */
-  static final CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = new CompileTimeErrorCode('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 126, "Type alias can reference itself only via the bounds of its generic parameters");
+  static final CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = new CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 123, "Type alias can reference itself only via the bounds of its generic parameters");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
    * scope, optionally followed by type arguments.
    */
-  static final CompileTimeErrorCode UNDEFINED_CLASS = new CompileTimeErrorCode('UNDEFINED_CLASS', 127, "Undefined class '%s'");
+  static final CompileTimeErrorCode UNDEFINED_CLASS = new CompileTimeErrorCode.con1('UNDEFINED_CLASS', 124, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1670,7 +1691,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 128, "The class '%s' does not have a generative constructor '%s'");
+  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 125, "The class '%s' does not have a generative constructor '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1678,7 +1699,17 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 129, "The class '%s' does not have a default generative constructor");
+  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = new CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 126, "The class '%s' does not have a default generative constructor");
+
+  /**
+   * 12.14.3 Unqualified Invocation: If there exists a lexically visible declaration named
+   * <i>id</i>, let <i>f<sub>id</sub></i> be the innermost such declaration. Then: [skip].
+   * Otherwise, <i>i</i> is equivalent to <b>this</b>.<i>id</i>(<i>a<sub>1</sub></i>; ...
+   * <i>x<sub>n+k</sub></i> : <i>a<sub>n+k</sub></i>).
+   *
+   * @param methodName the name of the method that is undefined
+   */
+  static final CompileTimeErrorCode UNDEFINED_FUNCTION = new CompileTimeErrorCode.con1('UNDEFINED_FUNCTION', 127, "The function '%s' is not defined");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -1690,7 +1721,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static final CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = new CompileTimeErrorCode('UNDEFINED_NAMED_PARAMETER', 130, "The named parameter '%s' is not defined");
+  static final CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = new CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 128, "The named parameter '%s' is not defined");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1705,7 +1736,7 @@
    * @param uri the URI pointing to a non-existent file
    * @see #INVALID_URI
    */
-  static final CompileTimeErrorCode URI_DOES_NOT_EXIST = new CompileTimeErrorCode('URI_DOES_NOT_EXIST', 131, "Target of URI does not exist: '%s'");
+  static final CompileTimeErrorCode URI_DOES_NOT_EXIST = new CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 129, "Target of URI does not exist: '%s'");
 
   /**
    * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
@@ -1717,7 +1748,7 @@
    * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that describes a URI is
    * not a compile-time constant, or if <i>x</i> involves string interpolation.
    */
-  static final CompileTimeErrorCode URI_WITH_INTERPOLATION = new CompileTimeErrorCode('URI_WITH_INTERPOLATION', 132, "URIs cannot use string interpolation");
+  static final CompileTimeErrorCode URI_WITH_INTERPOLATION = new CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 130, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
@@ -1730,7 +1761,7 @@
    * @param expectedNumberOfParameters the number of parameters expected
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 133, "Operator '%s' should declare exactly %d parameter(s), but %d found");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 131, "Operator '%s' should declare exactly %d parameter(s), but %d found");
 
   /**
    * 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
@@ -1738,13 +1769,13 @@
    *
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 134, "Operator '-' should declare 0 or 1 parameter, but %d found");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 132, "Operator '-' should declare 0 or 1 parameter, but %d found");
 
   /**
    * 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
    * exactly one required formal parameter <i>p</i>.
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 135, "Setters should declare exactly one required parameter");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 133, "Setters should declare exactly one required parameter");
   static final List<CompileTimeErrorCode> values = [
       AMBIGUOUS_EXPORT,
       ARGUMENT_DEFINITION_TEST_NON_PARAMETER,
@@ -1760,6 +1791,7 @@
       CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD,
       CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD,
       CONST_CONSTRUCTOR_THROWS_EXCEPTION,
+      CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
       CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
       CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
       CONST_FORMAL_PARAMETER,
@@ -1779,6 +1811,7 @@
       CONST_WITH_UNDEFINED_CONSTRUCTOR,
       CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
       DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS,
+      DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER,
       DUPLICATE_CONSTRUCTOR_DEFAULT,
       DUPLICATE_CONSTRUCTOR_NAME,
       DUPLICATE_DEFINITION,
@@ -1790,9 +1823,7 @@
       EXTENDS_DISALLOWED_CLASS,
       EXTRA_POSITIONAL_ARGUMENTS,
       FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
-      FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION,
       FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER,
-      FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR,
       FINAL_INITIALIZED_MULTIPLE_TIMES,
       FIELD_INITIALIZER_FACTORY_CONSTRUCTOR,
       FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
@@ -1816,11 +1847,7 @@
       INVALID_CONSTANT,
       INVALID_CONSTRUCTOR_NAME,
       INVALID_FACTORY_NAME_NOT_A_CLASS,
-      INVALID_OVERRIDE_NAMED,
-      INVALID_OVERRIDE_POSITIONAL,
-      INVALID_OVERRIDE_REQUIRED,
       INVALID_REFERENCE_TO_THIS,
-      INVALID_TYPE_ARGUMENT_FOR_KEY,
       INVALID_TYPE_ARGUMENT_IN_CONST_LIST,
       INVALID_TYPE_ARGUMENT_IN_CONST_MAP,
       INVALID_URI,
@@ -1835,6 +1862,7 @@
       MISSING_CONST_IN_MAP_LITERAL,
       MIXIN_DECLARES_CONSTRUCTOR,
       MIXIN_INHERITS_FROM_NOT_OBJECT,
+      MIXIN_OF_DISALLOWED_CLASS,
       MIXIN_OF_NON_CLASS,
       MIXIN_REFERENCES_SUPER,
       MIXIN_WITH_NON_CLASS_SUPERCLASS,
@@ -1876,6 +1904,7 @@
       UNDEFINED_CLASS,
       UNDEFINED_CONSTRUCTOR_IN_INITIALIZER,
       UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
+      UNDEFINED_FUNCTION,
       UNDEFINED_NAMED_PARAMETER,
       URI_DOES_NOT_EXIST,
       URI_WITH_INTERPOLATION,
@@ -1883,31 +1912,40 @@
       WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS,
       WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
-   * The message template used to create the message to be displayed for this error.
+   * The template used to create the message to be displayed for this error.
    */
   String _message;
 
   /**
+   * The template used to create the correction to be displayed for this error, or `null` if
+   * there is no correction information for this error.
+   */
+  String correction2;
+
+  /**
    * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  CompileTimeErrorCode(this.name, this.ordinal, String message) {
+  CompileTimeErrorCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
     this._message = message;
   }
+
+  /**
+   * Initialize a newly created error code to have the given message and correction.
+   *
+   * @param message the template used to create the message to be displayed for the error
+   * @param correction the template used to create the correction to be displayed for the error
+   */
+  CompileTimeErrorCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this._message = message;
+    this.correction2 = correction;
+  }
+  String get correction => correction2;
   ErrorSeverity get errorSeverity => ErrorType.COMPILE_TIME_ERROR.severity;
   String get message => _message;
   ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
-  int compareTo(CompileTimeErrorCode other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 /**
  * The enumeration `PubSuggestionCode` defines the suggestions used for reporting deviations
@@ -1915,7 +1953,7 @@
  * indicate the problem that caused the suggestion to be generated and for the message to explain
  * what is wrong and, when appropriate, how the situation can be corrected.
  */
-class PubSuggestionCode implements Enum<PubSuggestionCode>, ErrorCode {
+class PubSuggestionCode extends Enum<PubSuggestionCode> implements ErrorCode {
 
   /**
    * It is a bad practice for a source file in a package "lib" directory hierarchy to traverse
@@ -1923,7 +1961,7 @@
    * contain a directive such as `import '../web/some.dart'` which references a file outside
    * the lib directory.
    */
-  static final PubSuggestionCode FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE = new PubSuggestionCode('FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE', 0, "A file in the 'lib' directory hierarchy should not reference a file outside that hierarchy");
+  static final PubSuggestionCode FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE = new PubSuggestionCode.con1('FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE', 0, "A file in the 'lib' directory hierarchy should not reference a file outside that hierarchy");
 
   /**
    * It is a bad practice for a source file ouside a package "lib" directory hierarchy to traverse
@@ -1931,44 +1969,53 @@
    * contain a directive such as `import '../lib/some.dart'` which references a file inside
    * the lib directory.
    */
-  static final PubSuggestionCode FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE = new PubSuggestionCode('FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE', 1, "A file outside the 'lib' directory hierarchy should not reference a file inside that hierarchy. Use a package: reference instead.");
+  static final PubSuggestionCode FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE = new PubSuggestionCode.con1('FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE', 1, "A file outside the 'lib' directory hierarchy should not reference a file inside that hierarchy. Use a package: reference instead.");
 
   /**
    * It is a bad practice for a package import to reference anything outside the given package, or
    * more generally, it is bad practice for a package import to contain a "..". For example, a
    * source file should not contain a directive such as `import 'package:foo/../some.dart'`.
    */
-  static final PubSuggestionCode PACKAGE_IMPORT_CONTAINS_DOT_DOT = new PubSuggestionCode('PACKAGE_IMPORT_CONTAINS_DOT_DOT', 2, "A package import should not contain '..'");
+  static final PubSuggestionCode PACKAGE_IMPORT_CONTAINS_DOT_DOT = new PubSuggestionCode.con1('PACKAGE_IMPORT_CONTAINS_DOT_DOT', 2, "A package import should not contain '..'");
   static final List<PubSuggestionCode> values = [
       FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE,
       FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE,
       PACKAGE_IMPORT_CONTAINS_DOT_DOT];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
-   * The message template used to create the message to be displayed for this error.
+   * The template used to create the message to be displayed for this error.
    */
   String _message;
 
   /**
+   * The template used to create the correction to be displayed for this error, or `null` if
+   * there is no correction information for this error.
+   */
+  String correction5;
+
+  /**
    * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  PubSuggestionCode(this.name, this.ordinal, String message) {
+  PubSuggestionCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
     this._message = message;
   }
+
+  /**
+   * Initialize a newly created error code to have the given message and correction.
+   *
+   * @param message the template used to create the message to be displayed for the error
+   * @param correction the template used to create the correction to be displayed for the error
+   */
+  PubSuggestionCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this._message = message;
+    this.correction5 = correction;
+  }
+  String get correction => correction5;
   ErrorSeverity get errorSeverity => ErrorType.PUB_SUGGESTION.severity;
   String get message => _message;
   ErrorType get type => ErrorType.PUB_SUGGESTION;
-  int compareTo(PubSuggestionCode other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 /**
  * The enumeration `StaticWarningCode` defines the error codes used for static warnings. The
@@ -1978,7 +2025,7 @@
  *
  * @coverage dart.engine.error
  */
-class StaticWarningCode implements Enum<StaticWarningCode>, ErrorCode {
+class StaticWarningCode extends Enum<StaticWarningCode> implements ErrorCode {
 
   /**
    * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and <i>N</i> is introduced
@@ -1994,7 +2041,7 @@
    * @param firstLibraryName the name of the first library that the type is found
    * @param secondLibraryName the name of the second library that the type is found
    */
-  static final StaticWarningCode AMBIGUOUS_IMPORT = new StaticWarningCode('AMBIGUOUS_IMPORT', 0, "The type '%s' is defined in the libraries '%s' and '%s'");
+  static final StaticWarningCode AMBIGUOUS_IMPORT = new StaticWarningCode.con1('AMBIGUOUS_IMPORT', 0, "The type '%s' is defined in the libraries '%s' and '%s'");
 
   /**
    * 12.11.1 New: It is a static warning if the static type of <i>a<sub>i</sub>, 1 &lt;= i &lt;= n+
@@ -2017,7 +2064,7 @@
    * <i>T<sub>m+j</sub></i> may not be assigned to <i>S<sub>r</sub></i>, where <i>r = q<sub>j</sub>,
    * 1 &lt;= j &lt;= l</i>.
    */
-  static final StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode('ARGUMENT_TYPE_NOT_ASSIGNABLE', 1, "The argument type '%s' cannot be assigned to the parameter type '%s'");
+  static final StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('ARGUMENT_TYPE_NOT_ASSIGNABLE', 1, "The argument type '%s' cannot be assigned to the parameter type '%s'");
 
   /**
    * 5 Variables: Attempting to assign to a final variable elsewhere will cause a NoSuchMethodError
@@ -2026,32 +2073,32 @@
    *
    * A constant variable is always implicitly final.
    */
-  static final StaticWarningCode ASSIGNMENT_TO_CONST = new StaticWarningCode('ASSIGNMENT_TO_CONST', 2, "Constant variables cannot be assigned a value");
+  static final StaticWarningCode ASSIGNMENT_TO_CONST = new StaticWarningCode.con1('ASSIGNMENT_TO_CONST', 2, "Constant variables cannot be assigned a value");
 
   /**
    * 5 Variables: Attempting to assign to a final variable elsewhere will cause a NoSuchMethodError
    * to be thrown, because no setter is defined for it. The assignment will also give rise to a
    * static warning for the same reason.
    */
-  static final StaticWarningCode ASSIGNMENT_TO_FINAL = new StaticWarningCode('ASSIGNMENT_TO_FINAL', 3, "Final variables cannot be assigned a value");
+  static final StaticWarningCode ASSIGNMENT_TO_FINAL = new StaticWarningCode.con1('ASSIGNMENT_TO_FINAL', 3, "Final variables cannot be assigned a value");
 
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
    * warning if <i>T</i> does not have an accessible instance setter named <i>v =</i>.
    */
-  static final StaticWarningCode ASSIGNMENT_TO_METHOD = new StaticWarningCode('ASSIGNMENT_TO_METHOD', 4, "Methods cannot be assigned a value");
+  static final StaticWarningCode ASSIGNMENT_TO_METHOD = new StaticWarningCode.con1('ASSIGNMENT_TO_METHOD', 4, "Methods cannot be assigned a value");
 
   /**
    * 13.9 Switch: It is a static warning if the last statement of the statement sequence
    * <i>s<sub>k</sub></i> is not a break, continue, return or throw statement.
    */
-  static final StaticWarningCode CASE_BLOCK_NOT_TERMINATED = new StaticWarningCode('CASE_BLOCK_NOT_TERMINATED', 5, "The last statement of the 'case' should be 'break', 'continue', 'return' or 'throw'");
+  static final StaticWarningCode CASE_BLOCK_NOT_TERMINATED = new StaticWarningCode.con1('CASE_BLOCK_NOT_TERMINATED', 5, "The last statement of the 'case' should be 'break', 'continue', 'return' or 'throw'");
 
   /**
    * 12.32 Type Cast: It is a static warning if <i>T</i> does not denote a type available in the
    * current lexical scope.
    */
-  static final StaticWarningCode CAST_TO_NON_TYPE = new StaticWarningCode('CAST_TO_NON_TYPE', 6, "The name '%s' is not a type and cannot be used in an 'as' expression");
+  static final StaticWarningCode CAST_TO_NON_TYPE = new StaticWarningCode.con1('CAST_TO_NON_TYPE', 6, "The name '%s' is not a type and cannot be used in an 'as' expression");
 
   /**
    * 16.1.2 Comments: A token of the form <i>[new c](uri)</i> will be replaced by a link in the
@@ -2060,7 +2107,7 @@
    * <i>L</i>, or if <i>c</i> is not the name of a constructor of a class declared in the exported
    * namespace of <i>L</i>.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE = new StaticWarningCode('COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE', 7, "");
+  static final StaticWarningCode COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE = new StaticWarningCode.con1('COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE', 7, "");
 
   /**
    * 16.1.2 Comments: A token of the form <i>[id](uri)</i> will be replaced by a link in the
@@ -2068,19 +2115,19 @@
    * of the link will be <i>id</i>. It is a static warning if uri is not the URI of a dart library
    * <i>L</i>, or if <i>id</i> is not a name declared in the exported namespace of <i>L</i>.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE = new StaticWarningCode('COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE', 8, "");
+  static final StaticWarningCode COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE = new StaticWarningCode.con1('COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE', 8, "");
 
   /**
    * 16.1.2 Comments: It is a static warning if <i>c</i> does not denote a constructor that
    * available in the scope of the documentation comment.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR = new StaticWarningCode('COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR', 9, "");
+  static final StaticWarningCode COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR = new StaticWarningCode.con1('COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR', 9, "");
 
   /**
    * 16.1.2 Comments: It is a static warning if <i>id</i> does not denote a declaration that
    * available in the scope of the documentation comment.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_UNDECLARED_IDENTIFIER = new StaticWarningCode('COMMENT_REFERENCE_UNDECLARED_IDENTIFIER', 10, "");
+  static final StaticWarningCode COMMENT_REFERENCE_UNDECLARED_IDENTIFIER = new StaticWarningCode.con1('COMMENT_REFERENCE_UNDECLARED_IDENTIFIER', 10, "");
 
   /**
    * 16.1.2 Comments: A token of the form <i>[id](uri)</i> will be replaced by a link in the
@@ -2088,13 +2135,13 @@
    * of the link will be <i>id</i>. It is a static warning if uri is not the URI of a dart library
    * <i>L</i>, or if <i>id</i> is not a name declared in the exported namespace of <i>L</i>.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_URI_NOT_LIBRARY = new StaticWarningCode('COMMENT_REFERENCE_URI_NOT_LIBRARY', 11, "");
+  static final StaticWarningCode COMMENT_REFERENCE_URI_NOT_LIBRARY = new StaticWarningCode.con1('COMMENT_REFERENCE_URI_NOT_LIBRARY', 11, "");
 
   /**
    * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
    * inherited in a concrete class.
    */
-  static final StaticWarningCode CONCRETE_CLASS_WITH_ABSTRACT_MEMBER = new StaticWarningCode('CONCRETE_CLASS_WITH_ABSTRACT_MEMBER', 12, "'%s' must have a method body because '%s' is not abstract");
+  static final StaticWarningCode CONCRETE_CLASS_WITH_ABSTRACT_MEMBER = new StaticWarningCode.con1('CONCRETE_CLASS_WITH_ABSTRACT_MEMBER', 12, "'%s' must have a method body because '%s' is not abstract");
 
   /**
    * 7.2 Getters: It is a static warning if a class <i>C</i> declares an instance getter named
@@ -2103,7 +2150,7 @@
    *
    * @param superName the name of the super class declaring a static member
    */
-  static final StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode('CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER', 13, "Superclass '%s' declares static member with the same name");
+  static final StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode.con1('CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER', 13, "Superclass '%s' declares static member with the same name");
 
   /**
    * 7.3 Setters: It is a static warning if a class <i>C</i> declares an instance setter named
@@ -2112,31 +2159,31 @@
    *
    * @param superName the name of the super class declaring a static member
    */
-  static final StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 14, "Superclass '%s' declares static member with the same name");
+  static final StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode.con1('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 14, "Superclass '%s' declares static member with the same name");
 
   /**
    * 7.2 Getters: It is a static warning if a class declares a static getter named <i>v</i> and also
    * has a non-static setter named <i>v=</i>.
    */
-  static final StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = new StaticWarningCode('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 15, "Class '%s' declares non-static setter with the same name");
+  static final StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = new StaticWarningCode.con1('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 15, "Class '%s' declares non-static setter with the same name");
 
   /**
    * 7.3 Setters: It is a static warning if a class declares a static setter named <i>v=</i> and
    * also has a non-static member named <i>v</i>.
    */
-  static final StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = new StaticWarningCode('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 16, "Class '%s' declares non-static member with the same name");
+  static final StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = new StaticWarningCode.con1('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 16, "Class '%s' declares non-static member with the same name");
 
   /**
    * 12.11.2 Const: Given an instance creation expression of the form <i>const q(a<sub>1</sub>,
    * &hellip; a<sub>n</sub>)</i> it is a static warning if <i>q</i> is the constructor of an
    * abstract class but <i>q</i> is not a factory constructor.
    */
-  static final StaticWarningCode CONST_WITH_ABSTRACT_CLASS = new StaticWarningCode('CONST_WITH_ABSTRACT_CLASS', 17, "Abstract classes cannot be created with a 'const' expression");
+  static final StaticWarningCode CONST_WITH_ABSTRACT_CLASS = new StaticWarningCode.con1('CONST_WITH_ABSTRACT_CLASS', 17, "Abstract classes cannot be created with a 'const' expression");
 
   /**
    * 12.7 Maps: It is a static warning if the values of any two keys in a map literal are equal.
    */
-  static final StaticWarningCode EQUAL_KEYS_IN_MAP = new StaticWarningCode('EQUAL_KEYS_IN_MAP', 18, "Keys in a map cannot be equal");
+  static final StaticWarningCode EQUAL_KEYS_IN_MAP = new StaticWarningCode.con1('EQUAL_KEYS_IN_MAP', 18, "Keys in a map cannot be equal");
 
   /**
    * 14.2 Exports: It is a static warning to export two different libraries with the same name.
@@ -2145,7 +2192,7 @@
    * @param uri2 the uri pointing to a second library
    * @param name the shared name of the exported libraries
    */
-  static final StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode('EXPORT_DUPLICATED_LIBRARY_NAME', 19, "The exported libraries '%s' and '%s' should not have the same name '%s'");
+  static final StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode.con1('EXPORT_DUPLICATED_LIBRARY_NAME', 19, "The exported libraries '%s' and '%s' should not have the same name '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -2155,7 +2202,21 @@
    * @param argumentCount the actual number of positional arguments given
    * @see #NOT_ENOUGH_REQUIRED_ARGUMENTS
    */
-  static final StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = new StaticWarningCode('EXTRA_POSITIONAL_ARGUMENTS', 20, "%d positional arguments expected, but %d found");
+  static final StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = new StaticWarningCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 20, "%d positional arguments expected, but %d found");
+
+  /**
+   * 5. Variables: It is a static warning if a final instance variable that has been initialized at
+   * its point of declaration is also initialized in a constructor.
+   */
+  static final StaticWarningCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = new StaticWarningCode.con1('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 21, "Values cannot be set in the constructor if they are final, and have already been set");
+
+  /**
+   * 5. Variables: It is a static warning if a final instance variable that has been initialized at
+   * its point of declaration is also initialized in a constructor.
+   *
+   * @param name the name of the field in question
+   */
+  static final StaticWarningCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = new StaticWarningCode.con1('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 22, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
 
   /**
    * 7.6.1 Generative Constructors: Execution of an initializer of the form <b>this</b>.<i>v</i> =
@@ -2172,7 +2233,7 @@
    * @param initializerType the name of the type of the initializer expression
    * @param fieldType the name of the type of the field
    */
-  static final StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = new StaticWarningCode('FIELD_INITIALIZER_NOT_ASSIGNABLE', 21, "The initializer type '%s' cannot be assigned to the field type '%s'");
+  static final StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = new StaticWarningCode.con1('FIELD_INITIALIZER_NOT_ASSIGNABLE', 23, "The initializer type '%s' cannot be assigned to the field type '%s'");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -2181,7 +2242,7 @@
    * @param parameterType the name of the type of the field formal parameter
    * @param fieldType the name of the type of the field
    */
-  static final StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = new StaticWarningCode('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 22, "The parameter type '%s' is incompatable with the field type '%s'");
+  static final StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = new StaticWarningCode.con1('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 24, "The parameter type '%s' is incompatable with the field type '%s'");
 
   /**
    * 5 Variables: It is a static warning if a library, static or local variable <i>v</i> is final
@@ -2198,7 +2259,7 @@
    *
    * @param name the name of the uninitialized final variable
    */
-  static final StaticWarningCode FINAL_NOT_INITIALIZED = new StaticWarningCode('FINAL_NOT_INITIALIZED', 23, "The final variable '%s' must be initialized");
+  static final StaticWarningCode FINAL_NOT_INITIALIZED = new StaticWarningCode.con1('FINAL_NOT_INITIALIZED', 25, "The final variable '%s' must be initialized");
 
   /**
    * 14.1 Imports: It is a static warning to import two different libraries with the same name.
@@ -2207,7 +2268,7 @@
    * @param uri2 the uri pointing to a second library
    * @param name the shared name of the imported libraries
    */
-  static final StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode('IMPORT_DUPLICATED_LIBRARY_NAME', 24, "The imported libraries '%s' and '%s' should not have the same name '%s'");
+  static final StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode.con1('IMPORT_DUPLICATED_LIBRARY_NAME', 26, "The imported libraries '%s' and '%s' should not have the same name '%s'");
 
   /**
    * 8.1.1 Inheritance and Overriding: However, if there are multiple members <i>m<sub>1</sub>,
@@ -2219,7 +2280,7 @@
    * not all of the <i>m<sub>i</sub></i> are setters, none of the <i>m<sub>i</sub></i> are
    * inherited, and a static warning is issued.
    */
-  static final StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = new StaticWarningCode('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 25, "'%s' is inherited as a getter and also a method");
+  static final StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = new StaticWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 27, "'%s' is inherited as a getter and also a method");
 
   /**
    * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
@@ -2229,7 +2290,7 @@
    * @param memberName the name of the member with the name conflict
    * @param superclassName the name of the enclosing class that has the static member
    */
-  static final StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = new StaticWarningCode('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 26, "'%s' collides with a static member in the superclass '%s'");
+  static final StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = new StaticWarningCode.con1('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 28, "'%s' collides with a static member in the superclass '%s'");
 
   /**
    * 7.2 Getters: It is a static warning if a getter <i>m1</i> overrides a getter <i>m2</i> and the
@@ -2241,7 +2302,7 @@
    * @param className the name of the class where the overridden getter is declared
    * @see #INVALID_METHOD_OVERRIDE_RETURN_TYPE
    */
-  static final StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE = new StaticWarningCode('INVALID_GETTER_OVERRIDE_RETURN_TYPE', 27, "The return type '%s' is not assignable to '%s' as required from getter it is overriding from '%s'");
+  static final StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE = new StaticWarningCode.con1('INVALID_GETTER_OVERRIDE_RETURN_TYPE', 29, "The return type '%s' is not assignable to '%s' as required by the getter it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2252,7 +2313,7 @@
    *          actualParamTypeName
    * @param className the name of the class where the overridden method is declared
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE = new StaticWarningCode('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE', 28, "The parameter type '%s' is not assignable to '%s' as required from method it is overriding from '%s'");
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE', 30, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2264,7 +2325,7 @@
    * @param className the name of the class where the overridden method is declared
    * @see #INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode('INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE', 29, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE', 31, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2275,7 +2336,7 @@
    *          actualParamTypeName
    * @param className the name of the class where the overridden method is declared
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE = new StaticWarningCode('INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE', 30, "The parameter type '%s' is not assignable to '%s' as required from method it is overriding from '%s'");
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE', 32, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2287,7 +2348,7 @@
    * @param className the name of the class where the overridden method is declared
    * @see #INVALID_GETTER_OVERRIDE_RETURN_TYPE
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE = new StaticWarningCode('INVALID_METHOD_OVERRIDE_RETURN_TYPE', 31, "The return type '%s' is not assignable to '%s' as required from method it is overriding from '%s'");
+  static final StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_RETURN_TYPE', 33, "The return type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2295,7 +2356,7 @@
    * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
    * for <i>p</i>.
    */
-  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = new StaticWarningCode('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 32, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
+  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = new StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 34, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2303,7 +2364,37 @@
    * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
    * for <i>p</i>.
    */
-  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = new StaticWarningCode('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 33, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
+  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = new StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 35, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance member <i>m2</i> and <i>m1</i> does not declare all the named parameters declared by
+   * <i>m2</i>.
+   *
+   * @param paramCount the number of named parameters in the overridden member
+   * @param className the name of the class from the overridden method
+   */
+  static final StaticWarningCode INVALID_OVERRIDE_NAMED = new StaticWarningCode.con1('INVALID_OVERRIDE_NAMED', 36, "Missing the named parameter '%s' to match the overridden method from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance member <i>m2</i> and <i>m1</i> has fewer optional positional parameters than
+   * <i>m2</i>.
+   *
+   * @param paramCount the number of positional parameters in the overridden member
+   * @param className the name of the class from the overridden method
+   */
+  static final StaticWarningCode INVALID_OVERRIDE_POSITIONAL = new StaticWarningCode.con1('INVALID_OVERRIDE_POSITIONAL', 37, "Must have at least %d optional parameters to match the overridden method from '%s'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
+   * instance member <i>m2</i> and <i>m1</i> has a different number of required parameters than
+   * <i>m2</i>.
+   *
+   * @param paramCount the number of required parameters in the overridden member
+   * @param className the name of the class from the overridden method
+   */
+  static final StaticWarningCode INVALID_OVERRIDE_REQUIRED = new StaticWarningCode.con1('INVALID_OVERRIDE_REQUIRED', 38, "Must have exactly %d required parameters to match the overridden method from '%s'");
 
   /**
    * 7.3 Setters: It is a static warning if a setter <i>m1</i> overrides a setter <i>m2</i> and the
@@ -2315,7 +2406,7 @@
    * @param className the name of the class where the overridden setter is declared
    * @see #INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
    */
-  static final StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 34, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
+  static final StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 39, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -2331,7 +2422,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 35, "The element type '%s' cannot be assigned to the list type '%s'");
+  static final StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 40, "The element type '%s' cannot be assigned to the list type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -2347,7 +2438,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE = new StaticWarningCode('MAP_KEY_TYPE_NOT_ASSIGNABLE', 36, "The element type '%s' cannot be assigned to the map key type '%s'");
+  static final StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 41, "The element type '%s' cannot be assigned to the map key type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -2363,20 +2454,20 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = new StaticWarningCode('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 37, "The element type '%s' cannot be assigned to the map value type '%s'");
+  static final StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 42, "The element type '%s' cannot be assigned to the map value type '%s'");
 
   /**
    * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
    * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
    * assigned to <i>S</i>.
    */
-  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = new StaticWarningCode('MISMATCHED_GETTER_AND_SETTER_TYPES', 38, "The parameter type for setter '%s' is %s which is not assignable to its getter (of type %s)");
+  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = new StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES', 43, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s')");
 
   /**
    * 12.11.1 New: It is a static warning if <i>q</i> is a constructor of an abstract class and
    * <i>q</i> is not a factory constructor.
    */
-  static final StaticWarningCode NEW_WITH_ABSTRACT_CLASS = new StaticWarningCode('NEW_WITH_ABSTRACT_CLASS', 39, "Abstract classes cannot be created with a 'new' expression");
+  static final StaticWarningCode NEW_WITH_ABSTRACT_CLASS = new StaticWarningCode.con1('NEW_WITH_ABSTRACT_CLASS', 44, "Abstract classes cannot be created with a 'new' expression");
 
   /**
    * 15.8 Parameterized Types: Any use of a malbounded type gives rise to a static warning.
@@ -2387,7 +2478,7 @@
    * @see CompileTimeErrorCode#CONST_WITH_INVALID_TYPE_PARAMETERS
    * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
    */
-  static final StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS = new StaticWarningCode('NEW_WITH_INVALID_TYPE_PARAMETERS', 40, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static final StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS = new StaticWarningCode.con1('NEW_WITH_INVALID_TYPE_PARAMETERS', 45, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   /**
    * 12.11.1 New: It is a static warning if <i>T</i> is not a class accessible in the current scope,
@@ -2395,7 +2486,7 @@
    *
    * @param name the name of the non-type element
    */
-  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode('NEW_WITH_NON_TYPE', 41, "The name '%s' is not a class");
+  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode.con1('NEW_WITH_NON_TYPE', 46, "The name '%s' is not a class");
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
@@ -2406,7 +2497,7 @@
    * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
    * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
    */
-  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = new StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR', 42, "The class '%s' does not have a constructor '%s'");
+  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = new StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR', 47, "The class '%s' does not have a constructor '%s'");
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
@@ -2417,7 +2508,7 @@
    * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
    * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
    */
-  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 43, "The class '%s' does not have a default constructor");
+  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 48, "The class '%s' does not have a default constructor");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2437,7 +2528,7 @@
    * @param memberName the name of the fourth member
    * @param additionalCount the number of additional missing members that aren't listed
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 44, "Missing inherited members: '%s', '%s', '%s', '%s' and %d more");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 49, "Missing inherited members: '%s', '%s', '%s', '%s' and %d more");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2456,7 +2547,7 @@
    * @param memberName the name of the third member
    * @param memberName the name of the fourth member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 45, "Missing inherited members: '%s', '%s', '%s' and '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 50, "Missing inherited members: '%s', '%s', '%s' and '%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2472,7 +2563,7 @@
    *
    * @param memberName the name of the member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 46, "Missing inherited member '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 51, "Missing inherited member '%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2490,7 +2581,7 @@
    * @param memberName the name of the second member
    * @param memberName the name of the third member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 47, "Missing inherited members: '%s', '%s' and '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 52, "Missing inherited members: '%s', '%s' and '%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2507,7 +2598,7 @@
    * @param memberName the name of the first member
    * @param memberName the name of the second member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 48, "Missing inherited members: '%s' and '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 53, "Missing inherited members: '%s' and '%s'");
 
   /**
    * 13.11 Try: An on-catch clause of the form <i>on T catch (p<sub>1</sub>, p<sub>2</sub>) s</i> or
@@ -2517,18 +2608,18 @@
    *
    * @param name the name of the non-type element
    */
-  static final StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = new StaticWarningCode('NON_TYPE_IN_CATCH_CLAUSE', 49, "The name '%s' is not a type and cannot be used in an on-catch clause");
+  static final StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = new StaticWarningCode.con1('NON_TYPE_IN_CATCH_CLAUSE', 54, "The name '%s' is not a type and cannot be used in an on-catch clause");
 
   /**
    * 7.1.1 Operators: It is a static warning if the return type of the user-declared operator []= is
    * explicitly declared and not void.
    */
-  static final StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = new StaticWarningCode('NON_VOID_RETURN_FOR_OPERATOR', 50, "The return type of the operator []= must be 'void'");
+  static final StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = new StaticWarningCode.con1('NON_VOID_RETURN_FOR_OPERATOR', 55, "The return type of the operator []= must be 'void'");
 
   /**
    * 7.3 Setters: It is a static warning if a setter declares a return type other than void.
    */
-  static final StaticWarningCode NON_VOID_RETURN_FOR_SETTER = new StaticWarningCode('NON_VOID_RETURN_FOR_SETTER', 51, "The return type of the setter must be 'void'");
+  static final StaticWarningCode NON_VOID_RETURN_FOR_SETTER = new StaticWarningCode.con1('NON_VOID_RETURN_FOR_SETTER', 56, "The return type of the setter must be 'void'");
 
   /**
    * 15.1 Static Types: A type <i>T</i> is malformed iff: * <i>T</i> has the form <i>id</i> or the
@@ -2542,7 +2633,7 @@
    *
    * @param nonTypeName the name that is not a type
    */
-  static final StaticWarningCode NOT_A_TYPE = new StaticWarningCode('NOT_A_TYPE', 52, "%s is not a type");
+  static final StaticWarningCode NOT_A_TYPE = new StaticWarningCode.con1('NOT_A_TYPE', 57, "%s is not a type");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -2552,7 +2643,7 @@
    * @param argumentCount the actual number of positional arguments given
    * @see #EXTRA_POSITIONAL_ARGUMENTS
    */
-  static final StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new StaticWarningCode('NOT_ENOUGH_REQUIRED_ARGUMENTS', 53, "%d required argument(s) expected, but %d found");
+  static final StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new StaticWarningCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 58, "%d required argument(s) expected, but %d found");
 
   /**
    * 14.3 Parts: It is a static warning if the referenced part declaration <i>p</i> names a library
@@ -2561,7 +2652,7 @@
    * @param expectedLibraryName the name of expected library name
    * @param actualLibraryName the non-matching actual library name from the "part of" declaration
    */
-  static final StaticWarningCode PART_OF_DIFFERENT_LIBRARY = new StaticWarningCode('PART_OF_DIFFERENT_LIBRARY', 54, "Expected this library to be part of '%s', not '%s'");
+  static final StaticWarningCode PART_OF_DIFFERENT_LIBRARY = new StaticWarningCode.con1('PART_OF_DIFFERENT_LIBRARY', 59, "Expected this library to be part of '%s', not '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -2570,7 +2661,7 @@
    * @param redirectedName the name of the redirected constructor
    * @param redirectingName the name of the redirecting constructor
    */
-  static final StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = new StaticWarningCode('REDIRECT_TO_INVALID_FUNCTION_TYPE', 55, "The redirected constructor '%s' has incompatible parameters with '%s'");
+  static final StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = new StaticWarningCode.con1('REDIRECT_TO_INVALID_FUNCTION_TYPE', 60, "The redirected constructor '%s' has incompatible parameters with '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -2579,21 +2670,21 @@
    * @param redirectedName the name of the redirected constructor return type
    * @param redirectingName the name of the redirecting constructor return type
    */
-  static final StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = new StaticWarningCode('REDIRECT_TO_INVALID_RETURN_TYPE', 56, "The return type '%s' of the redirected constructor is not a subclass of '%s'");
+  static final StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = new StaticWarningCode.con1('REDIRECT_TO_INVALID_RETURN_TYPE', 61, "The return type '%s' of the redirected constructor is not a subclass of '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static final StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = new StaticWarningCode('REDIRECT_TO_MISSING_CONSTRUCTOR', 57, "The constructor '%s' could not be found in '%s'");
+  static final StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = new StaticWarningCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 62, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static final StaticWarningCode REDIRECT_TO_NON_CLASS = new StaticWarningCode('REDIRECT_TO_NON_CLASS', 58, "The name '%s' is not a type and cannot be used in a redirected constructor");
+  static final StaticWarningCode REDIRECT_TO_NON_CLASS = new StaticWarningCode.con1('REDIRECT_TO_NON_CLASS', 63, "The name '%s' is not a type and cannot be used in a redirected constructor");
 
   /**
    * 13.11 Return: Let <i>f</i> be the function immediately enclosing a return statement of the form
@@ -2603,7 +2694,7 @@
    * * The return type of <i>f</i> may not be assigned to void.
    * </ol>
    */
-  static final StaticWarningCode RETURN_WITHOUT_VALUE = new StaticWarningCode('RETURN_WITHOUT_VALUE', 59, "Missing return value after 'return'");
+  static final StaticWarningCode RETURN_WITHOUT_VALUE = new StaticWarningCode.con1('RETURN_WITHOUT_VALUE', 64, "Missing return value after 'return'");
 
   /**
    * 12.15.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
@@ -2611,19 +2702,19 @@
    *
    * @param memberName the name of the instance member
    */
-  static final StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = new StaticWarningCode('STATIC_ACCESS_TO_INSTANCE_MEMBER', 60, "Instance member '%s' cannot be accessed using static access");
+  static final StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = new StaticWarningCode.con1('STATIC_ACCESS_TO_INSTANCE_MEMBER', 65, "Instance member '%s' cannot be accessed using static access");
 
   /**
    * 13.9 Switch: It is a static warning if the type of <i>e</i> may not be assigned to the type of
    * <i>e<sub>k</sub></i>.
    */
-  static final StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = new StaticWarningCode('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 61, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
+  static final StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = new StaticWarningCode.con1('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 66, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
 
   /**
    * 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type available in the
    * current lexical scope.
    */
-  static final StaticWarningCode TYPE_TEST_NON_TYPE = new StaticWarningCode('TYPE_TEST_NON_TYPE', 62, "The name '%s' is not a type and cannot be used in an 'is' expression");
+  static final StaticWarningCode TYPE_TEST_NON_TYPE = new StaticWarningCode.con1('TYPE_TEST_NON_TYPE', 67, "The name '%s' is not a type and cannot be used in an 'is' expression");
 
   /**
    * 10 Generics: However, a type parameter is considered to be a malformed type when referenced by
@@ -2632,7 +2723,7 @@
    * 15.1 Static Types: Any use of a malformed type gives rise to a static warning. A malformed type
    * is then interpreted as dynamic by the static type checker and the runtime.
    */
-  static final StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC = new StaticWarningCode('TYPE_PARAMETER_REFERENCED_BY_STATIC', 63, "Static members cannot reference type parameters");
+  static final StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC = new StaticWarningCode.con1('TYPE_PARAMETER_REFERENCED_BY_STATIC', 68, "Static members cannot reference type parameters");
 
   /**
    * 12.15.3 Static Invocation: A static method invocation <i>i</i> has the form
@@ -2642,12 +2733,12 @@
    *
    * @param undefinedClassName the name of the undefined class
    */
-  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode('UNDEFINED_CLASS', 64, "Undefined class '%s'");
+  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode.con1('UNDEFINED_CLASS', 69, "Undefined class '%s'");
 
   /**
    * Same as [UNDEFINED_CLASS], but to catch using "boolean" instead of "bool".
    */
-  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode('UNDEFINED_CLASS_BOOLEAN', 65, "Undefined class 'boolean'; did you mean 'bool'?");
+  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode.con1('UNDEFINED_CLASS_BOOLEAN', 70, "Undefined class 'boolean'; did you mean 'bool'?");
 
   /**
    * 12.17 Getter Invocation: It is a static warning if there is no class <i>C</i> in the enclosing
@@ -2657,7 +2748,7 @@
    * @param getterName the name of the getter
    * @param enclosingType the name of the enclosing type where the getter is being looked for
    */
-  static final StaticWarningCode UNDEFINED_GETTER = new StaticWarningCode('UNDEFINED_GETTER', 66, "There is no such getter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_GETTER = new StaticWarningCode.con1('UNDEFINED_GETTER', 71, "There is no such getter '%s' in '%s'");
 
   /**
    * 12.30 Identifier Reference: It is as static warning if an identifier expression of the form
@@ -2665,7 +2756,7 @@
    * setter) or variable initializer and there is no declaration <i>d</i> with name <i>id</i> in the
    * lexical scope enclosing the expression.
    */
-  static final StaticWarningCode UNDEFINED_IDENTIFIER = new StaticWarningCode('UNDEFINED_IDENTIFIER', 67, "Undefined name '%s'");
+  static final StaticWarningCode UNDEFINED_IDENTIFIER = new StaticWarningCode.con1('UNDEFINED_IDENTIFIER', 72, "Undefined name '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -2674,7 +2765,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static final StaticWarningCode UNDEFINED_NAMED_PARAMETER = new StaticWarningCode('UNDEFINED_NAMED_PARAMETER', 68, "The named parameter '%s' is not defined");
+  static final StaticWarningCode UNDEFINED_NAMED_PARAMETER = new StaticWarningCode.con1('UNDEFINED_NAMED_PARAMETER', 73, "The named parameter '%s' is not defined");
 
   /**
    * 12.18 Assignment: It is as static warning if an assignment of the form <i>v = e</i> occurs
@@ -2689,7 +2780,7 @@
    * @param setterName the name of the getter
    * @param enclosingType the name of the enclosing type where the setter is being looked for
    */
-  static final StaticWarningCode UNDEFINED_SETTER = new StaticWarningCode('UNDEFINED_SETTER', 69, "There is no such setter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_SETTER = new StaticWarningCode.con1('UNDEFINED_SETTER', 74, "There is no such setter '%s' in '%s'");
 
   /**
    * 12.15.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
@@ -2698,7 +2789,7 @@
    * @param methodName the name of the method
    * @param enclosingType the name of the enclosing type where the method is being looked for
    */
-  static final StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = new StaticWarningCode('UNDEFINED_STATIC_METHOD_OR_GETTER', 70, "There is no such static method '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = new StaticWarningCode.con1('UNDEFINED_STATIC_METHOD_OR_GETTER', 75, "There is no such static method '%s' in '%s'");
   static final List<StaticWarningCode> values = [
       AMBIGUOUS_IMPORT,
       ARGUMENT_TYPE_NOT_ASSIGNABLE,
@@ -2721,6 +2812,8 @@
       EQUAL_KEYS_IN_MAP,
       EXPORT_DUPLICATED_LIBRARY_NAME,
       EXTRA_POSITIONAL_ARGUMENTS,
+      FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION,
+      FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR,
       FIELD_INITIALIZER_NOT_ASSIGNABLE,
       FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE,
       FINAL_NOT_INITIALIZED,
@@ -2734,6 +2827,9 @@
       INVALID_METHOD_OVERRIDE_RETURN_TYPE,
       INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED,
       INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL,
+      INVALID_OVERRIDE_NAMED,
+      INVALID_OVERRIDE_POSITIONAL,
+      INVALID_OVERRIDE_REQUIRED,
       INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE,
       LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
       MAP_KEY_TYPE_NOT_ASSIGNABLE,
@@ -2772,31 +2868,40 @@
       UNDEFINED_SETTER,
       UNDEFINED_STATIC_METHOD_OR_GETTER];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
-   * The message template used to create the message to be displayed for this error.
+   * The template used to create the message to be displayed for this error.
    */
   String _message;
 
   /**
-   * Initialize a newly created error code to have the given type and message.
+   * The template used to create the correction to be displayed for this error, or `null` if
+   * there is no correction information for this error.
+   */
+  String correction7;
+
+  /**
+   * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  StaticWarningCode(this.name, this.ordinal, String message) {
+  StaticWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
     this._message = message;
   }
+
+  /**
+   * Initialize a newly created error code to have the given message and correction.
+   *
+   * @param message the template used to create the message to be displayed for the error
+   * @param correction the template used to create the correction to be displayed for the error
+   */
+  StaticWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this._message = message;
+    this.correction7 = correction;
+  }
+  String get correction => correction7;
   ErrorSeverity get errorSeverity => ErrorType.STATIC_WARNING.severity;
   String get message => _message;
   ErrorType get type => ErrorType.STATIC_WARNING;
-  int compareTo(StaticWarningCode other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 /**
  * The interface `AnalysisErrorListener` defines the behavior of objects that listen for
@@ -2830,7 +2935,7 @@
  *
  * @coverage dart.engine.error
  */
-class HtmlWarningCode implements Enum<HtmlWarningCode>, ErrorCode {
+class HtmlWarningCode extends Enum<HtmlWarningCode> implements ErrorCode {
 
   /**
    * An error code indicating that the value of the 'src' attribute of a Dart script tag is not a
@@ -2838,7 +2943,7 @@
    *
    * @param uri the URI that is invalid
    */
-  static final HtmlWarningCode INVALID_URI = new HtmlWarningCode('INVALID_URI', 0, "Invalid URI syntax: '%s'");
+  static final HtmlWarningCode INVALID_URI = new HtmlWarningCode.con1('INVALID_URI', 0, "Invalid URI syntax: '%s'");
 
   /**
    * An error code indicating that the value of the 'src' attribute of a Dart script tag references
@@ -2846,34 +2951,43 @@
    *
    * @param uri the URI pointing to a non-existent file
    */
-  static final HtmlWarningCode URI_DOES_NOT_EXIST = new HtmlWarningCode('URI_DOES_NOT_EXIST', 1, "Target of URI does not exist: '%s'");
+  static final HtmlWarningCode URI_DOES_NOT_EXIST = new HtmlWarningCode.con1('URI_DOES_NOT_EXIST', 1, "Target of URI does not exist: '%s'");
   static final List<HtmlWarningCode> values = [INVALID_URI, URI_DOES_NOT_EXIST];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
-   * The message template used to create the message to be displayed for this error.
+   * The template used to create the message to be displayed for this error.
    */
   String _message;
 
   /**
-   * Initialize a newly created error code to have the given type and message.
+   * The template used to create the correction to be displayed for this error, or `null` if
+   * there is no correction information for this error.
+   */
+  String correction4;
+
+  /**
+   * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  HtmlWarningCode(this.name, this.ordinal, String message) {
+  HtmlWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
     this._message = message;
   }
+
+  /**
+   * Initialize a newly created error code to have the given message and correction.
+   *
+   * @param message the template used to create the message to be displayed for the error
+   * @param correction the template used to create the correction to be displayed for the error
+   */
+  HtmlWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this._message = message;
+    this.correction4 = correction;
+  }
+  String get correction => correction4;
   ErrorSeverity get errorSeverity => ErrorSeverity.WARNING;
   String get message => _message;
   ErrorType get type => ErrorType.STATIC_WARNING;
-  int compareTo(HtmlWarningCode other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 /**
  * The enumeration `StaticTypeWarningCode` defines the error codes used for static type
@@ -2883,7 +2997,7 @@
  *
  * @coverage dart.engine.error
  */
-class StaticTypeWarningCode implements Enum<StaticTypeWarningCode>, ErrorCode {
+class StaticTypeWarningCode extends Enum<StaticTypeWarningCode> implements ErrorCode {
 
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
@@ -2891,7 +3005,7 @@
    *
    * @see #UNDEFINED_SETTER
    */
-  static final StaticTypeWarningCode INACCESSIBLE_SETTER = new StaticTypeWarningCode('INACCESSIBLE_SETTER', 0, "");
+  static final StaticTypeWarningCode INACCESSIBLE_SETTER = new StaticTypeWarningCode.con1('INACCESSIBLE_SETTER', 0, "");
 
   /**
    * 8.1.1 Inheritance and Overriding: However, if there are multiple members <i>m<sub>1</sub>,
@@ -2913,7 +3027,16 @@
    * * Otherwise none of the members <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> is inherited.
    * </ol>
    */
-  static final StaticTypeWarningCode INCONSISTENT_METHOD_INHERITANCE = new StaticTypeWarningCode('INCONSISTENT_METHOD_INHERITANCE', 1, "'%s' is inherited by at least two interfaces inconsistently");
+  static final StaticTypeWarningCode INCONSISTENT_METHOD_INHERITANCE = new StaticTypeWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE', 1, "'%s' is inherited by at least two interfaces inconsistently");
+
+  /**
+   * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does not have an
+   * accessible (3.2) instance member named <i>m</i>.
+   *
+   * @param memberName the name of the static member
+   * @see UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
+   */
+  static final StaticTypeWarningCode INSTANCE_ACCESS_TO_STATIC_MEMBER = new StaticTypeWarningCode.con1('INSTANCE_ACCESS_TO_STATIC_MEMBER', 2, "Static member '%s' cannot be accessed using instance access");
 
   /**
    * 12.18 Assignment: It is a static type warning if the static type of <i>e</i> may not be
@@ -2930,16 +3053,9 @@
    * @param rhsTypeName the name of the right hand side type
    * @param lhsTypeName the name of the left hand side type
    */
-  static final StaticTypeWarningCode INVALID_ASSIGNMENT = new StaticTypeWarningCode('INVALID_ASSIGNMENT', 2, "A value of type '%s' cannot be assigned to a variable of type '%s'");
+  static final StaticTypeWarningCode INVALID_ASSIGNMENT = new StaticTypeWarningCode.con1('INVALID_ASSIGNMENT', 3, "A value of type '%s' cannot be assigned to a variable of type '%s'");
 
   /**
-   * 12.14.4 Function Expression Invocation: A function expression invocation <i>i</i> has the form
-   * <i>e<sub>f</sub>(a<sub>1</sub>, &hellip; a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
-   * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>, where <i>e<sub>f</sub></i> is an expression.
-   *
-   * It is a static type warning if the static type <i>F</i> of <i>e<sub>f</sub></i> may not be
-   * assigned to a function type.
-   *
    * 12.15.1 Ordinary Invocation: An ordinary method invocation <i>i</i> has the form
    * <i>o.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;
    * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
@@ -2959,7 +3075,17 @@
    *
    * @param nonFunctionIdentifier the name of the identifier that is not a function type
    */
-  static final StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION = new StaticTypeWarningCode('INVOCATION_OF_NON_FUNCTION', 3, "'%s' is not a method");
+  static final StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION = new StaticTypeWarningCode.con1('INVOCATION_OF_NON_FUNCTION', 4, "'%s' is not a method");
+
+  /**
+   * 12.14.4 Function Expression Invocation: A function expression invocation <i>i</i> has the form
+   * <i>e<sub>f</sub>(a<sub>1</sub>, &hellip; a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
+   * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>, where <i>e<sub>f</sub></i> is an expression.
+   *
+   * It is a static type warning if the static type <i>F</i> of <i>e<sub>f</sub></i> may not be
+   * assigned to a function type.
+   */
+  static final StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION_EXPRESSION = new StaticTypeWarningCode.con1('INVOCATION_OF_NON_FUNCTION_EXPRESSION', 5, "Cannot invoke a non-function");
 
   /**
    * 12.19 Conditional: It is a static type warning if the type of <i>e<sub>1</sub></i> may not be
@@ -2972,19 +3098,19 @@
    *
    * 13.8 Do: It is a static type warning if the type of <i>e</i> cannot be assigned to bool.
    */
-  static final StaticTypeWarningCode NON_BOOL_CONDITION = new StaticTypeWarningCode('NON_BOOL_CONDITION', 4, "Conditions must have a static type of 'bool'");
+  static final StaticTypeWarningCode NON_BOOL_CONDITION = new StaticTypeWarningCode.con1('NON_BOOL_CONDITION', 6, "Conditions must have a static type of 'bool'");
 
   /**
    * 13.15 Assert: It is a static type warning if the type of <i>e</i> may not be assigned to either
    * bool or () &rarr; bool
    */
-  static final StaticTypeWarningCode NON_BOOL_EXPRESSION = new StaticTypeWarningCode('NON_BOOL_EXPRESSION', 5, "Assertions must be on either a 'bool' or '() -> bool'");
+  static final StaticTypeWarningCode NON_BOOL_EXPRESSION = new StaticTypeWarningCode.con1('NON_BOOL_EXPRESSION', 7, "Assertions must be on either a 'bool' or '() -> bool'");
 
   /**
    * 15.8 Parameterized Types: It is a static type warning if <i>A<sub>i</sub>, 1 &lt;= i &lt;=
    * n</i> does not denote a type in the enclosing lexical scope.
    */
-  static final StaticTypeWarningCode NON_TYPE_AS_TYPE_ARGUMENT = new StaticTypeWarningCode('NON_TYPE_AS_TYPE_ARGUMENT', 6, "The name '%s' is not a type and cannot be used as a parameterized type");
+  static final StaticTypeWarningCode NON_TYPE_AS_TYPE_ARGUMENT = new StaticTypeWarningCode.con1('NON_TYPE_AS_TYPE_ARGUMENT', 8, "The name '%s' is not a type and cannot be used as a parameterized type");
 
   /**
    * 13.11 Return: It is a static type warning if the type of <i>e</i> may not be assigned to the
@@ -2994,7 +3120,7 @@
    * @param expectedReturnType the expected return type as defined by the method
    * @param methodName the name of the method
    */
-  static final StaticTypeWarningCode RETURN_OF_INVALID_TYPE = new StaticTypeWarningCode('RETURN_OF_INVALID_TYPE', 7, "The return type '%s' is not a '%s', as defined by the method '%s'");
+  static final StaticTypeWarningCode RETURN_OF_INVALID_TYPE = new StaticTypeWarningCode.con1('RETURN_OF_INVALID_TYPE', 9, "The return type '%s' is not a '%s', as defined by the method '%s'");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -3019,15 +3145,7 @@
    *          limited by the bound as specified in the class declaration
    * @param boundingTypeName the name of the bounding type
    */
-  static final StaticTypeWarningCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = new StaticTypeWarningCode('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 8, "'%s' does not extend '%s'");
-
-  /**
-   * Specification reference needed. This is equivalent to [UNDEFINED_METHOD], but for
-   * top-level functions.
-   *
-   * @param methodName the name of the method that is undefined
-   */
-  static final StaticTypeWarningCode UNDEFINED_FUNCTION = new StaticTypeWarningCode('UNDEFINED_FUNCTION', 9, "The function '%s' is not defined");
+  static final StaticTypeWarningCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = new StaticTypeWarningCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 10, "'%s' does not extend '%s'");
 
   /**
    * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is a static type
@@ -3036,7 +3154,7 @@
    * @param getterName the name of the getter
    * @param enclosingType the name of the enclosing type where the getter is being looked for
    */
-  static final StaticTypeWarningCode UNDEFINED_GETTER = new StaticTypeWarningCode('UNDEFINED_GETTER', 10, "There is no such getter '%s' in '%s'");
+  static final StaticTypeWarningCode UNDEFINED_GETTER = new StaticTypeWarningCode.con1('UNDEFINED_GETTER', 11, "There is no such getter '%s' in '%s'");
 
   /**
    * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>. It is a static type
@@ -3045,7 +3163,7 @@
    * @param methodName the name of the method that is undefined
    * @param typeName the resolved type name that the method lookup is happening on
    */
-  static final StaticTypeWarningCode UNDEFINED_METHOD = new StaticTypeWarningCode('UNDEFINED_METHOD', 11, "The method '%s' is not defined for the class '%s'");
+  static final StaticTypeWarningCode UNDEFINED_METHOD = new StaticTypeWarningCode.con1('UNDEFINED_METHOD', 12, "The method '%s' is not defined for the class '%s'");
 
   /**
    * 12.18 Assignment: Evaluation of an assignment of the form
@@ -3063,7 +3181,7 @@
    * @param operator the name of the operator
    * @param enclosingType the name of the enclosing type where the operator is being looked for
    */
-  static final StaticTypeWarningCode UNDEFINED_OPERATOR = new StaticTypeWarningCode('UNDEFINED_OPERATOR', 12, "There is no such operator '%s' in '%s'");
+  static final StaticTypeWarningCode UNDEFINED_OPERATOR = new StaticTypeWarningCode.con1('UNDEFINED_OPERATOR', 13, "There is no such operator '%s' in '%s'");
 
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
@@ -3073,7 +3191,7 @@
    * @param enclosingType the name of the enclosing type where the setter is being looked for
    * @see #INACCESSIBLE_SETTER
    */
-  static final StaticTypeWarningCode UNDEFINED_SETTER = new StaticTypeWarningCode('UNDEFINED_SETTER', 13, "There is no such setter '%s' in '%s'");
+  static final StaticTypeWarningCode UNDEFINED_SETTER = new StaticTypeWarningCode.con1('UNDEFINED_SETTER', 14, "There is no such setter '%s' in '%s'");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -3084,7 +3202,17 @@
    * @param methodName the name of the method that is undefined
    * @param typeName the resolved type name that the method lookup is happening on
    */
-  static final StaticTypeWarningCode UNDEFINED_SUPER_METHOD = new StaticTypeWarningCode('UNDEFINED_SUPER_METHOD', 14, "There is no such method '%s' in '%s'");
+  static final StaticTypeWarningCode UNDEFINED_SUPER_METHOD = new StaticTypeWarningCode.con1('UNDEFINED_SUPER_METHOD', 15, "There is no such method '%s' in '%s'");
+
+  /**
+   * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does not have an
+   * accessible (3.2) instance member named <i>m</i>.
+   *
+   * This is a specialization of [INSTANCE_ACCESS_TO_STATIC_MEMBER] that is used when we are
+   * able to find the name defined in a supertype. It exists to provide a more informative error
+   * message.
+   */
+  static final StaticTypeWarningCode UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER = new StaticTypeWarningCode.con1('UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER', 16, "Static members from supertypes must be qualified by the name of the defining type");
 
   /**
    * 15.8 Parameterized Types: It is a static type warning if <i>G</i> is not a generic type with
@@ -3096,48 +3224,59 @@
    * @see CompileTimeErrorCode#CONST_WITH_INVALID_TYPE_PARAMETERS
    * @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
    */
-  static final StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = new StaticTypeWarningCode('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 15, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static final StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = new StaticTypeWarningCode.con1('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 17, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
   static final List<StaticTypeWarningCode> values = [
       INACCESSIBLE_SETTER,
       INCONSISTENT_METHOD_INHERITANCE,
+      INSTANCE_ACCESS_TO_STATIC_MEMBER,
       INVALID_ASSIGNMENT,
       INVOCATION_OF_NON_FUNCTION,
+      INVOCATION_OF_NON_FUNCTION_EXPRESSION,
       NON_BOOL_CONDITION,
       NON_BOOL_EXPRESSION,
       NON_TYPE_AS_TYPE_ARGUMENT,
       RETURN_OF_INVALID_TYPE,
       TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
-      UNDEFINED_FUNCTION,
       UNDEFINED_GETTER,
       UNDEFINED_METHOD,
       UNDEFINED_OPERATOR,
       UNDEFINED_SETTER,
       UNDEFINED_SUPER_METHOD,
+      UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
       WRONG_NUMBER_OF_TYPE_ARGUMENTS];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
-   * The message template used to create the message to be displayed for this error.
+   * The template used to create the message to be displayed for this error.
    */
   String _message;
 
   /**
-   * Initialize a newly created error code to have the given type and message.
+   * The template used to create the correction to be displayed for this error, or `null` if
+   * there is no correction information for this error.
+   */
+  String correction6;
+
+  /**
+   * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  StaticTypeWarningCode(this.name, this.ordinal, String message) {
+  StaticTypeWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
     this._message = message;
   }
+
+  /**
+   * Initialize a newly created error code to have the given message and correction.
+   *
+   * @param message the template used to create the message to be displayed for the error
+   * @param correction the template used to create the correction to be displayed for the error
+   */
+  StaticTypeWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this._message = message;
+    this.correction6 = correction;
+  }
+  String get correction => correction6;
   ErrorSeverity get errorSeverity => ErrorType.STATIC_TYPE_WARNING.severity;
   String get message => _message;
   ErrorType get type => ErrorType.STATIC_TYPE_WARNING;
-  int compareTo(StaticTypeWarningCode other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/generated/html.dart b/pkg/analyzer_experimental/lib/src/generated/html.dart
index b69bda3..d8e191f 100644
--- a/pkg/analyzer_experimental/lib/src/generated/html.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/html.dart
@@ -5,8 +5,6 @@
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'source.dart';
-import 'error.dart';
-import 'instrumentation.dart';
 import 'element.dart' show HtmlElementImpl;
 import 'engine.dart' show AnalysisEngine;
 /**
@@ -287,7 +285,7 @@
    *
    * @param visitor the visitor that will be used to visit the children of this node
    */
-  void visitChildren(XmlVisitor<Object> visitor);
+  void visitChildren(XmlVisitor visitor);
 
   /**
    * Make this node the parent of the given child nodes.
@@ -924,7 +922,7 @@
  *
  * @coverage dart.engine.html
  */
-class TokenType implements Enum<TokenType> {
+class TokenType extends Enum<TokenType> {
 
   /**
    * The type of the token that marks the end of the input.
@@ -955,18 +953,12 @@
       TAG,
       TEXT];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
    * The lexeme that defines this type of token, or `null` if there is more than one possible
    * lexeme for this type of token.
    */
   String _lexeme;
-  TokenType(this.name, this.ordinal, String lexeme) {
+  TokenType(String name, int ordinal, String lexeme) : super(name, ordinal) {
     this._lexeme = lexeme;
   }
 
@@ -977,9 +969,6 @@
    * @return the lexeme that defines this type of token
    */
   String get lexeme => _lexeme;
-  int compareTo(TokenType other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 class TokenType_EOF extends TokenType {
   TokenType_EOF(String name, int ordinal, String arg0) : super(name, ordinal, arg0);
@@ -1063,7 +1052,7 @@
    * @return the value or `null` if this represents a badly formed attribute
    */
   Token get value => _value;
-  void visitChildren(XmlVisitor<Object> visitor) {
+  void visitChildren(XmlVisitor visitor) {
   }
 }
 /**
@@ -1626,7 +1615,7 @@
    * @return the children (not `null`, contains no `null`s)
    */
   List<XmlTagNode> get tagNodes => _tagNodes;
-  void visitChildren(XmlVisitor<Object> visitor) {
+  void visitChildren(XmlVisitor visitor) {
     for (XmlAttributeNode node in _attributes) {
       node.accept(visitor);
     }
@@ -1755,7 +1744,7 @@
   void set element(HtmlElementImpl element2) {
     this._element = element2;
   }
-  void visitChildren(XmlVisitor<Object> visitor) {
+  void visitChildren(XmlVisitor visitor) {
     for (XmlTagNode node in _tagNodes) {
       node.accept(visitor);
     }
diff --git a/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart b/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
index 5dbf578..7752811 100644
--- a/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
@@ -255,7 +255,7 @@
  *
  * @coverage dart.engine.utilities
  */
-class InstrumentationLevel implements Enum<InstrumentationLevel> {
+class InstrumentationLevel extends Enum<InstrumentationLevel> {
 
   /** Recording all instrumented information */
   static final InstrumentationLevel EVERYTHING = new InstrumentationLevel('EVERYTHING', 0);
@@ -266,12 +266,6 @@
   /** Nothing recorded */
   static final InstrumentationLevel OFF = new InstrumentationLevel('OFF', 2);
   static final List<InstrumentationLevel> values = [EVERYTHING, METRICS, OFF];
-
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
   static InstrumentationLevel fromString(String str) {
     if (str == "EVERYTHING") {
       return InstrumentationLevel.EVERYTHING;
@@ -284,10 +278,7 @@
     }
     throw new IllegalArgumentException("Unrecognised InstrumentationLevel");
   }
-  InstrumentationLevel(this.name, this.ordinal);
-  int compareTo(InstrumentationLevel other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
+  InstrumentationLevel(String name, int ordinal) : super(name, ordinal);
 }
 /**
  * The interface `InstrumentationLogger` defines the behavior of objects that are used to log
diff --git a/pkg/analyzer_experimental/lib/src/generated/java_core.dart b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
index 4ebd170..c3dadd0 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_core.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
@@ -50,7 +50,26 @@
     }
   }
   if (tTypeName == "ExecutableElement") {
-    if (oTypeName == "MethodElementImpl" || oTypeName == "FunctionElementImpl") {
+    if (oTypeName == "MethodElementImpl" ||
+        oTypeName == "FunctionElementImpl" ||
+        oTypeName == "PropertyAccessorElementImpl") {
+      return true;
+    }
+  }
+  if (tTypeName == "ParameterElement") {
+    if (oTypeName == "FieldFormalParameterElementImpl" ||
+        oTypeName == "DefaultFieldFormalParameterElementImpl" ||
+        oTypeName == "DefaultParameterElementImpl") {
+      return true;
+    }
+  }
+  if (tTypeName == "VariableElement") {
+    if (oTypeName == "LocalVariableElementImpl" ||
+        oTypeName == "ConstLocalVariableElementImpl" ||
+        oTypeName == "FieldElementImpl" ||
+        oTypeName == "ConstFieldElementImpl" ||
+        oTypeName == "TopLevelVariableElementImpl" ||
+        oTypeName == "ConstTopLevelVariableElementImpl") {
       return true;
     }
   }
@@ -535,7 +554,13 @@
   }
 }
 
-abstract class Enum<E> implements Comparable<E> {
-  int get ordinal;
-  String get name;
+abstract class Enum<E extends Enum> implements Comparable<E> {
+  /// The name of this enum constant, as declared in the enum declaration.
+  final String name;
+  /// The position in the enum declaration.
+  final int ordinal;
+  Enum(this.name, this.ordinal);
+  int get hashCode => ordinal;
+  String toString() => name;
+  int compareTo(E other) => ordinal - other.ordinal;
 }
diff --git a/pkg/analyzer_experimental/lib/src/generated/parser.dart b/pkg/analyzer_experimental/lib/src/generated/parser.dart
index 84fec68..ed3c416 100644
--- a/pkg/analyzer_experimental/lib/src/generated/parser.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/parser.dart
@@ -427,11 +427,11 @@
    */
   void appendScalarValue(JavaStringBuilder builder, String escapeSequence, int scalarValue, int startIndex, int endIndex) {
     if (scalarValue < 0 || scalarValue > Character.MAX_CODE_POINT || (scalarValue >= 0xD800 && scalarValue <= 0xDFFF)) {
-      reportError7(ParserErrorCode.INVALID_CODE_POINT, [escapeSequence]);
+      reportError8(ParserErrorCode.INVALID_CODE_POINT, [escapeSequence]);
       return;
     }
     if (scalarValue < Character.MAX_VALUE) {
-      builder.appendChar((scalarValue as int));
+      builder.appendChar(scalarValue as int);
     } else {
       builder.append(Character.toChars(scalarValue));
     }
@@ -570,7 +570,7 @@
    */
   void ensureAssignable(Expression expression) {
     if (expression != null && !expression.isAssignable) {
-      reportError7(ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE, []);
+      reportError8(ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE, []);
     }
   }
 
@@ -585,7 +585,7 @@
     if (matches(keyword)) {
       return andAdvance;
     }
-    reportError7(ParserErrorCode.EXPECTED_TOKEN, [keyword.syntax]);
+    reportError8(ParserErrorCode.EXPECTED_TOKEN, [keyword.syntax]);
     return _currentToken;
   }
 
@@ -601,9 +601,9 @@
       return andAdvance;
     }
     if (identical(type, TokenType.SEMICOLON)) {
-      reportError8(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [type.lexeme]);
+      reportError9(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [type.lexeme]);
     } else {
-      reportError7(ParserErrorCode.EXPECTED_TOKEN, [type.lexeme]);
+      reportError8(ParserErrorCode.EXPECTED_TOKEN, [type.lexeme]);
     }
     return _currentToken;
   }
@@ -1136,7 +1136,7 @@
   ArgumentDefinitionTest parseArgumentDefinitionTest() {
     Token question = expect2(TokenType.QUESTION);
     SimpleIdentifier identifier = parseSimpleIdentifier();
-    reportError8(ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST, question, []);
+    reportError9(ParserErrorCode.DEPRECATED_ARGUMENT_DEFINITION_TEST, question, []);
     return new ArgumentDefinitionTest.full(question, identifier);
   }
 
@@ -1169,7 +1169,7 @@
       arguments.add(argument);
       if (foundNamedArgument) {
         if (!generatedError && argument is! NamedExpression) {
-          reportError7(ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT, []);
+          reportError8(ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT, []);
           generatedError = true;
         }
       } else if (argument is NamedExpression) {
@@ -1223,7 +1223,7 @@
       while (matches5(TokenType.OPEN_PAREN)) {
         ArgumentList argumentList = parseArgumentList();
         if (expression is SimpleIdentifier) {
-          expression = new MethodInvocation.full(null, null, (expression as SimpleIdentifier), argumentList);
+          expression = new MethodInvocation.full(null, null, expression as SimpleIdentifier, argumentList);
         } else if (expression is PrefixedIdentifier) {
           PrefixedIdentifier identifier = expression as PrefixedIdentifier;
           expression = new MethodInvocation.full(identifier.prefix, identifier.period, identifier.identifier, argumentList);
@@ -1274,7 +1274,7 @@
       return new PropertyAccess.full(prefix, period, parseSimpleIdentifier());
     } else {
       if (!optional) {
-        reportError7(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, []);
+        reportError8(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, []);
       }
       return prefix;
     }
@@ -1375,7 +1375,7 @@
         statements.add(statement);
       }
       if (identical(_currentToken, statementStart)) {
-        reportError8(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       }
       statementStart = _currentToken;
@@ -1401,7 +1401,7 @@
       label = parseSimpleIdentifier();
     }
     if (!_inLoop && !_inSwitch && label == null) {
-      reportError8(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, breakKeyword, []);
+      reportError9(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, breakKeyword, []);
     }
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new BreakStatement.full(breakKeyword, label, semicolon);
@@ -1437,7 +1437,7 @@
       expression = new IndexExpression.forCascade_full(period, leftBracket, index, rightBracket);
       period = null;
     } else {
-      reportError8(ParserErrorCode.MISSING_IDENTIFIER, _currentToken, [_currentToken.lexeme]);
+      reportError9(ParserErrorCode.MISSING_IDENTIFIER, _currentToken, [_currentToken.lexeme]);
       functionName = createSyntheticIdentifier();
     }
     if (identical(_currentToken.type, TokenType.OPEN_PAREN)) {
@@ -1506,29 +1506,29 @@
         if (extendsClause == null) {
           extendsClause = parseExtendsClause();
           if (withClause != null) {
-            reportError8(ParserErrorCode.WITH_BEFORE_EXTENDS, withClause.withKeyword, []);
+            reportError9(ParserErrorCode.WITH_BEFORE_EXTENDS, withClause.withKeyword, []);
           } else if (implementsClause != null) {
-            reportError8(ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS, implementsClause.keyword, []);
+            reportError9(ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS, implementsClause.keyword, []);
           }
         } else {
-          reportError8(ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES, extendsClause.keyword, []);
+          reportError9(ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES, extendsClause.keyword, []);
           parseExtendsClause();
         }
       } else if (matches(Keyword.WITH)) {
         if (withClause == null) {
           withClause = parseWithClause();
           if (implementsClause != null) {
-            reportError8(ParserErrorCode.IMPLEMENTS_BEFORE_WITH, implementsClause.keyword, []);
+            reportError9(ParserErrorCode.IMPLEMENTS_BEFORE_WITH, implementsClause.keyword, []);
           }
         } else {
-          reportError8(ParserErrorCode.MULTIPLE_WITH_CLAUSES, withClause.withKeyword, []);
+          reportError9(ParserErrorCode.MULTIPLE_WITH_CLAUSES, withClause.withKeyword, []);
           parseWithClause();
         }
       } else if (matches(Keyword.IMPLEMENTS)) {
         if (implementsClause == null) {
           implementsClause = parseImplementsClause();
         } else {
-          reportError8(ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES, implementsClause.keyword, []);
+          reportError9(ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES, implementsClause.keyword, []);
           parseImplementsClause();
         }
       } else {
@@ -1536,7 +1536,7 @@
       }
     }
     if (withClause != null && extendsClause == null) {
-      reportError8(ParserErrorCode.WITH_WITHOUT_EXTENDS, withClause.withKeyword, []);
+      reportError9(ParserErrorCode.WITH_WITHOUT_EXTENDS, withClause.withKeyword, []);
     }
     NativeClause nativeClause = null;
     if (matches2(_NATIVE) && matches4(peek(), TokenType.STRING)) {
@@ -1552,7 +1552,7 @@
     } else {
       leftBracket = createSyntheticToken2(TokenType.OPEN_CURLY_BRACKET);
       rightBracket = createSyntheticToken2(TokenType.CLOSE_CURLY_BRACKET);
-      reportError7(ParserErrorCode.MISSING_CLASS_BODY, []);
+      reportError8(ParserErrorCode.MISSING_CLASS_BODY, []);
     }
     ClassDeclaration classDeclaration = new ClassDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, abstractKeyword, keyword, name, typeParameters, extendsClause, withClause, implementsClause, leftBracket, members, rightBracket);
     classDeclaration.nativeClause = nativeClause;
@@ -1603,7 +1603,7 @@
           validateModifiersForOperator(modifiers);
           return parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType);
         }
-        reportError8(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+        reportError9(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
         return null;
       }
     } else if (matches(Keyword.GET) && matchesIdentifier2(peek())) {
@@ -1620,7 +1620,7 @@
         validateModifiersForOperator(modifiers);
         return parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
       }
-      reportError8(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
+      reportError9(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
       return null;
     } else if (matches4(peek(), TokenType.PERIOD) && matchesIdentifier2(peek2(2)) && matches4(peek2(3), TokenType.OPEN_PAREN)) {
       return parseConstructor(commentAndMetadata, modifiers.externalKeyword, validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, parseSimpleIdentifier(), andAdvance, parseSimpleIdentifier(), parseFormalParameterList());
@@ -1635,7 +1635,7 @@
       return parseMethodDeclaration2(commentAndMetadata, modifiers.externalKeyword, modifiers.staticKeyword, null, methodName, parameters);
     } else if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
       if (modifiers.constKeyword == null && modifiers.finalKeyword == null && modifiers.varKeyword == null) {
-        reportError7(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
+        reportError8(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
       }
       return parseInitializedIdentifierList(commentAndMetadata, modifiers.staticKeyword, validateModifiersForField(modifiers), null);
     }
@@ -1657,7 +1657,7 @@
         validateModifiersForOperator(modifiers);
         return parseOperator(commentAndMetadata, modifiers.externalKeyword, type);
       }
-      reportError8(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
+      reportError9(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
       return null;
     } else if (matches4(peek(), TokenType.OPEN_PAREN)) {
       SimpleIdentifier methodName = parseSimpleIdentifier();
@@ -1691,7 +1691,7 @@
     Token memberStart = _currentToken;
     while (!matches5(TokenType.EOF) && !matches5(TokenType.CLOSE_CURLY_BRACKET) && (closingBracket != null || (!matches(Keyword.CLASS) && !matches(Keyword.TYPEDEF)))) {
       if (matches5(TokenType.SEMICOLON)) {
-        reportError8(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       } else {
         ClassMember member = parseClassMember(className);
@@ -1700,7 +1700,7 @@
         }
       }
       if (identical(_currentToken, memberStart)) {
-        reportError8(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       }
       memberStart = _currentToken;
@@ -1748,12 +1748,12 @@
       semicolon = andAdvance;
     } else {
       if (matches5(TokenType.OPEN_CURLY_BRACKET)) {
-        reportError7(ParserErrorCode.EXPECTED_TOKEN, [TokenType.SEMICOLON.lexeme]);
+        reportError8(ParserErrorCode.EXPECTED_TOKEN, [TokenType.SEMICOLON.lexeme]);
         Token leftBracket = andAdvance;
         parseClassMembers(className.name, getEndToken(leftBracket));
         expect2(TokenType.CLOSE_CURLY_BRACKET);
       } else {
-        reportError8(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [TokenType.SEMICOLON.lexeme]);
+        reportError9(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [TokenType.SEMICOLON.lexeme]);
       }
       semicolon = createSyntheticToken2(TokenType.SEMICOLON);
     }
@@ -1954,15 +1954,15 @@
       if ((matches(Keyword.IMPORT) || matches(Keyword.EXPORT) || matches(Keyword.LIBRARY) || matches(Keyword.PART)) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
         Directive directive = parseDirective(commentAndMetadata);
         if (declarations.length > 0 && !directiveFoundAfterDeclaration) {
-          reportError7(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION, []);
+          reportError8(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION, []);
           directiveFoundAfterDeclaration = true;
         }
         if (directive is LibraryDirective) {
           if (libraryDirectiveFound) {
-            reportError7(ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES, []);
+            reportError8(ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES, []);
           } else {
             if (directives.length > 0) {
-              reportError7(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, []);
+              reportError8(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST, []);
             }
             libraryDirectiveFound = true;
           }
@@ -1970,28 +1970,28 @@
           partDirectiveFound = true;
         } else if (partDirectiveFound) {
           if (directive is ExportDirective) {
-            reportError8(ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, ((directive as NamespaceDirective)).keyword, []);
+            reportError9(ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, ((directive as NamespaceDirective)).keyword, []);
           } else if (directive is ImportDirective) {
-            reportError8(ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, ((directive as NamespaceDirective)).keyword, []);
+            reportError9(ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE, ((directive as NamespaceDirective)).keyword, []);
           }
         }
         if (directive is PartOfDirective) {
           if (partOfDirectiveFound) {
-            reportError7(ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES, []);
+            reportError8(ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES, []);
           } else {
             for (Directive preceedingDirective in directives) {
-              reportError8(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, preceedingDirective.keyword, []);
+              reportError9(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, preceedingDirective.keyword, []);
             }
             partOfDirectiveFound = true;
           }
         } else {
           if (partOfDirectiveFound) {
-            reportError8(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, directive.keyword, []);
+            reportError9(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART, directive.keyword, []);
           }
         }
         directives.add(directive);
       } else if (matches5(TokenType.SEMICOLON)) {
-        reportError8(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       } else {
         CompilationUnitMember member = parseCompilationUnitMember(commentAndMetadata);
@@ -2000,7 +2000,7 @@
         }
       }
       if (identical(_currentToken, memberStart)) {
-        reportError8(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
         while (!matches5(TokenType.EOF) && !couldBeStartOfCompilationUnitMember()) {
           advance();
@@ -2045,7 +2045,7 @@
         validateModifiersForTopLevelFunction(modifiers);
         return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, null);
       } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-        reportError8(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
+        reportError9(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
         return convertToFunctionDeclaration(parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType));
       } else if (matchesIdentifier() && matchesAny(peek(), [
           TokenType.OPEN_PAREN,
@@ -2060,24 +2060,24 @@
             return new TopLevelVariableDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, parseVariableDeclarationList2(null, validateModifiersForTopLevelVariable(modifiers), null), expect2(TokenType.SEMICOLON));
           }
         }
-        reportError8(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+        reportError9(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
         return null;
       }
     } else if ((matches(Keyword.GET) || matches(Keyword.SET)) && matchesIdentifier2(peek())) {
       validateModifiersForTopLevelFunction(modifiers);
       return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, null);
     } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-      reportError8(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
+      reportError9(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
       return convertToFunctionDeclaration(parseOperator(commentAndMetadata, modifiers.externalKeyword, null));
     } else if (!matchesIdentifier()) {
-      reportError8(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+      reportError9(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
       return null;
     } else if (matches4(peek(), TokenType.OPEN_PAREN)) {
       validateModifiersForTopLevelFunction(modifiers);
       return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, null);
     } else if (matchesAny(peek(), [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
       if (modifiers.constKeyword == null && modifiers.finalKeyword == null && modifiers.varKeyword == null) {
-        reportError7(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
+        reportError8(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
       }
       return new TopLevelVariableDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, parseVariableDeclarationList2(null, validateModifiersForTopLevelVariable(modifiers), null), expect2(TokenType.SEMICOLON));
     }
@@ -2086,12 +2086,12 @@
       validateModifiersForTopLevelFunction(modifiers);
       return parseFunctionDeclaration(commentAndMetadata, modifiers.externalKeyword, returnType);
     } else if (matches(Keyword.OPERATOR) && isOperator(peek())) {
-      reportError8(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
+      reportError9(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
       return convertToFunctionDeclaration(parseOperator(commentAndMetadata, modifiers.externalKeyword, returnType));
     } else if (matches5(TokenType.AT)) {
       return new TopLevelVariableDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, parseVariableDeclarationList2(null, validateModifiersForTopLevelVariable(modifiers), returnType), expect2(TokenType.SEMICOLON));
     } else if (!matchesIdentifier()) {
-      reportError8(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
+      reportError9(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
       Token semicolon;
       if (matches5(TokenType.SEMICOLON)) {
         semicolon = andAdvance;
@@ -2194,10 +2194,10 @@
     } else {
       body = parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false);
       if (constKeyword != null && factoryKeyword != null) {
-        reportError8(ParserErrorCode.CONST_FACTORY, factoryKeyword, []);
+        reportError9(ParserErrorCode.CONST_FACTORY, factoryKeyword, []);
       } else if (body is EmptyFunctionBody) {
         if (factoryKeyword != null && externalKeyword == null) {
-          reportError8(ParserErrorCode.FACTORY_WITHOUT_BODY, factoryKeyword, []);
+          reportError9(ParserErrorCode.FACTORY_WITHOUT_BODY, factoryKeyword, []);
         }
       } else {
         if (constKeyword != null) {
@@ -2279,14 +2279,14 @@
   Statement parseContinueStatement() {
     Token continueKeyword = expect(Keyword.CONTINUE);
     if (!_inLoop && !_inSwitch) {
-      reportError8(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, continueKeyword, []);
+      reportError9(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, continueKeyword, []);
     }
     SimpleIdentifier label = null;
     if (matchesIdentifier()) {
       label = parseSimpleIdentifier();
     }
     if (_inSwitch && !_inLoop && label == null) {
-      reportError8(ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, continueKeyword, []);
+      reportError9(ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, continueKeyword, []);
     }
     Token semicolon = expect2(TokenType.SEMICOLON);
     return new ContinueStatement.full(continueKeyword, label, semicolon);
@@ -2574,7 +2574,7 @@
       if (isTypedIdentifier(_currentToken)) {
         type = parseReturnType();
       } else if (!optional) {
-        reportError7(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
+        reportError8(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, []);
       }
     }
     return new FinalConstVarOrType(keyword, type);
@@ -2602,7 +2602,7 @@
       Token seperator = andAdvance;
       Expression defaultValue = parseExpression2();
       if (identical(kind, ParameterKind.NAMED)) {
-        reportError8(ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER, seperator, []);
+        reportError9(ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER, seperator, []);
       } else if (identical(kind, ParameterKind.REQUIRED)) {
         reportError(ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP, parameter, []);
       }
@@ -2611,7 +2611,7 @@
       Token seperator = andAdvance;
       Expression defaultValue = parseExpression2();
       if (identical(kind, ParameterKind.POSITIONAL)) {
-        reportError8(ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER, seperator, []);
+        reportError9(ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER, seperator, []);
       } else if (identical(kind, ParameterKind.REQUIRED)) {
         reportError(ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP, parameter, []);
       }
@@ -2673,9 +2673,9 @@
         firstParameter = false;
       } else if (!optional(TokenType.COMMA)) {
         if (getEndToken(leftParenthesis) != null) {
-          reportError7(ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
+          reportError8(ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
         } else {
-          reportError8(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, _currentToken.previous, []);
+          reportError9(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, _currentToken.previous, []);
           break;
         }
       }
@@ -2683,11 +2683,11 @@
       if (matches5(TokenType.OPEN_SQUARE_BRACKET)) {
         wasOptionalParameter = true;
         if (leftSquareBracket != null && !reportedMuliplePositionalGroups) {
-          reportError7(ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS, []);
+          reportError8(ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS, []);
           reportedMuliplePositionalGroups = true;
         }
         if (leftCurlyBracket != null && !reportedMixedGroups) {
-          reportError7(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
+          reportError8(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
           reportedMixedGroups = true;
         }
         leftSquareBracket = andAdvance;
@@ -2696,11 +2696,11 @@
       } else if (matches5(TokenType.OPEN_CURLY_BRACKET)) {
         wasOptionalParameter = true;
         if (leftCurlyBracket != null && !reportedMulipleNamedGroups) {
-          reportError7(ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS, []);
+          reportError8(ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS, []);
           reportedMulipleNamedGroups = true;
         }
         if (leftSquareBracket != null && !reportedMixedGroups) {
-          reportError7(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
+          reportError8(ParserErrorCode.MIXED_PARAMETER_GROUPS, []);
           reportedMixedGroups = true;
         }
         leftCurlyBracket = andAdvance;
@@ -2718,11 +2718,11 @@
         currentParameters = normalParameters;
         if (leftSquareBracket == null) {
           if (leftCurlyBracket != null) {
-            reportError7(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+            reportError8(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
             rightCurlyBracket = rightSquareBracket;
             rightSquareBracket = null;
           } else {
-            reportError7(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["["]);
+            reportError8(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["["]);
           }
         }
         kind = ParameterKind.REQUIRED;
@@ -2731,11 +2731,11 @@
         currentParameters = normalParameters;
         if (leftCurlyBracket == null) {
           if (leftSquareBracket != null) {
-            reportError7(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+            reportError8(ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
             rightSquareBracket = rightCurlyBracket;
             rightCurlyBracket = null;
           } else {
-            reportError7(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["{"]);
+            reportError8(ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP, ["{"]);
           }
         }
         kind = ParameterKind.REQUIRED;
@@ -2743,10 +2743,10 @@
     } while (!matches5(TokenType.CLOSE_PAREN) && initialToken != _currentToken);
     Token rightParenthesis = expect2(TokenType.CLOSE_PAREN);
     if (leftSquareBracket != null && rightSquareBracket == null) {
-      reportError7(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+      reportError8(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
     }
     if (leftCurlyBracket != null && rightCurlyBracket == null) {
-      reportError7(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+      reportError8(ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
     }
     if (leftSquareBracket == null) {
       leftSquareBracket = leftCurlyBracket;
@@ -2799,15 +2799,15 @@
         if (matches(Keyword.IN)) {
           DeclaredIdentifier loopVariable = null;
           if (variableList == null) {
-            reportError7(ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH, []);
+            reportError8(ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH, []);
           } else {
             NodeList<VariableDeclaration> variables = variableList.variables;
             if (variables.length > 1) {
-              reportError7(ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH, [variables.length.toString()]);
+              reportError8(ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH, [variables.length.toString()]);
             }
             VariableDeclaration variable = variables[0];
             if (variable.initializer != null) {
-              reportError7(ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH, []);
+              reportError8(ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH, []);
             }
             loopVariable = new DeclaredIdentifier.full(commentAndMetadata.comment, commentAndMetadata.metadata, variableList.keyword, variableList.type, variable.name);
           }
@@ -2863,7 +2863,7 @@
     try {
       if (matches5(TokenType.SEMICOLON)) {
         if (!mayBeEmpty) {
-          reportError7(emptyErrorCode, []);
+          reportError8(emptyErrorCode, []);
         }
         return new EmptyFunctionBody.full(andAdvance);
       } else if (matches5(TokenType.FUNCTION)) {
@@ -2884,7 +2884,7 @@
         }
         return new NativeFunctionBody.full(nativeToken, stringLiteral, expect2(TokenType.SEMICOLON));
       } else {
-        reportError7(emptyErrorCode, []);
+        reportError8(emptyErrorCode, []);
         return new EmptyFunctionBody.full(createSyntheticToken2(TokenType.SEMICOLON));
       }
     } finally {
@@ -2925,10 +2925,10 @@
         parameters = parseFormalParameterList();
         validateFormalParameterList(parameters);
       } else {
-        reportError7(ParserErrorCode.MISSING_FUNCTION_PARAMETERS, []);
+        reportError8(ParserErrorCode.MISSING_FUNCTION_PARAMETERS, []);
       }
     } else if (matches5(TokenType.OPEN_PAREN)) {
-      reportError7(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
+      reportError8(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
       parseFormalParameterList();
     }
     FunctionBody body;
@@ -3014,12 +3014,12 @@
       typeParameters = parseTypeParameterList();
     }
     if (matches5(TokenType.SEMICOLON) || matches5(TokenType.EOF)) {
-      reportError7(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
+      reportError8(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
       FormalParameterList parameters = new FormalParameterList.full(createSyntheticToken2(TokenType.OPEN_PAREN), null, null, null, createSyntheticToken2(TokenType.CLOSE_PAREN));
       Token semicolon = expect2(TokenType.SEMICOLON);
       return new FunctionTypeAlias.full(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, returnType, name, typeParameters, parameters, semicolon);
     } else if (!matches5(TokenType.OPEN_PAREN)) {
-      reportError7(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
+      reportError8(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []);
       return new FunctionTypeAlias.full(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, returnType, name, typeParameters, new FormalParameterList.full(createSyntheticToken2(TokenType.OPEN_PAREN), null, null, null, createSyntheticToken2(TokenType.CLOSE_PAREN)), createSyntheticToken2(TokenType.SEMICOLON));
     }
     FormalParameterList parameters = parseFormalParameterList();
@@ -3051,13 +3051,13 @@
     Token propertyKeyword = expect(Keyword.GET);
     SimpleIdentifier name = parseSimpleIdentifier();
     if (matches5(TokenType.OPEN_PAREN) && matches4(peek(), TokenType.CLOSE_PAREN)) {
-      reportError7(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
+      reportError8(ParserErrorCode.GETTER_WITH_PARAMETERS, []);
       advance();
       advance();
     }
     FunctionBody body = parseFunctionBody(externalKeyword != null || staticKeyword == null, ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, false);
     if (externalKeyword != null && body is! EmptyFunctionBody) {
-      reportError7(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY, []);
+      reportError8(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY, []);
     }
     return new MethodDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, propertyKeyword, null, name, null, body);
   }
@@ -3255,7 +3255,7 @@
       StringLiteral string = parseStringLiteral();
       reportError(ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME, string, []);
     } else {
-      reportError8(missingNameError, missingNameToken, []);
+      reportError9(missingNameError, missingNameToken, []);
     }
     List<SimpleIdentifier> components = new List<SimpleIdentifier>();
     components.add(createSyntheticIdentifier());
@@ -3332,7 +3332,7 @@
     } else if (matches5(TokenType.OPEN_SQUARE_BRACKET) || matches5(TokenType.INDEX)) {
       return parseListLiteral(modifier, typeArguments);
     }
-    reportError7(ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL, []);
+    reportError8(ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL, []);
     return new ListLiteral.full(modifier, typeArguments, createSyntheticToken2(TokenType.OPEN_SQUARE_BRACKET), null, createSyntheticToken2(TokenType.CLOSE_SQUARE_BRACKET));
   }
 
@@ -3502,49 +3502,49 @@
     while (progress) {
       if (matches(Keyword.ABSTRACT) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
         if (modifiers.abstractKeyword != null) {
-          reportError7(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError8(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.abstractKeyword = andAdvance;
         }
       } else if (matches(Keyword.CONST)) {
         if (modifiers.constKeyword != null) {
-          reportError7(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError8(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.constKeyword = andAdvance;
         }
       } else if (matches(Keyword.EXTERNAL) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
         if (modifiers.externalKeyword != null) {
-          reportError7(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError8(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.externalKeyword = andAdvance;
         }
       } else if (matches(Keyword.FACTORY) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
         if (modifiers.factoryKeyword != null) {
-          reportError7(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError8(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.factoryKeyword = andAdvance;
         }
       } else if (matches(Keyword.FINAL)) {
         if (modifiers.finalKeyword != null) {
-          reportError7(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError8(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.finalKeyword = andAdvance;
         }
       } else if (matches(Keyword.STATIC) && !matches4(peek(), TokenType.PERIOD) && !matches4(peek(), TokenType.LT)) {
         if (modifiers.staticKeyword != null) {
-          reportError7(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError8(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.staticKeyword = andAdvance;
         }
       } else if (matches(Keyword.VAR)) {
         if (modifiers.varKeyword != null) {
-          reportError7(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          reportError8(ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
           advance();
         } else {
           modifiers.varKeyword = andAdvance;
@@ -3686,7 +3686,7 @@
           } else if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
             return parseVariableDeclarationStatement2(commentAndMetadata, null, returnType);
           }
-          reportError7(ParserErrorCode.MISSING_STATEMENT, []);
+          reportError8(ParserErrorCode.MISSING_STATEMENT, []);
           return new EmptyStatement.full(createSyntheticToken2(TokenType.SEMICOLON));
         }
       } else if (identical(keyword, Keyword.CONST)) {
@@ -3708,7 +3708,7 @@
       } else if (identical(keyword, Keyword.NEW) || identical(keyword, Keyword.TRUE) || identical(keyword, Keyword.FALSE) || identical(keyword, Keyword.NULL) || identical(keyword, Keyword.SUPER) || identical(keyword, Keyword.THIS)) {
         return new ExpressionStatement.full(parseExpression2(), expect2(TokenType.SEMICOLON));
       } else {
-        reportError7(ParserErrorCode.MISSING_STATEMENT, []);
+        reportError8(ParserErrorCode.MISSING_STATEMENT, []);
         return new EmptyStatement.full(createSyntheticToken2(TokenType.SEMICOLON));
       }
     } else if (matches5(TokenType.SEMICOLON)) {
@@ -3718,7 +3718,7 @@
     } else if (isFunctionDeclaration()) {
       return parseFunctionDeclarationStatement();
     } else if (matches5(TokenType.CLOSE_CURLY_BRACKET)) {
-      reportError7(ParserErrorCode.MISSING_STATEMENT, []);
+      reportError8(ParserErrorCode.MISSING_STATEMENT, []);
       return new EmptyStatement.full(createSyntheticToken2(TokenType.SEMICOLON));
     } else {
       return new ExpressionStatement.full(parseExpression2(), expect2(TokenType.SEMICOLON));
@@ -3761,7 +3761,7 @@
       FormalParameterList parameters = parseFormalParameterList();
       if (thisKeyword == null) {
         if (holder.keyword != null) {
-          reportError8(ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword, []);
+          reportError9(ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword, []);
         }
         return new FunctionTypedFormalParameter.full(commentAndMetadata.comment, commentAndMetadata.metadata, holder.type, identifier, parameters);
       } else {
@@ -3771,9 +3771,9 @@
     TypeName type = holder.type;
     if (type != null) {
       if (matches3(type.name.beginToken, Keyword.VOID)) {
-        reportError8(ParserErrorCode.VOID_PARAMETER, type.name.beginToken, []);
+        reportError9(ParserErrorCode.VOID_PARAMETER, type.name.beginToken, []);
       } else if (holder.keyword != null && matches3(holder.keyword, Keyword.VAR)) {
-        reportError8(ParserErrorCode.VAR_AND_TYPE, holder.keyword, []);
+        reportError9(ParserErrorCode.VAR_AND_TYPE, holder.keyword, []);
       }
     }
     if (thisKeyword != null) {
@@ -3805,17 +3805,17 @@
     if (matches(Keyword.OPERATOR)) {
       operatorKeyword = andAdvance;
     } else {
-      reportError8(ParserErrorCode.MISSING_KEYWORD_OPERATOR, _currentToken, []);
+      reportError9(ParserErrorCode.MISSING_KEYWORD_OPERATOR, _currentToken, []);
       operatorKeyword = createSyntheticToken(Keyword.OPERATOR);
     }
     if (!_currentToken.isUserDefinableOperator) {
-      reportError7(ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [_currentToken.lexeme]);
+      reportError8(ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [_currentToken.lexeme]);
     }
     SimpleIdentifier name = new SimpleIdentifier.full(andAdvance);
     if (matches5(TokenType.EQ)) {
       Token previous = _currentToken.previous;
       if ((matches4(previous, TokenType.EQ_EQ) || matches4(previous, TokenType.BANG_EQ)) && _currentToken.offset == previous.offset + 2) {
-        reportError7(ParserErrorCode.INVALID_OPERATOR, ["${previous.lexeme}${_currentToken.lexeme}"]);
+        reportError8(ParserErrorCode.INVALID_OPERATOR, ["${previous.lexeme}${_currentToken.lexeme}"]);
         advance();
       }
     }
@@ -3823,7 +3823,7 @@
     validateFormalParameterList(parameters);
     FunctionBody body = parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false);
     if (externalKeyword != null && body is! EmptyFunctionBody) {
-      reportError7(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY, []);
+      reportError8(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY, []);
     }
     return new MethodDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, null, returnType, null, operatorKeyword, name, parameters, body);
   }
@@ -3908,7 +3908,7 @@
       return operand;
     }
     if (operand is Literal || operand is FunctionExpressionInvocation) {
-      reportError7(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, []);
+      reportError8(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, []);
     }
     Token operator = andAdvance;
     return new PostfixExpression.full(operand, operator);
@@ -4021,13 +4021,13 @@
     } else if (matches5(TokenType.QUESTION)) {
       return parseArgumentDefinitionTest();
     } else if (matches(Keyword.VOID)) {
-      reportError7(ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
+      reportError8(ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
       advance();
       return parsePrimaryExpression();
     } else if (matches5(TokenType.HASH)) {
       return parseSymbolLiteral();
     } else {
-      reportError7(ParserErrorCode.MISSING_IDENTIFIER, []);
+      reportError8(ParserErrorCode.MISSING_IDENTIFIER, []);
       return createSyntheticIdentifier();
     }
   }
@@ -4167,7 +4167,7 @@
     validateFormalParameterList(parameters);
     FunctionBody body = parseFunctionBody(externalKeyword != null || staticKeyword == null, ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, false);
     if (externalKeyword != null && body is! EmptyFunctionBody) {
-      reportError7(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY, []);
+      reportError8(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY, []);
     }
     return new MethodDeclaration.full(commentAndMetadata.comment, commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, propertyKeyword, null, name, parameters, body);
   }
@@ -4211,7 +4211,7 @@
     if (matchesIdentifier()) {
       return new SimpleIdentifier.full(andAdvance);
     }
-    reportError7(ParserErrorCode.MISSING_IDENTIFIER, []);
+    reportError8(ParserErrorCode.MISSING_IDENTIFIER, []);
     return createSyntheticIdentifier();
   }
 
@@ -4255,7 +4255,7 @@
     while (!matches5(TokenType.EOF) && !matches5(TokenType.CLOSE_CURLY_BRACKET) && !isSwitchMember()) {
       statements.add(parseStatement2());
       if (identical(_currentToken, statementStart)) {
-        reportError8(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
+        reportError9(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_currentToken.lexeme]);
         advance();
       }
       statementStart = _currentToken;
@@ -4319,7 +4319,7 @@
       }
     }
     if (strings.length < 1) {
-      reportError7(ParserErrorCode.EXPECTED_STRING_LITERAL, []);
+      reportError8(ParserErrorCode.EXPECTED_STRING_LITERAL, []);
       return createSyntheticStringLiteral();
     } else if (strings.length == 1) {
       return strings[0];
@@ -4384,7 +4384,7 @@
           SimpleIdentifier identifier = parseSimpleIdentifier();
           String label = identifier.token.lexeme;
           if (definedLabels.contains(label)) {
-            reportError8(ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT, identifier.token, [label]);
+            reportError9(ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT, identifier.token, [label]);
           } else {
             javaSetAdd(definedLabels, label);
           }
@@ -4397,17 +4397,17 @@
           Token colon = expect2(TokenType.COLON);
           members.add(new SwitchCase.full(labels, caseKeyword, caseExpression, colon, parseStatements2()));
           if (defaultKeyword != null) {
-            reportError8(ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, caseKeyword, []);
+            reportError9(ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE, caseKeyword, []);
           }
         } else if (matches(Keyword.DEFAULT)) {
           if (defaultKeyword != null) {
-            reportError8(ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, peek(), []);
+            reportError9(ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, peek(), []);
           }
           defaultKeyword = andAdvance;
           Token colon = expect2(TokenType.COLON);
           members.add(new SwitchDefault.full(labels, defaultKeyword, colon, parseStatements2()));
         } else {
-          reportError7(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT, []);
+          reportError8(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT, []);
           while (!matches5(TokenType.EOF) && !matches5(TokenType.CLOSE_CURLY_BRACKET) && !matches(Keyword.CASE) && !matches(Keyword.DEFAULT)) {
             advance();
           }
@@ -4440,7 +4440,7 @@
         if (matches5(TokenType.IDENTIFIER)) {
           components.add(andAdvance);
         } else {
-          reportError7(ParserErrorCode.MISSING_IDENTIFIER, []);
+          reportError8(ParserErrorCode.MISSING_IDENTIFIER, []);
           components.add(createSyntheticToken2(TokenType.IDENTIFIER));
           break;
         }
@@ -4448,7 +4448,7 @@
     } else if (_currentToken.isOperator) {
       components.add(andAdvance);
     } else {
-      reportError7(ParserErrorCode.MISSING_IDENTIFIER, []);
+      reportError8(ParserErrorCode.MISSING_IDENTIFIER, []);
       components.add(createSyntheticToken2(TokenType.IDENTIFIER));
     }
     return new SymbolLiteral.full(poundSign, new List.from(components));
@@ -4467,7 +4467,7 @@
   Expression parseThrowExpression() {
     Token keyword = expect(Keyword.THROW);
     if (matches5(TokenType.SEMICOLON) || matches5(TokenType.CLOSE_PAREN)) {
-      reportError8(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken, []);
+      reportError9(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken, []);
       return new ThrowExpression.full(keyword, createSyntheticIdentifier());
     }
     Expression expression = parseExpression2();
@@ -4487,7 +4487,7 @@
   Expression parseThrowExpressionWithoutCascade() {
     Token keyword = expect(Keyword.THROW);
     if (matches5(TokenType.SEMICOLON) || matches5(TokenType.CLOSE_PAREN)) {
-      reportError8(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken, []);
+      reportError9(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken, []);
       return new ThrowExpression.full(keyword, createSyntheticIdentifier());
     }
     Expression expression = parseExpressionWithoutCascade();
@@ -4551,7 +4551,7 @@
       finallyClause = parseBlock();
     } else {
       if (catchClauses.isEmpty) {
-        reportError7(ParserErrorCode.MISSING_CATCH_OR_FINALLY, []);
+        reportError8(ParserErrorCode.MISSING_CATCH_OR_FINALLY, []);
       }
     }
     return new TryStatement.full(tryKeyword, body, catchClauses, finallyKeyword, finallyClause);
@@ -4637,13 +4637,13 @@
   TypeName parseTypeName() {
     Identifier typeName;
     if (matches(Keyword.VAR)) {
-      reportError7(ParserErrorCode.VAR_AS_TYPE_NAME, []);
+      reportError8(ParserErrorCode.VAR_AS_TYPE_NAME, []);
       typeName = new SimpleIdentifier.full(andAdvance);
     } else if (matchesIdentifier()) {
       typeName = parsePrefixedIdentifier();
     } else {
       typeName = createSyntheticIdentifier();
-      reportError7(ParserErrorCode.EXPECTED_TYPE_NAME, []);
+      reportError8(ParserErrorCode.EXPECTED_TYPE_NAME, []);
     }
     TypeArgumentList typeArguments = null;
     if (matches5(TokenType.LT)) {
@@ -4733,13 +4733,13 @@
           operator.previous.setNext(firstOperator);
           return new PrefixExpression.full(firstOperator, new PrefixExpression.full(secondOperator, new SuperExpression.full(andAdvance)));
         } else {
-          reportError7(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, [operator.lexeme]);
+          reportError8(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, [operator.lexeme]);
           return new PrefixExpression.full(operator, new SuperExpression.full(andAdvance));
         }
       }
       return new PrefixExpression.full(operator, parseAssignableExpression(false));
     } else if (matches5(TokenType.PLUS)) {
-      reportError7(ParserErrorCode.MISSING_IDENTIFIER, []);
+      reportError8(ParserErrorCode.MISSING_IDENTIFIER, []);
       return createSyntheticIdentifier();
     }
     return parsePostfixExpression();
@@ -4800,7 +4800,7 @@
    */
   VariableDeclarationList parseVariableDeclarationList2(CommentAndMetadata commentAndMetadata, Token keyword, TypeName type) {
     if (type != null && keyword != null && matches3(keyword, Keyword.VAR)) {
-      reportError8(ParserErrorCode.VAR_AND_TYPE, keyword, []);
+      reportError9(ParserErrorCode.VAR_AND_TYPE, keyword, []);
     }
     List<VariableDeclaration> variables = new List<VariableDeclaration>();
     variables.add(parseVariableDeclaration());
@@ -4935,8 +4935,8 @@
    * @param errorCode the error code of the error to be reported
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError7(ParserErrorCode errorCode, List<Object> arguments) {
-    reportError8(errorCode, _currentToken, arguments);
+  void reportError8(ParserErrorCode errorCode, List<Object> arguments) {
+    reportError9(errorCode, _currentToken, arguments);
   }
 
   /**
@@ -4946,7 +4946,7 @@
    * @param token the token specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError8(ParserErrorCode errorCode, Token token, List<Object> arguments) {
+  void reportError9(ParserErrorCode errorCode, Token token, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_source, token.offset, token.length, errorCode, arguments));
   }
 
@@ -5384,28 +5384,28 @@
       builder.appendChar(0xB);
     } else if (currentChar == 0x78) {
       if (currentIndex + 2 >= length) {
-        reportError7(ParserErrorCode.INVALID_HEX_ESCAPE, []);
+        reportError8(ParserErrorCode.INVALID_HEX_ESCAPE, []);
         return length;
       }
       int firstDigit = lexeme.codeUnitAt(currentIndex + 1);
       int secondDigit = lexeme.codeUnitAt(currentIndex + 2);
       if (!isHexDigit(firstDigit) || !isHexDigit(secondDigit)) {
-        reportError7(ParserErrorCode.INVALID_HEX_ESCAPE, []);
+        reportError8(ParserErrorCode.INVALID_HEX_ESCAPE, []);
       } else {
-        builder.appendChar((((Character.digit(firstDigit, 16) << 4) + Character.digit(secondDigit, 16)) as int));
+        builder.appendChar(((Character.digit(firstDigit, 16) << 4) + Character.digit(secondDigit, 16)) as int);
       }
       return currentIndex + 3;
     } else if (currentChar == 0x75) {
       currentIndex++;
       if (currentIndex >= length) {
-        reportError7(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+        reportError8(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
         return length;
       }
       currentChar = lexeme.codeUnitAt(currentIndex);
       if (currentChar == 0x7B) {
         currentIndex++;
         if (currentIndex >= length) {
-          reportError7(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          reportError8(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
           return length;
         }
         currentChar = lexeme.codeUnitAt(currentIndex);
@@ -5413,7 +5413,7 @@
         int value = 0;
         while (currentChar != 0x7D) {
           if (!isHexDigit(currentChar)) {
-            reportError7(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+            reportError8(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
             currentIndex++;
             while (currentIndex < length && lexeme.codeUnitAt(currentIndex) != 0x7D) {
               currentIndex++;
@@ -5424,19 +5424,19 @@
           value = (value << 4) + Character.digit(currentChar, 16);
           currentIndex++;
           if (currentIndex >= length) {
-            reportError7(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+            reportError8(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
             return length;
           }
           currentChar = lexeme.codeUnitAt(currentIndex);
         }
         if (digitCount < 1 || digitCount > 6) {
-          reportError7(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          reportError8(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
         }
         appendScalarValue(builder, lexeme.substring(index, currentIndex + 1), value, index, currentIndex);
         return currentIndex + 1;
       } else {
         if (currentIndex + 3 >= length) {
-          reportError7(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          reportError8(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
           return length;
         }
         int firstDigit = currentChar;
@@ -5444,9 +5444,9 @@
         int thirdDigit = lexeme.codeUnitAt(currentIndex + 2);
         int fourthDigit = lexeme.codeUnitAt(currentIndex + 3);
         if (!isHexDigit(firstDigit) || !isHexDigit(secondDigit) || !isHexDigit(thirdDigit) || !isHexDigit(fourthDigit)) {
-          reportError7(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          reportError8(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
         } else {
-          appendScalarValue(builder, lexeme.substring(index, currentIndex + 1), ((((((Character.digit(firstDigit, 16) << 4) + Character.digit(secondDigit, 16)) << 4) + Character.digit(thirdDigit, 16)) << 4) + Character.digit(fourthDigit, 16)), index, currentIndex + 3);
+          appendScalarValue(builder, lexeme.substring(index, currentIndex + 1), (((((Character.digit(firstDigit, 16) << 4) + Character.digit(secondDigit, 16)) << 4) + Character.digit(thirdDigit, 16)) << 4) + Character.digit(fourthDigit, 16), index, currentIndex + 3);
         }
         return currentIndex + 4;
       }
@@ -5478,16 +5478,16 @@
   Token validateModifiersForClass(Modifiers modifiers) {
     validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.constKeyword != null) {
-      reportError8(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
+      reportError9(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportError8(ParserErrorCode.EXTERNAL_CLASS, modifiers.externalKeyword, []);
+      reportError9(ParserErrorCode.EXTERNAL_CLASS, modifiers.externalKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError8(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
+      reportError9(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError8(ParserErrorCode.VAR_CLASS, modifiers.varKeyword, []);
+      reportError9(ParserErrorCode.VAR_CLASS, modifiers.varKeyword, []);
     }
     return modifiers.abstractKeyword;
   }
@@ -5501,25 +5501,25 @@
    */
   Token validateModifiersForConstructor(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportError7(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      reportError8(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError8(ParserErrorCode.FINAL_CONSTRUCTOR, modifiers.finalKeyword, []);
+      reportError9(ParserErrorCode.FINAL_CONSTRUCTOR, modifiers.finalKeyword, []);
     }
     if (modifiers.staticKeyword != null) {
-      reportError8(ParserErrorCode.STATIC_CONSTRUCTOR, modifiers.staticKeyword, []);
+      reportError9(ParserErrorCode.STATIC_CONSTRUCTOR, modifiers.staticKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError8(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, modifiers.varKeyword, []);
+      reportError9(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, modifiers.varKeyword, []);
     }
     Token externalKeyword = modifiers.externalKeyword;
     Token constKeyword = modifiers.constKeyword;
     Token factoryKeyword = modifiers.factoryKeyword;
     if (externalKeyword != null && constKeyword != null && constKeyword.offset < externalKeyword.offset) {
-      reportError8(ParserErrorCode.EXTERNAL_AFTER_CONST, externalKeyword, []);
+      reportError9(ParserErrorCode.EXTERNAL_AFTER_CONST, externalKeyword, []);
     }
     if (externalKeyword != null && factoryKeyword != null && factoryKeyword.offset < externalKeyword.offset) {
-      reportError8(ParserErrorCode.EXTERNAL_AFTER_FACTORY, externalKeyword, []);
+      reportError9(ParserErrorCode.EXTERNAL_AFTER_FACTORY, externalKeyword, []);
     }
     return constKeyword;
   }
@@ -5533,13 +5533,13 @@
    */
   Token validateModifiersForField(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportError7(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      reportError8(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportError8(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
+      reportError9(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
     }
     if (modifiers.factoryKeyword != null) {
-      reportError8(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
+      reportError9(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
     }
     Token staticKeyword = modifiers.staticKeyword;
     Token constKeyword = modifiers.constKeyword;
@@ -5547,23 +5547,23 @@
     Token varKeyword = modifiers.varKeyword;
     if (constKeyword != null) {
       if (finalKeyword != null) {
-        reportError8(ParserErrorCode.CONST_AND_FINAL, finalKeyword, []);
+        reportError9(ParserErrorCode.CONST_AND_FINAL, finalKeyword, []);
       }
       if (varKeyword != null) {
-        reportError8(ParserErrorCode.CONST_AND_VAR, varKeyword, []);
+        reportError9(ParserErrorCode.CONST_AND_VAR, varKeyword, []);
       }
       if (staticKeyword != null && constKeyword.offset < staticKeyword.offset) {
-        reportError8(ParserErrorCode.STATIC_AFTER_CONST, staticKeyword, []);
+        reportError9(ParserErrorCode.STATIC_AFTER_CONST, staticKeyword, []);
       }
     } else if (finalKeyword != null) {
       if (varKeyword != null) {
-        reportError8(ParserErrorCode.FINAL_AND_VAR, varKeyword, []);
+        reportError9(ParserErrorCode.FINAL_AND_VAR, varKeyword, []);
       }
       if (staticKeyword != null && finalKeyword.offset < staticKeyword.offset) {
-        reportError8(ParserErrorCode.STATIC_AFTER_FINAL, staticKeyword, []);
+        reportError9(ParserErrorCode.STATIC_AFTER_FINAL, staticKeyword, []);
       }
     } else if (varKeyword != null && staticKeyword != null && varKeyword.offset < staticKeyword.offset) {
-      reportError8(ParserErrorCode.STATIC_AFTER_VAR, staticKeyword, []);
+      reportError9(ParserErrorCode.STATIC_AFTER_VAR, staticKeyword, []);
     }
     return lexicallyFirst([constKeyword, finalKeyword, varKeyword]);
   }
@@ -5575,7 +5575,7 @@
    */
   void validateModifiersForFunctionDeclarationStatement(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null || modifiers.constKeyword != null || modifiers.externalKeyword != null || modifiers.factoryKeyword != null || modifiers.finalKeyword != null || modifiers.staticKeyword != null || modifiers.varKeyword != null) {
-      reportError7(ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER, []);
+      reportError8(ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER, []);
     }
   }
 
@@ -5586,24 +5586,24 @@
    */
   void validateModifiersForGetterOrSetterOrMethod(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportError7(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      reportError8(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.constKeyword != null) {
-      reportError8(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
+      reportError9(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
     }
     if (modifiers.factoryKeyword != null) {
-      reportError8(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
+      reportError9(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError8(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
+      reportError9(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError8(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
+      reportError9(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
     }
     Token externalKeyword = modifiers.externalKeyword;
     Token staticKeyword = modifiers.staticKeyword;
     if (externalKeyword != null && staticKeyword != null && staticKeyword.offset < externalKeyword.offset) {
-      reportError8(ParserErrorCode.EXTERNAL_AFTER_STATIC, externalKeyword, []);
+      reportError9(ParserErrorCode.EXTERNAL_AFTER_STATIC, externalKeyword, []);
     }
   }
 
@@ -5614,22 +5614,22 @@
    */
   void validateModifiersForOperator(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
-      reportError7(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
+      reportError8(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []);
     }
     if (modifiers.constKeyword != null) {
-      reportError8(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
+      reportError9(ParserErrorCode.CONST_METHOD, modifiers.constKeyword, []);
     }
     if (modifiers.factoryKeyword != null) {
-      reportError8(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
+      reportError9(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError8(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
+      reportError9(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword, []);
     }
     if (modifiers.staticKeyword != null) {
-      reportError8(ParserErrorCode.STATIC_OPERATOR, modifiers.staticKeyword, []);
+      reportError9(ParserErrorCode.STATIC_OPERATOR, modifiers.staticKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError8(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
+      reportError9(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
     }
   }
 
@@ -5640,10 +5640,10 @@
    */
   void validateModifiersForTopLevelDeclaration(Modifiers modifiers) {
     if (modifiers.factoryKeyword != null) {
-      reportError8(ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION, modifiers.factoryKeyword, []);
+      reportError9(ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION, modifiers.factoryKeyword, []);
     }
     if (modifiers.staticKeyword != null) {
-      reportError8(ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION, modifiers.staticKeyword, []);
+      reportError9(ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION, modifiers.staticKeyword, []);
     }
   }
 
@@ -5655,16 +5655,16 @@
   void validateModifiersForTopLevelFunction(Modifiers modifiers) {
     validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
-      reportError7(ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION, []);
+      reportError8(ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION, []);
     }
     if (modifiers.constKeyword != null) {
-      reportError8(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
+      reportError9(ParserErrorCode.CONST_CLASS, modifiers.constKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError8(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
+      reportError9(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError8(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
+      reportError9(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword, []);
     }
   }
 
@@ -5678,24 +5678,24 @@
   Token validateModifiersForTopLevelVariable(Modifiers modifiers) {
     validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
-      reportError7(ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE, []);
+      reportError8(ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportError8(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
+      reportError9(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword, []);
     }
     Token constKeyword = modifiers.constKeyword;
     Token finalKeyword = modifiers.finalKeyword;
     Token varKeyword = modifiers.varKeyword;
     if (constKeyword != null) {
       if (finalKeyword != null) {
-        reportError8(ParserErrorCode.CONST_AND_FINAL, finalKeyword, []);
+        reportError9(ParserErrorCode.CONST_AND_FINAL, finalKeyword, []);
       }
       if (varKeyword != null) {
-        reportError8(ParserErrorCode.CONST_AND_VAR, varKeyword, []);
+        reportError9(ParserErrorCode.CONST_AND_VAR, varKeyword, []);
       }
     } else if (finalKeyword != null) {
       if (varKeyword != null) {
-        reportError8(ParserErrorCode.FINAL_AND_VAR, varKeyword, []);
+        reportError9(ParserErrorCode.FINAL_AND_VAR, varKeyword, []);
       }
     }
     return lexicallyFirst([constKeyword, finalKeyword, varKeyword]);
@@ -5710,19 +5710,19 @@
   void validateModifiersForTypedef(Modifiers modifiers) {
     validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
-      reportError8(ParserErrorCode.ABSTRACT_TYPEDEF, modifiers.abstractKeyword, []);
+      reportError9(ParserErrorCode.ABSTRACT_TYPEDEF, modifiers.abstractKeyword, []);
     }
     if (modifiers.constKeyword != null) {
-      reportError8(ParserErrorCode.CONST_TYPEDEF, modifiers.constKeyword, []);
+      reportError9(ParserErrorCode.CONST_TYPEDEF, modifiers.constKeyword, []);
     }
     if (modifiers.externalKeyword != null) {
-      reportError8(ParserErrorCode.EXTERNAL_TYPEDEF, modifiers.externalKeyword, []);
+      reportError9(ParserErrorCode.EXTERNAL_TYPEDEF, modifiers.externalKeyword, []);
     }
     if (modifiers.finalKeyword != null) {
-      reportError8(ParserErrorCode.FINAL_TYPEDEF, modifiers.finalKeyword, []);
+      reportError9(ParserErrorCode.FINAL_TYPEDEF, modifiers.finalKeyword, []);
     }
     if (modifiers.varKeyword != null) {
-      reportError8(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword, []);
+      reportError9(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword, []);
     }
   }
 }
@@ -5745,134 +5745,134 @@
  *
  * @coverage dart.engine.parser
  */
-class ParserErrorCode implements Enum<ParserErrorCode>, ErrorCode {
-  static final ParserErrorCode ABSTRACT_CLASS_MEMBER = new ParserErrorCode.con2('ABSTRACT_CLASS_MEMBER', 0, "Members of classes cannot be declared to be 'abstract'");
-  static final ParserErrorCode ABSTRACT_STATIC_METHOD = new ParserErrorCode.con2('ABSTRACT_STATIC_METHOD', 1, "Static methods cannot be declared to be 'abstract'");
-  static final ParserErrorCode ABSTRACT_TOP_LEVEL_FUNCTION = new ParserErrorCode.con2('ABSTRACT_TOP_LEVEL_FUNCTION', 2, "Top-level functions cannot be declared to be 'abstract'");
-  static final ParserErrorCode ABSTRACT_TOP_LEVEL_VARIABLE = new ParserErrorCode.con2('ABSTRACT_TOP_LEVEL_VARIABLE', 3, "Top-level variables cannot be declared to be 'abstract'");
-  static final ParserErrorCode ABSTRACT_TYPEDEF = new ParserErrorCode.con2('ABSTRACT_TYPEDEF', 4, "Type aliases cannot be declared to be 'abstract'");
-  static final ParserErrorCode BREAK_OUTSIDE_OF_LOOP = new ParserErrorCode.con2('BREAK_OUTSIDE_OF_LOOP', 5, "A break statement cannot be used outside of a loop or switch statement");
-  static final ParserErrorCode CONST_AND_FINAL = new ParserErrorCode.con2('CONST_AND_FINAL', 6, "Members cannot be declared to be both 'const' and 'final'");
-  static final ParserErrorCode CONST_AND_VAR = new ParserErrorCode.con2('CONST_AND_VAR', 7, "Members cannot be declared to be both 'const' and 'var'");
-  static final ParserErrorCode CONST_CLASS = new ParserErrorCode.con2('CONST_CLASS', 8, "Classes cannot be declared to be 'const'");
-  static final ParserErrorCode CONST_CONSTRUCTOR_WITH_BODY = new ParserErrorCode.con2('CONST_CONSTRUCTOR_WITH_BODY', 9, "'const' constructors cannot have a body");
-  static final ParserErrorCode CONST_FACTORY = new ParserErrorCode.con2('CONST_FACTORY', 10, "Only redirecting factory constructors can be declared to be 'const'");
-  static final ParserErrorCode CONST_METHOD = new ParserErrorCode.con2('CONST_METHOD', 11, "Getters, setters and methods cannot be declared to be 'const'");
-  static final ParserErrorCode CONST_TYPEDEF = new ParserErrorCode.con2('CONST_TYPEDEF', 12, "Type aliases cannot be declared to be 'const'");
-  static final ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE = new ParserErrorCode.con2('CONSTRUCTOR_WITH_RETURN_TYPE', 13, "Constructors cannot have a return type");
-  static final ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP = new ParserErrorCode.con2('CONTINUE_OUTSIDE_OF_LOOP', 14, "A continue statement cannot be used outside of a loop or switch statement");
-  static final ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = new ParserErrorCode.con2('CONTINUE_WITHOUT_LABEL_IN_CASE', 15, "A continue statement in a switch statement must have a label as a target");
-  static final ParserErrorCode DEPRECATED_ARGUMENT_DEFINITION_TEST = new ParserErrorCode.con2('DEPRECATED_ARGUMENT_DEFINITION_TEST', 16, "The argument definition test ('?' operator) has been deprecated");
-  static final ParserErrorCode DIRECTIVE_AFTER_DECLARATION = new ParserErrorCode.con2('DIRECTIVE_AFTER_DECLARATION', 17, "Directives must appear before any declarations");
-  static final ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = new ParserErrorCode.con2('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 18, "The label %s was already used in this switch statement");
-  static final ParserErrorCode DUPLICATED_MODIFIER = new ParserErrorCode.con2('DUPLICATED_MODIFIER', 19, "The modifier '%s' was already specified.");
-  static final ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = new ParserErrorCode.con2('EQUALITY_CANNOT_BE_EQUALITY_OPERAND', 20, "Equality expression cannot be operand of another equality expression.");
-  static final ParserErrorCode EXPECTED_CASE_OR_DEFAULT = new ParserErrorCode.con2('EXPECTED_CASE_OR_DEFAULT', 21, "Expected 'case' or 'default'");
-  static final ParserErrorCode EXPECTED_CLASS_MEMBER = new ParserErrorCode.con2('EXPECTED_CLASS_MEMBER', 22, "Expected a class member");
-  static final ParserErrorCode EXPECTED_EXECUTABLE = new ParserErrorCode.con2('EXPECTED_EXECUTABLE', 23, "Expected a method, getter, setter or operator declaration");
-  static final ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = new ParserErrorCode.con2('EXPECTED_LIST_OR_MAP_LITERAL', 24, "Expected a list or map literal");
-  static final ParserErrorCode EXPECTED_STRING_LITERAL = new ParserErrorCode.con2('EXPECTED_STRING_LITERAL', 25, "Expected a string literal");
-  static final ParserErrorCode EXPECTED_TOKEN = new ParserErrorCode.con2('EXPECTED_TOKEN', 26, "Expected to find '%s'");
-  static final ParserErrorCode EXPECTED_ONE_LIST_TYPE_ARGUMENTS = new ParserErrorCode.con2('EXPECTED_ONE_LIST_TYPE_ARGUMENTS', 27, "List literal requires exactly one type arguments or none, but %d found");
-  static final ParserErrorCode EXPECTED_TWO_MAP_TYPE_ARGUMENTS = new ParserErrorCode.con2('EXPECTED_TWO_MAP_TYPE_ARGUMENTS', 28, "Map literal requires exactly two type arguments or none, but %d found");
-  static final ParserErrorCode EXPECTED_TYPE_NAME = new ParserErrorCode.con2('EXPECTED_TYPE_NAME', 29, "Expected a type name");
-  static final ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = new ParserErrorCode.con2('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 30, "Export directives must preceed part directives");
-  static final ParserErrorCode EXTERNAL_AFTER_CONST = new ParserErrorCode.con2('EXTERNAL_AFTER_CONST', 31, "The modifier 'external' should be before the modifier 'const'");
-  static final ParserErrorCode EXTERNAL_AFTER_FACTORY = new ParserErrorCode.con2('EXTERNAL_AFTER_FACTORY', 32, "The modifier 'external' should be before the modifier 'factory'");
-  static final ParserErrorCode EXTERNAL_AFTER_STATIC = new ParserErrorCode.con2('EXTERNAL_AFTER_STATIC', 33, "The modifier 'external' should be before the modifier 'static'");
-  static final ParserErrorCode EXTERNAL_CLASS = new ParserErrorCode.con2('EXTERNAL_CLASS', 34, "Classes cannot be declared to be 'external'");
-  static final ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_CONSTRUCTOR_WITH_BODY', 35, "External constructors cannot have a body");
-  static final ParserErrorCode EXTERNAL_FIELD = new ParserErrorCode.con2('EXTERNAL_FIELD', 36, "Fields cannot be declared to be 'external'");
-  static final ParserErrorCode EXTERNAL_GETTER_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_GETTER_WITH_BODY', 37, "External getters cannot have a body");
-  static final ParserErrorCode EXTERNAL_METHOD_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_METHOD_WITH_BODY', 38, "External methods cannot have a body");
-  static final ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_OPERATOR_WITH_BODY', 39, "External operators cannot have a body");
-  static final ParserErrorCode EXTERNAL_SETTER_WITH_BODY = new ParserErrorCode.con2('EXTERNAL_SETTER_WITH_BODY', 40, "External setters cannot have a body");
-  static final ParserErrorCode EXTERNAL_TYPEDEF = new ParserErrorCode.con2('EXTERNAL_TYPEDEF', 41, "Type aliases cannot be declared to be 'external'");
-  static final ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = new ParserErrorCode.con2('FACTORY_TOP_LEVEL_DECLARATION', 42, "Top-level declarations cannot be declared to be 'factory'");
-  static final ParserErrorCode FACTORY_WITHOUT_BODY = new ParserErrorCode.con2('FACTORY_WITHOUT_BODY', 43, "A non-redirecting 'factory' constructor must have a body");
-  static final ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = new ParserErrorCode.con2('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 44, "Field initializers can only be used in a constructor");
-  static final ParserErrorCode FINAL_AND_VAR = new ParserErrorCode.con2('FINAL_AND_VAR', 45, "Members cannot be declared to be both 'final' and 'var'");
-  static final ParserErrorCode FINAL_CLASS = new ParserErrorCode.con2('FINAL_CLASS', 46, "Classes cannot be declared to be 'final'");
-  static final ParserErrorCode FINAL_CONSTRUCTOR = new ParserErrorCode.con2('FINAL_CONSTRUCTOR', 47, "A constructor cannot be declared to be 'final'");
-  static final ParserErrorCode FINAL_METHOD = new ParserErrorCode.con2('FINAL_METHOD', 48, "Getters, setters and methods cannot be declared to be 'final'");
-  static final ParserErrorCode FINAL_TYPEDEF = new ParserErrorCode.con2('FINAL_TYPEDEF', 49, "Type aliases cannot be declared to be 'final'");
-  static final ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = new ParserErrorCode.con2('FUNCTION_TYPED_PARAMETER_VAR', 50, "Function typed parameters cannot specify 'const', 'final' or 'var' instead of return type");
-  static final ParserErrorCode GETTER_WITH_PARAMETERS = new ParserErrorCode.con2('GETTER_WITH_PARAMETERS', 51, "Getter should be declared without a parameter list");
-  static final ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = new ParserErrorCode.con2('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 52, "Illegal assignment to non-assignable expression");
-  static final ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = new ParserErrorCode.con2('IMPLEMENTS_BEFORE_EXTENDS', 53, "The extends clause must be before the implements clause");
-  static final ParserErrorCode IMPLEMENTS_BEFORE_WITH = new ParserErrorCode.con2('IMPLEMENTS_BEFORE_WITH', 54, "The with clause must be before the implements clause");
-  static final ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = new ParserErrorCode.con2('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 55, "Import directives must preceed part directives");
-  static final ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = new ParserErrorCode.con2('INITIALIZED_VARIABLE_IN_FOR_EACH', 56, "The loop variable in a for-each loop cannot be initialized");
-  static final ParserErrorCode INVALID_CODE_POINT = new ParserErrorCode.con2('INVALID_CODE_POINT', 57, "The escape sequence '%s' is not a valid code point");
-  static final ParserErrorCode INVALID_COMMENT_REFERENCE = new ParserErrorCode.con2('INVALID_COMMENT_REFERENCE', 58, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
-  static final ParserErrorCode INVALID_HEX_ESCAPE = new ParserErrorCode.con2('INVALID_HEX_ESCAPE', 59, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
-  static final ParserErrorCode INVALID_OPERATOR = new ParserErrorCode.con2('INVALID_OPERATOR', 60, "The string '%s' is not a valid operator");
-  static final ParserErrorCode INVALID_OPERATOR_FOR_SUPER = new ParserErrorCode.con2('INVALID_OPERATOR_FOR_SUPER', 61, "The operator '%s' cannot be used with 'super'");
-  static final ParserErrorCode INVALID_UNICODE_ESCAPE = new ParserErrorCode.con2('INVALID_UNICODE_ESCAPE', 62, "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
-  static final ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = new ParserErrorCode.con2('LIBRARY_DIRECTIVE_NOT_FIRST', 63, "The library directive must appear before all other directives");
-  static final ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = new ParserErrorCode.con2('LOCAL_FUNCTION_DECLARATION_MODIFIER', 64, "Local function declarations cannot specify any modifier");
-  static final ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = new ParserErrorCode.con2('MISSING_ASSIGNABLE_SELECTOR', 65, "Missing selector such as \".<identifier>\" or \"[0]\"");
-  static final ParserErrorCode MISSING_CATCH_OR_FINALLY = new ParserErrorCode.con2('MISSING_CATCH_OR_FINALLY', 66, "A try statement must have either a catch or finally clause");
-  static final ParserErrorCode MISSING_CLASS_BODY = new ParserErrorCode.con2('MISSING_CLASS_BODY', 67, "A class definition must have a body, even if it is empty");
-  static final ParserErrorCode MISSING_CLOSING_PARENTHESIS = new ParserErrorCode.con2('MISSING_CLOSING_PARENTHESIS', 68, "The closing parenthesis is missing");
-  static final ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = new ParserErrorCode.con2('MISSING_CONST_FINAL_VAR_OR_TYPE', 69, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
-  static final ParserErrorCode MISSING_EXPRESSION_IN_THROW = new ParserErrorCode.con2('MISSING_EXPRESSION_IN_THROW', 70, "Throw expressions must compute the object to be thrown");
-  static final ParserErrorCode MISSING_FUNCTION_BODY = new ParserErrorCode.con2('MISSING_FUNCTION_BODY', 71, "A function body must be provided");
-  static final ParserErrorCode MISSING_FUNCTION_PARAMETERS = new ParserErrorCode.con2('MISSING_FUNCTION_PARAMETERS', 72, "Functions must have an explicit list of parameters");
-  static final ParserErrorCode MISSING_IDENTIFIER = new ParserErrorCode.con2('MISSING_IDENTIFIER', 73, "Expected an identifier");
-  static final ParserErrorCode MISSING_KEYWORD_OPERATOR = new ParserErrorCode.con2('MISSING_KEYWORD_OPERATOR', 74, "Operator declarations must be preceeded by the keyword 'operator'");
-  static final ParserErrorCode MISSING_NAME_IN_LIBRARY_DIRECTIVE = new ParserErrorCode.con2('MISSING_NAME_IN_LIBRARY_DIRECTIVE', 75, "Library directives must include a library name");
-  static final ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE = new ParserErrorCode.con2('MISSING_NAME_IN_PART_OF_DIRECTIVE', 76, "Library directives must include a library name");
-  static final ParserErrorCode MISSING_STATEMENT = new ParserErrorCode.con2('MISSING_STATEMENT', 77, "Expected a statement");
-  static final ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con2('MISSING_TERMINATOR_FOR_PARAMETER_GROUP', 78, "There is no '%s' to close the parameter group");
-  static final ParserErrorCode MISSING_TYPEDEF_PARAMETERS = new ParserErrorCode.con2('MISSING_TYPEDEF_PARAMETERS', 79, "Type aliases for functions must have an explicit list of parameters");
-  static final ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = new ParserErrorCode.con2('MISSING_VARIABLE_IN_FOR_EACH', 80, "A loop variable must be declared in a for-each loop before the 'in', but none were found");
-  static final ParserErrorCode MIXED_PARAMETER_GROUPS = new ParserErrorCode.con2('MIXED_PARAMETER_GROUPS', 81, "Cannot have both positional and named parameters in a single parameter list");
-  static final ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = new ParserErrorCode.con2('MULTIPLE_EXTENDS_CLAUSES', 82, "Each class definition can have at most one extends clause");
-  static final ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = new ParserErrorCode.con2('MULTIPLE_IMPLEMENTS_CLAUSES', 83, "Each class definition can have at most one implements clause");
-  static final ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES = new ParserErrorCode.con2('MULTIPLE_LIBRARY_DIRECTIVES', 84, "Only one library directive may be declared in a file");
-  static final ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS = new ParserErrorCode.con2('MULTIPLE_NAMED_PARAMETER_GROUPS', 85, "Cannot have multiple groups of named parameters in a single parameter list");
-  static final ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES = new ParserErrorCode.con2('MULTIPLE_PART_OF_DIRECTIVES', 86, "Only one part-of directive may be declared in a file");
-  static final ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS = new ParserErrorCode.con2('MULTIPLE_POSITIONAL_PARAMETER_GROUPS', 87, "Cannot have multiple groups of positional parameters in a single parameter list");
-  static final ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH = new ParserErrorCode.con2('MULTIPLE_VARIABLES_IN_FOR_EACH', 88, "A single loop variable must be declared in a for-each loop before the 'in', but %s were found");
-  static final ParserErrorCode MULTIPLE_WITH_CLAUSES = new ParserErrorCode.con2('MULTIPLE_WITH_CLAUSES', 89, "Each class definition can have at most one with clause");
-  static final ParserErrorCode NAMED_FUNCTION_EXPRESSION = new ParserErrorCode.con2('NAMED_FUNCTION_EXPRESSION', 90, "Function expressions cannot be named");
-  static final ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con2('NAMED_PARAMETER_OUTSIDE_GROUP', 91, "Named parameters must be enclosed in curly braces ('{' and '}')");
-  static final ParserErrorCode NATIVE_CLAUSE_IN_NON_SDK_CODE = new ParserErrorCode.con2('NATIVE_CLAUSE_IN_NON_SDK_CODE', 92, "Native clause can only be used in the SDK and code that is loaded through native extensions");
-  static final ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = new ParserErrorCode.con2('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', 93, "Native functions can only be declared in the SDK and code that is loaded through native extensions");
-  static final ParserErrorCode NON_CONSTRUCTOR_FACTORY = new ParserErrorCode.con2('NON_CONSTRUCTOR_FACTORY', 94, "Only constructors can be declared to be a 'factory'");
-  static final ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = new ParserErrorCode.con2('NON_IDENTIFIER_LIBRARY_NAME', 95, "The name of a library must be an identifier");
-  static final ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = new ParserErrorCode.con2('NON_PART_OF_DIRECTIVE_IN_PART', 96, "The part-of directive must be the only directive in a part");
-  static final ParserErrorCode NON_USER_DEFINABLE_OPERATOR = new ParserErrorCode.con2('NON_USER_DEFINABLE_OPERATOR', 97, "The operator '%s' is not user definable");
-  static final ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = new ParserErrorCode.con2('NORMAL_BEFORE_OPTIONAL_PARAMETERS', 98, "Normal parameters must occur before optional parameters");
-  static final ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = new ParserErrorCode.con2('POSITIONAL_AFTER_NAMED_ARGUMENT', 99, "Positional arguments must occur before named arguments");
-  static final ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con2('POSITIONAL_PARAMETER_OUTSIDE_GROUP', 100, "Positional parameters must be enclosed in square brackets ('[' and ']')");
-  static final ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR = new ParserErrorCode.con2('REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR', 101, "Only factory constructor can specify '=' redirection.");
-  static final ParserErrorCode STATIC_AFTER_CONST = new ParserErrorCode.con2('STATIC_AFTER_CONST', 102, "The modifier 'static' should be before the modifier 'const'");
-  static final ParserErrorCode STATIC_AFTER_FINAL = new ParserErrorCode.con2('STATIC_AFTER_FINAL', 103, "The modifier 'static' should be before the modifier 'final'");
-  static final ParserErrorCode STATIC_AFTER_VAR = new ParserErrorCode.con2('STATIC_AFTER_VAR', 104, "The modifier 'static' should be before the modifier 'var'");
-  static final ParserErrorCode STATIC_CONSTRUCTOR = new ParserErrorCode.con2('STATIC_CONSTRUCTOR', 105, "Constructors cannot be static");
-  static final ParserErrorCode STATIC_GETTER_WITHOUT_BODY = new ParserErrorCode.con2('STATIC_GETTER_WITHOUT_BODY', 106, "A 'static' getter must have a body");
-  static final ParserErrorCode STATIC_OPERATOR = new ParserErrorCode.con2('STATIC_OPERATOR', 107, "Operators cannot be static");
-  static final ParserErrorCode STATIC_SETTER_WITHOUT_BODY = new ParserErrorCode.con2('STATIC_SETTER_WITHOUT_BODY', 108, "A 'static' setter must have a body");
-  static final ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = new ParserErrorCode.con2('STATIC_TOP_LEVEL_DECLARATION', 109, "Top-level declarations cannot be declared to be 'static'");
-  static final ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = new ParserErrorCode.con2('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', 110, "The 'default' case should be the last case in a switch statement");
-  static final ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = new ParserErrorCode.con2('SWITCH_HAS_MULTIPLE_DEFAULT_CASES', 111, "The 'default' case can only be declared once");
-  static final ParserErrorCode TOP_LEVEL_OPERATOR = new ParserErrorCode.con2('TOP_LEVEL_OPERATOR', 112, "Operators must be declared within a class");
-  static final ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con2('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', 113, "There is no '%s' to open a parameter group");
-  static final ParserErrorCode UNEXPECTED_TOKEN = new ParserErrorCode.con2('UNEXPECTED_TOKEN', 114, "Unexpected token '%s'");
-  static final ParserErrorCode WITH_BEFORE_EXTENDS = new ParserErrorCode.con2('WITH_BEFORE_EXTENDS', 115, "The extends clause must be before the with clause");
-  static final ParserErrorCode WITH_WITHOUT_EXTENDS = new ParserErrorCode.con2('WITH_WITHOUT_EXTENDS', 116, "The with clause cannot be used without an extends clause");
-  static final ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = new ParserErrorCode.con2('WRONG_SEPARATOR_FOR_NAMED_PARAMETER', 117, "The default value of a named parameter should be preceeded by ':'");
-  static final ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = new ParserErrorCode.con2('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', 118, "The default value of a positional parameter should be preceeded by '='");
-  static final ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con2('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', 119, "Expected '%s' to close parameter group");
-  static final ParserErrorCode VAR_AND_TYPE = new ParserErrorCode.con2('VAR_AND_TYPE', 120, "Variables cannot be declared using both 'var' and a type name; remove the 'var'");
-  static final ParserErrorCode VAR_AS_TYPE_NAME = new ParserErrorCode.con2('VAR_AS_TYPE_NAME', 121, "The keyword 'var' cannot be used as a type name");
-  static final ParserErrorCode VAR_CLASS = new ParserErrorCode.con2('VAR_CLASS', 122, "Classes cannot be declared to be 'var'");
-  static final ParserErrorCode VAR_RETURN_TYPE = new ParserErrorCode.con2('VAR_RETURN_TYPE', 123, "The return type cannot be 'var'");
-  static final ParserErrorCode VAR_TYPEDEF = new ParserErrorCode.con2('VAR_TYPEDEF', 124, "Type aliases cannot be declared to be 'var'");
-  static final ParserErrorCode VOID_PARAMETER = new ParserErrorCode.con2('VOID_PARAMETER', 125, "Parameters cannot have a type of 'void'");
-  static final ParserErrorCode VOID_VARIABLE = new ParserErrorCode.con2('VOID_VARIABLE', 126, "Variables cannot have a type of 'void'");
+class ParserErrorCode extends Enum<ParserErrorCode> implements ErrorCode {
+  static final ParserErrorCode ABSTRACT_CLASS_MEMBER = new ParserErrorCode.con3('ABSTRACT_CLASS_MEMBER', 0, "Members of classes cannot be declared to be 'abstract'");
+  static final ParserErrorCode ABSTRACT_STATIC_METHOD = new ParserErrorCode.con3('ABSTRACT_STATIC_METHOD', 1, "Static methods cannot be declared to be 'abstract'");
+  static final ParserErrorCode ABSTRACT_TOP_LEVEL_FUNCTION = new ParserErrorCode.con3('ABSTRACT_TOP_LEVEL_FUNCTION', 2, "Top-level functions cannot be declared to be 'abstract'");
+  static final ParserErrorCode ABSTRACT_TOP_LEVEL_VARIABLE = new ParserErrorCode.con3('ABSTRACT_TOP_LEVEL_VARIABLE', 3, "Top-level variables cannot be declared to be 'abstract'");
+  static final ParserErrorCode ABSTRACT_TYPEDEF = new ParserErrorCode.con3('ABSTRACT_TYPEDEF', 4, "Type aliases cannot be declared to be 'abstract'");
+  static final ParserErrorCode BREAK_OUTSIDE_OF_LOOP = new ParserErrorCode.con3('BREAK_OUTSIDE_OF_LOOP', 5, "A break statement cannot be used outside of a loop or switch statement");
+  static final ParserErrorCode CONST_AND_FINAL = new ParserErrorCode.con3('CONST_AND_FINAL', 6, "Members cannot be declared to be both 'const' and 'final'");
+  static final ParserErrorCode CONST_AND_VAR = new ParserErrorCode.con3('CONST_AND_VAR', 7, "Members cannot be declared to be both 'const' and 'var'");
+  static final ParserErrorCode CONST_CLASS = new ParserErrorCode.con3('CONST_CLASS', 8, "Classes cannot be declared to be 'const'");
+  static final ParserErrorCode CONST_CONSTRUCTOR_WITH_BODY = new ParserErrorCode.con3('CONST_CONSTRUCTOR_WITH_BODY', 9, "'const' constructors cannot have a body");
+  static final ParserErrorCode CONST_FACTORY = new ParserErrorCode.con3('CONST_FACTORY', 10, "Only redirecting factory constructors can be declared to be 'const'");
+  static final ParserErrorCode CONST_METHOD = new ParserErrorCode.con3('CONST_METHOD', 11, "Getters, setters and methods cannot be declared to be 'const'");
+  static final ParserErrorCode CONST_TYPEDEF = new ParserErrorCode.con3('CONST_TYPEDEF', 12, "Type aliases cannot be declared to be 'const'");
+  static final ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE = new ParserErrorCode.con3('CONSTRUCTOR_WITH_RETURN_TYPE', 13, "Constructors cannot have a return type");
+  static final ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP = new ParserErrorCode.con3('CONTINUE_OUTSIDE_OF_LOOP', 14, "A continue statement cannot be used outside of a loop or switch statement");
+  static final ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = new ParserErrorCode.con3('CONTINUE_WITHOUT_LABEL_IN_CASE', 15, "A continue statement in a switch statement must have a label as a target");
+  static final ParserErrorCode DEPRECATED_ARGUMENT_DEFINITION_TEST = new ParserErrorCode.con3('DEPRECATED_ARGUMENT_DEFINITION_TEST', 16, "The argument definition test ('?' operator) has been deprecated");
+  static final ParserErrorCode DIRECTIVE_AFTER_DECLARATION = new ParserErrorCode.con3('DIRECTIVE_AFTER_DECLARATION', 17, "Directives must appear before any declarations");
+  static final ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = new ParserErrorCode.con3('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 18, "The label %s was already used in this switch statement");
+  static final ParserErrorCode DUPLICATED_MODIFIER = new ParserErrorCode.con3('DUPLICATED_MODIFIER', 19, "The modifier '%s' was already specified.");
+  static final ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = new ParserErrorCode.con3('EQUALITY_CANNOT_BE_EQUALITY_OPERAND', 20, "Equality expression cannot be operand of another equality expression.");
+  static final ParserErrorCode EXPECTED_CASE_OR_DEFAULT = new ParserErrorCode.con3('EXPECTED_CASE_OR_DEFAULT', 21, "Expected 'case' or 'default'");
+  static final ParserErrorCode EXPECTED_CLASS_MEMBER = new ParserErrorCode.con3('EXPECTED_CLASS_MEMBER', 22, "Expected a class member");
+  static final ParserErrorCode EXPECTED_EXECUTABLE = new ParserErrorCode.con3('EXPECTED_EXECUTABLE', 23, "Expected a method, getter, setter or operator declaration");
+  static final ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = new ParserErrorCode.con3('EXPECTED_LIST_OR_MAP_LITERAL', 24, "Expected a list or map literal");
+  static final ParserErrorCode EXPECTED_STRING_LITERAL = new ParserErrorCode.con3('EXPECTED_STRING_LITERAL', 25, "Expected a string literal");
+  static final ParserErrorCode EXPECTED_TOKEN = new ParserErrorCode.con3('EXPECTED_TOKEN', 26, "Expected to find '%s'");
+  static final ParserErrorCode EXPECTED_ONE_LIST_TYPE_ARGUMENTS = new ParserErrorCode.con3('EXPECTED_ONE_LIST_TYPE_ARGUMENTS', 27, "List literal requires exactly one type arguments or none, but %d found");
+  static final ParserErrorCode EXPECTED_TWO_MAP_TYPE_ARGUMENTS = new ParserErrorCode.con3('EXPECTED_TWO_MAP_TYPE_ARGUMENTS', 28, "Map literal requires exactly two type arguments or none, but %d found");
+  static final ParserErrorCode EXPECTED_TYPE_NAME = new ParserErrorCode.con3('EXPECTED_TYPE_NAME', 29, "Expected a type name");
+  static final ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = new ParserErrorCode.con3('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 30, "Export directives must preceed part directives");
+  static final ParserErrorCode EXTERNAL_AFTER_CONST = new ParserErrorCode.con3('EXTERNAL_AFTER_CONST', 31, "The modifier 'external' should be before the modifier 'const'");
+  static final ParserErrorCode EXTERNAL_AFTER_FACTORY = new ParserErrorCode.con3('EXTERNAL_AFTER_FACTORY', 32, "The modifier 'external' should be before the modifier 'factory'");
+  static final ParserErrorCode EXTERNAL_AFTER_STATIC = new ParserErrorCode.con3('EXTERNAL_AFTER_STATIC', 33, "The modifier 'external' should be before the modifier 'static'");
+  static final ParserErrorCode EXTERNAL_CLASS = new ParserErrorCode.con3('EXTERNAL_CLASS', 34, "Classes cannot be declared to be 'external'");
+  static final ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_CONSTRUCTOR_WITH_BODY', 35, "External constructors cannot have a body");
+  static final ParserErrorCode EXTERNAL_FIELD = new ParserErrorCode.con3('EXTERNAL_FIELD', 36, "Fields cannot be declared to be 'external'");
+  static final ParserErrorCode EXTERNAL_GETTER_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_GETTER_WITH_BODY', 37, "External getters cannot have a body");
+  static final ParserErrorCode EXTERNAL_METHOD_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_METHOD_WITH_BODY', 38, "External methods cannot have a body");
+  static final ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_OPERATOR_WITH_BODY', 39, "External operators cannot have a body");
+  static final ParserErrorCode EXTERNAL_SETTER_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_SETTER_WITH_BODY', 40, "External setters cannot have a body");
+  static final ParserErrorCode EXTERNAL_TYPEDEF = new ParserErrorCode.con3('EXTERNAL_TYPEDEF', 41, "Type aliases cannot be declared to be 'external'");
+  static final ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = new ParserErrorCode.con3('FACTORY_TOP_LEVEL_DECLARATION', 42, "Top-level declarations cannot be declared to be 'factory'");
+  static final ParserErrorCode FACTORY_WITHOUT_BODY = new ParserErrorCode.con3('FACTORY_WITHOUT_BODY', 43, "A non-redirecting 'factory' constructor must have a body");
+  static final ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = new ParserErrorCode.con3('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 44, "Field initializers can only be used in a constructor");
+  static final ParserErrorCode FINAL_AND_VAR = new ParserErrorCode.con3('FINAL_AND_VAR', 45, "Members cannot be declared to be both 'final' and 'var'");
+  static final ParserErrorCode FINAL_CLASS = new ParserErrorCode.con3('FINAL_CLASS', 46, "Classes cannot be declared to be 'final'");
+  static final ParserErrorCode FINAL_CONSTRUCTOR = new ParserErrorCode.con3('FINAL_CONSTRUCTOR', 47, "A constructor cannot be declared to be 'final'");
+  static final ParserErrorCode FINAL_METHOD = new ParserErrorCode.con3('FINAL_METHOD', 48, "Getters, setters and methods cannot be declared to be 'final'");
+  static final ParserErrorCode FINAL_TYPEDEF = new ParserErrorCode.con3('FINAL_TYPEDEF', 49, "Type aliases cannot be declared to be 'final'");
+  static final ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = new ParserErrorCode.con3('FUNCTION_TYPED_PARAMETER_VAR', 50, "Function typed parameters cannot specify 'const', 'final' or 'var' instead of return type");
+  static final ParserErrorCode GETTER_WITH_PARAMETERS = new ParserErrorCode.con3('GETTER_WITH_PARAMETERS', 51, "Getter should be declared without a parameter list");
+  static final ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = new ParserErrorCode.con3('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 52, "Illegal assignment to non-assignable expression");
+  static final ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = new ParserErrorCode.con3('IMPLEMENTS_BEFORE_EXTENDS', 53, "The extends clause must be before the implements clause");
+  static final ParserErrorCode IMPLEMENTS_BEFORE_WITH = new ParserErrorCode.con3('IMPLEMENTS_BEFORE_WITH', 54, "The with clause must be before the implements clause");
+  static final ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = new ParserErrorCode.con3('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 55, "Import directives must preceed part directives");
+  static final ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = new ParserErrorCode.con3('INITIALIZED_VARIABLE_IN_FOR_EACH', 56, "The loop variable in a for-each loop cannot be initialized");
+  static final ParserErrorCode INVALID_CODE_POINT = new ParserErrorCode.con3('INVALID_CODE_POINT', 57, "The escape sequence '%s' is not a valid code point");
+  static final ParserErrorCode INVALID_COMMENT_REFERENCE = new ParserErrorCode.con3('INVALID_COMMENT_REFERENCE', 58, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
+  static final ParserErrorCode INVALID_HEX_ESCAPE = new ParserErrorCode.con3('INVALID_HEX_ESCAPE', 59, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
+  static final ParserErrorCode INVALID_OPERATOR = new ParserErrorCode.con3('INVALID_OPERATOR', 60, "The string '%s' is not a valid operator");
+  static final ParserErrorCode INVALID_OPERATOR_FOR_SUPER = new ParserErrorCode.con3('INVALID_OPERATOR_FOR_SUPER', 61, "The operator '%s' cannot be used with 'super'");
+  static final ParserErrorCode INVALID_UNICODE_ESCAPE = new ParserErrorCode.con3('INVALID_UNICODE_ESCAPE', 62, "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
+  static final ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = new ParserErrorCode.con3('LIBRARY_DIRECTIVE_NOT_FIRST', 63, "The library directive must appear before all other directives");
+  static final ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = new ParserErrorCode.con3('LOCAL_FUNCTION_DECLARATION_MODIFIER', 64, "Local function declarations cannot specify any modifier");
+  static final ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = new ParserErrorCode.con3('MISSING_ASSIGNABLE_SELECTOR', 65, "Missing selector such as \".<identifier>\" or \"[0]\"");
+  static final ParserErrorCode MISSING_CATCH_OR_FINALLY = new ParserErrorCode.con3('MISSING_CATCH_OR_FINALLY', 66, "A try statement must have either a catch or finally clause");
+  static final ParserErrorCode MISSING_CLASS_BODY = new ParserErrorCode.con3('MISSING_CLASS_BODY', 67, "A class definition must have a body, even if it is empty");
+  static final ParserErrorCode MISSING_CLOSING_PARENTHESIS = new ParserErrorCode.con3('MISSING_CLOSING_PARENTHESIS', 68, "The closing parenthesis is missing");
+  static final ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = new ParserErrorCode.con3('MISSING_CONST_FINAL_VAR_OR_TYPE', 69, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
+  static final ParserErrorCode MISSING_EXPRESSION_IN_THROW = new ParserErrorCode.con3('MISSING_EXPRESSION_IN_THROW', 70, "Throw expressions must compute the object to be thrown");
+  static final ParserErrorCode MISSING_FUNCTION_BODY = new ParserErrorCode.con3('MISSING_FUNCTION_BODY', 71, "A function body must be provided");
+  static final ParserErrorCode MISSING_FUNCTION_PARAMETERS = new ParserErrorCode.con3('MISSING_FUNCTION_PARAMETERS', 72, "Functions must have an explicit list of parameters");
+  static final ParserErrorCode MISSING_IDENTIFIER = new ParserErrorCode.con3('MISSING_IDENTIFIER', 73, "Expected an identifier");
+  static final ParserErrorCode MISSING_KEYWORD_OPERATOR = new ParserErrorCode.con3('MISSING_KEYWORD_OPERATOR', 74, "Operator declarations must be preceeded by the keyword 'operator'");
+  static final ParserErrorCode MISSING_NAME_IN_LIBRARY_DIRECTIVE = new ParserErrorCode.con3('MISSING_NAME_IN_LIBRARY_DIRECTIVE', 75, "Library directives must include a library name");
+  static final ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE = new ParserErrorCode.con3('MISSING_NAME_IN_PART_OF_DIRECTIVE', 76, "Library directives must include a library name");
+  static final ParserErrorCode MISSING_STATEMENT = new ParserErrorCode.con3('MISSING_STATEMENT', 77, "Expected a statement");
+  static final ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con3('MISSING_TERMINATOR_FOR_PARAMETER_GROUP', 78, "There is no '%s' to close the parameter group");
+  static final ParserErrorCode MISSING_TYPEDEF_PARAMETERS = new ParserErrorCode.con3('MISSING_TYPEDEF_PARAMETERS', 79, "Type aliases for functions must have an explicit list of parameters");
+  static final ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = new ParserErrorCode.con3('MISSING_VARIABLE_IN_FOR_EACH', 80, "A loop variable must be declared in a for-each loop before the 'in', but none were found");
+  static final ParserErrorCode MIXED_PARAMETER_GROUPS = new ParserErrorCode.con3('MIXED_PARAMETER_GROUPS', 81, "Cannot have both positional and named parameters in a single parameter list");
+  static final ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = new ParserErrorCode.con3('MULTIPLE_EXTENDS_CLAUSES', 82, "Each class definition can have at most one extends clause");
+  static final ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = new ParserErrorCode.con3('MULTIPLE_IMPLEMENTS_CLAUSES', 83, "Each class definition can have at most one implements clause");
+  static final ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES = new ParserErrorCode.con3('MULTIPLE_LIBRARY_DIRECTIVES', 84, "Only one library directive may be declared in a file");
+  static final ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS = new ParserErrorCode.con3('MULTIPLE_NAMED_PARAMETER_GROUPS', 85, "Cannot have multiple groups of named parameters in a single parameter list");
+  static final ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES = new ParserErrorCode.con3('MULTIPLE_PART_OF_DIRECTIVES', 86, "Only one part-of directive may be declared in a file");
+  static final ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS = new ParserErrorCode.con3('MULTIPLE_POSITIONAL_PARAMETER_GROUPS', 87, "Cannot have multiple groups of positional parameters in a single parameter list");
+  static final ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH = new ParserErrorCode.con3('MULTIPLE_VARIABLES_IN_FOR_EACH', 88, "A single loop variable must be declared in a for-each loop before the 'in', but %s were found");
+  static final ParserErrorCode MULTIPLE_WITH_CLAUSES = new ParserErrorCode.con3('MULTIPLE_WITH_CLAUSES', 89, "Each class definition can have at most one with clause");
+  static final ParserErrorCode NAMED_FUNCTION_EXPRESSION = new ParserErrorCode.con3('NAMED_FUNCTION_EXPRESSION', 90, "Function expressions cannot be named");
+  static final ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con3('NAMED_PARAMETER_OUTSIDE_GROUP', 91, "Named parameters must be enclosed in curly braces ('{' and '}')");
+  static final ParserErrorCode NATIVE_CLAUSE_IN_NON_SDK_CODE = new ParserErrorCode.con3('NATIVE_CLAUSE_IN_NON_SDK_CODE', 92, "Native clause can only be used in the SDK and code that is loaded through native extensions");
+  static final ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = new ParserErrorCode.con3('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', 93, "Native functions can only be declared in the SDK and code that is loaded through native extensions");
+  static final ParserErrorCode NON_CONSTRUCTOR_FACTORY = new ParserErrorCode.con3('NON_CONSTRUCTOR_FACTORY', 94, "Only constructors can be declared to be a 'factory'");
+  static final ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = new ParserErrorCode.con3('NON_IDENTIFIER_LIBRARY_NAME', 95, "The name of a library must be an identifier");
+  static final ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = new ParserErrorCode.con3('NON_PART_OF_DIRECTIVE_IN_PART', 96, "The part-of directive must be the only directive in a part");
+  static final ParserErrorCode NON_USER_DEFINABLE_OPERATOR = new ParserErrorCode.con3('NON_USER_DEFINABLE_OPERATOR', 97, "The operator '%s' is not user definable");
+  static final ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = new ParserErrorCode.con3('NORMAL_BEFORE_OPTIONAL_PARAMETERS', 98, "Normal parameters must occur before optional parameters");
+  static final ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = new ParserErrorCode.con3('POSITIONAL_AFTER_NAMED_ARGUMENT', 99, "Positional arguments must occur before named arguments");
+  static final ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con3('POSITIONAL_PARAMETER_OUTSIDE_GROUP', 100, "Positional parameters must be enclosed in square brackets ('[' and ']')");
+  static final ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR = new ParserErrorCode.con3('REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR', 101, "Only factory constructor can specify '=' redirection.");
+  static final ParserErrorCode STATIC_AFTER_CONST = new ParserErrorCode.con3('STATIC_AFTER_CONST', 102, "The modifier 'static' should be before the modifier 'const'");
+  static final ParserErrorCode STATIC_AFTER_FINAL = new ParserErrorCode.con3('STATIC_AFTER_FINAL', 103, "The modifier 'static' should be before the modifier 'final'");
+  static final ParserErrorCode STATIC_AFTER_VAR = new ParserErrorCode.con3('STATIC_AFTER_VAR', 104, "The modifier 'static' should be before the modifier 'var'");
+  static final ParserErrorCode STATIC_CONSTRUCTOR = new ParserErrorCode.con3('STATIC_CONSTRUCTOR', 105, "Constructors cannot be static");
+  static final ParserErrorCode STATIC_GETTER_WITHOUT_BODY = new ParserErrorCode.con3('STATIC_GETTER_WITHOUT_BODY', 106, "A 'static' getter must have a body");
+  static final ParserErrorCode STATIC_OPERATOR = new ParserErrorCode.con3('STATIC_OPERATOR', 107, "Operators cannot be static");
+  static final ParserErrorCode STATIC_SETTER_WITHOUT_BODY = new ParserErrorCode.con3('STATIC_SETTER_WITHOUT_BODY', 108, "A 'static' setter must have a body");
+  static final ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = new ParserErrorCode.con3('STATIC_TOP_LEVEL_DECLARATION', 109, "Top-level declarations cannot be declared to be 'static'");
+  static final ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = new ParserErrorCode.con3('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', 110, "The 'default' case should be the last case in a switch statement");
+  static final ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = new ParserErrorCode.con3('SWITCH_HAS_MULTIPLE_DEFAULT_CASES', 111, "The 'default' case can only be declared once");
+  static final ParserErrorCode TOP_LEVEL_OPERATOR = new ParserErrorCode.con3('TOP_LEVEL_OPERATOR', 112, "Operators must be declared within a class");
+  static final ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con3('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', 113, "There is no '%s' to open a parameter group");
+  static final ParserErrorCode UNEXPECTED_TOKEN = new ParserErrorCode.con3('UNEXPECTED_TOKEN', 114, "Unexpected token '%s'");
+  static final ParserErrorCode WITH_BEFORE_EXTENDS = new ParserErrorCode.con3('WITH_BEFORE_EXTENDS', 115, "The extends clause must be before the with clause");
+  static final ParserErrorCode WITH_WITHOUT_EXTENDS = new ParserErrorCode.con3('WITH_WITHOUT_EXTENDS', 116, "The with clause cannot be used without an extends clause");
+  static final ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = new ParserErrorCode.con3('WRONG_SEPARATOR_FOR_NAMED_PARAMETER', 117, "The default value of a named parameter should be preceeded by ':'");
+  static final ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = new ParserErrorCode.con3('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', 118, "The default value of a positional parameter should be preceeded by '='");
+  static final ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con3('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', 119, "Expected '%s' to close parameter group");
+  static final ParserErrorCode VAR_AND_TYPE = new ParserErrorCode.con3('VAR_AND_TYPE', 120, "Variables cannot be declared using both 'var' and a type name; remove the 'var'");
+  static final ParserErrorCode VAR_AS_TYPE_NAME = new ParserErrorCode.con3('VAR_AS_TYPE_NAME', 121, "The keyword 'var' cannot be used as a type name");
+  static final ParserErrorCode VAR_CLASS = new ParserErrorCode.con3('VAR_CLASS', 122, "Classes cannot be declared to be 'var'");
+  static final ParserErrorCode VAR_RETURN_TYPE = new ParserErrorCode.con3('VAR_RETURN_TYPE', 123, "The return type cannot be 'var'");
+  static final ParserErrorCode VAR_TYPEDEF = new ParserErrorCode.con3('VAR_TYPEDEF', 124, "Type aliases cannot be declared to be 'var'");
+  static final ParserErrorCode VOID_PARAMETER = new ParserErrorCode.con3('VOID_PARAMETER', 125, "Parameters cannot have a type of 'void'");
+  static final ParserErrorCode VOID_VARIABLE = new ParserErrorCode.con3('VOID_VARIABLE', 126, "Variables cannot have a type of 'void'");
   static final List<ParserErrorCode> values = [
       ABSTRACT_CLASS_MEMBER,
       ABSTRACT_STATIC_METHOD,
@@ -6002,45 +6002,56 @@
       VOID_PARAMETER,
       VOID_VARIABLE];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
    * The severity of this error.
    */
   ErrorSeverity _severity;
 
   /**
-   * The message template used to create the message to be displayed for this error.
+   * The template used to create the message to be displayed for this error.
    */
   String _message;
 
   /**
+   * The template used to create the correction to be displayed for this error, or `null` if
+   * there is no correction information for this error.
+   */
+  String correction8;
+
+  /**
    * Initialize a newly created error code to have the given severity and message.
    *
    * @param severity the severity of the error
    * @param message the message template used to create the message to be displayed for the error
    */
-  ParserErrorCode.con1(this.name, this.ordinal, ErrorSeverity severity, String message) {
+  ParserErrorCode.con1(String name, int ordinal, ErrorSeverity severity, String message) : super(name, ordinal) {
     this._severity = severity;
     this._message = message;
   }
 
   /**
+   * Initialize a newly created error code to have the given severity, message and correction.
+   *
+   * @param severity the severity of the error
+   * @param message the template used to create the message to be displayed for the error
+   * @param correction the template used to create the correction to be displayed for the error
+   */
+  ParserErrorCode.con2(String name, int ordinal, ErrorSeverity severity, String message, String correction) : super(name, ordinal) {
+    this._severity = severity;
+    this._message = message;
+    this.correction8 = correction;
+  }
+
+  /**
    * Initialize a newly created error code to have the given message and a severity of ERROR.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  ParserErrorCode.con2(String name, int ordinal, String message) : this.con1(name, ordinal, ErrorSeverity.ERROR, message);
+  ParserErrorCode.con3(String name, int ordinal, String message) : this.con1(name, ordinal, ErrorSeverity.ERROR, message);
+  String get correction => correction8;
   ErrorSeverity get errorSeverity => _severity;
   String get message => _message;
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
-  int compareTo(ParserErrorCode other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 /**
  * Instances of the class {link ToFormattedSourceVisitor} write a source representation of a visited
@@ -6331,7 +6342,7 @@
   }
   Object visitFieldDeclaration(FieldDeclaration node) {
     visit(node.documentationComment);
-    visit8(node.keyword, " ");
+    visit8(node.staticKeyword, " ");
     visit(node.fields);
     _writer.print(";");
     return null;
@@ -6528,8 +6539,8 @@
     return null;
   }
   Object visitListLiteral(ListLiteral node) {
-    if (node.modifier != null) {
-      _writer.print(node.modifier.lexeme);
+    if (node.constKeyword != null) {
+      _writer.print(node.constKeyword.lexeme);
       _writer.print(' ');
     }
     visit6(node.typeArguments, " ");
@@ -6549,8 +6560,8 @@
     return null;
   }
   Object visitMapLiteral(MapLiteral node) {
-    if (node.modifier != null) {
-      _writer.print(node.modifier.lexeme);
+    if (node.constKeyword != null) {
+      _writer.print(node.constKeyword.lexeme);
       _writer.print(' ');
     }
     visit6(node.typeArguments, " ");
@@ -6770,7 +6781,7 @@
     _writer.print("try ");
     visit(node.body);
     visitList7(" ", node.catchClauses, " ");
-    visit7(" finally ", node.finallyClause);
+    visit7(" finally ", node.finallyBlock);
     return null;
   }
   Object visitTypeArgumentList(TypeArgumentList node) {
diff --git a/pkg/analyzer_experimental/lib/src/generated/resolver.dart b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
index 2b056f4..d11f9b2 100644
--- a/pkg/analyzer_experimental/lib/src/generated/resolver.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
@@ -108,12 +108,12 @@
     if (exceptionParameter != null) {
       LocalVariableElementImpl exception = new LocalVariableElementImpl(exceptionParameter);
       _currentHolder.addLocalVariable(exception);
-      exceptionParameter.element = exception;
+      exceptionParameter.staticElement = exception;
       SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
       if (stackTraceParameter != null) {
         LocalVariableElementImpl stackTrace = new LocalVariableElementImpl(stackTraceParameter);
         _currentHolder.addLocalVariable(stackTrace);
-        stackTraceParameter.element = stackTrace;
+        stackTraceParameter.staticElement = stackTrace;
       }
     }
     return super.visitCatchClause(node);
@@ -146,7 +146,7 @@
     }
     _functionTypesToFix = null;
     _currentHolder.addType(element);
-    className.element = element;
+    className.staticElement = element;
     holder.validate();
     return null;
   }
@@ -170,7 +170,7 @@
     }
     _functionTypesToFix = null;
     _currentHolder.addType(element);
-    className.element = element;
+    className.staticElement = element;
     holder.validate();
     return null;
   }
@@ -202,7 +202,7 @@
         element.nameOffset = returnType.offset;
       }
     } else {
-      constructorName.element = element;
+      constructorName.staticElement = element;
     }
     holder.validate();
     return null;
@@ -218,7 +218,7 @@
     element.const3 = matches(keyword, sc.Keyword.CONST);
     element.final2 = matches(keyword, sc.Keyword.FINAL);
     _currentHolder.addLocalVariable(element);
-    variableName.element = element;
+    variableName.staticElement = element;
     return super.visitDeclaredIdentifier(node);
   }
   Object visitDefaultFormalParameter(DefaultFormalParameter node) {
@@ -249,7 +249,7 @@
       parameter.setVisibleRange(body.offset, body.length);
     }
     _currentHolder.addParameter(parameter);
-    parameterName.element = parameter;
+    parameterName.staticElement = parameter;
     node.parameter.accept(this);
     holder.validate();
     return null;
@@ -272,7 +272,7 @@
       parameter.final2 = node.isFinal;
       parameter.parameterKind = node.kind;
       _currentHolder.addParameter(parameter);
-      parameterName.element = parameter;
+      parameterName.staticElement = parameter;
     }
     ElementHolder holder = new ElementHolder();
     visitChildren(holder, node);
@@ -309,7 +309,7 @@
         }
         _currentHolder.addFunction(element);
         expression.element = element;
-        functionName.element = element;
+        functionName.staticElement = element;
       } else {
         SimpleIdentifier propertyNameNode = node.name;
         if (propertyNameNode == null) {
@@ -333,7 +333,7 @@
           getter.static = true;
           field.getter = getter;
           _currentHolder.addAccessor(getter);
-          propertyNameNode.element = getter;
+          propertyNameNode.staticElement = getter;
         } else {
           PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.con1(propertyNameNode);
           setter.functions = holder.functions;
@@ -346,7 +346,7 @@
           field.setter = setter;
           field.final2 = false;
           _currentHolder.addAccessor(setter);
-          propertyNameNode.element = setter;
+          propertyNameNode.staticElement = setter;
         }
       }
       holder.validate();
@@ -398,7 +398,7 @@
     type.typeArguments = createTypeVariableTypes(typeVariables);
     element.type = type;
     _currentHolder.addTypeAlias(element);
-    aliasName.element = element;
+    aliasName.staticElement = element;
     holder.validate();
     return null;
   }
@@ -408,7 +408,7 @@
       ParameterElementImpl parameter = new ParameterElementImpl.con1(parameterName);
       parameter.parameterKind = node.kind;
       _currentHolder.addParameter(parameter);
-      parameterName.element = parameter;
+      parameterName.staticElement = parameter;
     }
     ElementHolder holder = new ElementHolder();
     visitChildren(holder, node);
@@ -422,7 +422,7 @@
       SimpleIdentifier labelName = label.label;
       LabelElementImpl element = new LabelElementImpl(labelName, onSwitchStatement, false);
       _currentHolder.addLabel(element);
-      labelName.element = element;
+      labelName.staticElement = element;
     }
     return super.visitLabeledStatement(node);
   }
@@ -451,7 +451,7 @@
       element.parameters = holder.parameters;
       element.static = isStatic;
       _currentHolder.addMethod(element);
-      methodName.element = element;
+      methodName.staticElement = element;
     } else {
       SimpleIdentifier propertyNameNode = node.name;
       String propertyName = propertyNameNode.name;
@@ -473,7 +473,7 @@
         getter.static = isStatic;
         field.getter = getter;
         _currentHolder.addAccessor(getter);
-        propertyNameNode.element = getter;
+        propertyNameNode.staticElement = getter;
       } else {
         PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.con1(propertyNameNode);
         setter.functions = holder.functions;
@@ -487,7 +487,7 @@
         field.setter = setter;
         field.final2 = false;
         _currentHolder.addAccessor(setter);
-        propertyNameNode.element = setter;
+        propertyNameNode.staticElement = setter;
       }
     }
     holder.validate();
@@ -501,7 +501,7 @@
       parameter.final2 = node.isFinal;
       parameter.parameterKind = node.kind;
       _currentHolder.addParameter(parameter);
-      parameterName.element = parameter;
+      parameterName.staticElement = parameter;
     }
     return super.visitSimpleFormalParameter(node);
   }
@@ -514,7 +514,7 @@
       SimpleIdentifier labelName = label.label;
       LabelElementImpl element = new LabelElementImpl(labelName, false, true);
       _currentHolder.addLabel(element);
-      labelName.element = element;
+      labelName.staticElement = element;
     }
     return super.visitSwitchCase(node);
   }
@@ -523,7 +523,7 @@
       SimpleIdentifier labelName = label.label;
       LabelElementImpl element = new LabelElementImpl(labelName, false, true);
       _currentHolder.addLabel(element);
-      labelName.element = element;
+      labelName.staticElement = element;
     }
     return super.visitSwitchDefault(node);
   }
@@ -533,7 +533,7 @@
     TypeVariableTypeImpl type = new TypeVariableTypeImpl(element);
     element.type = type;
     _currentHolder.addTypeVariable(element);
-    parameterName.element = element;
+    parameterName.staticElement = element;
     return super.visitTypeParameter(node);
   }
   Object visitVariableDeclaration(VariableDeclaration node) {
@@ -552,7 +552,7 @@
       }
       element = field;
       _currentHolder.addField(field);
-      fieldName.element = field;
+      fieldName.staticElement = field;
     } else if (_inFunction) {
       SimpleIdentifier variableName = node.name;
       LocalVariableElementImpl variable;
@@ -567,7 +567,7 @@
       int blockEnd = enclosingBlock.offset + enclosingBlock.length;
       variable.setVisibleRange(functionEnd, blockEnd - functionEnd - 1);
       _currentHolder.addLocalVariable(variable);
-      variableName.element = element;
+      variableName.staticElement = element;
     } else {
       SimpleIdentifier variableName = node.name;
       TopLevelVariableElementImpl variable;
@@ -578,7 +578,7 @@
       }
       element = variable;
       _currentHolder.addTopLevelVariable(variable);
-      variableName.element = element;
+      variableName.staticElement = element;
     }
     element.const3 = isConst;
     element.final2 = isFinal;
@@ -602,7 +602,7 @@
     if (element is PropertyInducingElementImpl) {
       PropertyInducingElementImpl variable = element as PropertyInducingElementImpl;
       if (_inFieldContext) {
-        ((variable as FieldElementImpl)).static = matches(((node.parent.parent as FieldDeclaration)).keyword, sc.Keyword.STATIC);
+        ((variable as FieldElementImpl)).static = matches(((node.parent.parent as FieldDeclaration)).staticKeyword, sc.Keyword.STATIC);
       }
       PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con2(variable);
       getter.getter = true;
@@ -1031,6 +1031,11 @@
   RecordingErrorListener _errorListener;
 
   /**
+   * The modification time of the source for which an element is being built.
+   */
+  int _modificationStamp = 0;
+
+  /**
    * The line information associated with the source for which an element is being built, or
    * `null` if we are not building an element.
    */
@@ -1073,16 +1078,19 @@
    * @return the HTML element that was built
    * @throws AnalysisException if the analysis could not be performed
    */
-  HtmlElementImpl buildHtmlElement(Source source) => buildHtmlElement2(source, _context.parseHtmlUnit(source));
+  HtmlElementImpl buildHtmlElement(Source source) => buildHtmlElement2(source, source.modificationStamp, _context.parseHtmlUnit(source));
 
   /**
    * Build the HTML element for the given source.
    *
    * @param source the source describing the compilation unit
+   * @param modificationStamp the modification time of the source for which an element is being
+   *          built
    * @param unit the AST structure representing the HTML
    * @throws AnalysisException if the analysis could not be performed
    */
-  HtmlElementImpl buildHtmlElement2(Source source2, ht.HtmlUnit unit) {
+  HtmlElementImpl buildHtmlElement2(Source source2, int modificationStamp2, ht.HtmlUnit unit) {
+    this._modificationStamp = modificationStamp2;
     _lineInfo = _context.computeLineInfo(source2);
     HtmlElementImpl result = new HtmlElementImpl(_context, source2.shortName);
     result.source = source2;
@@ -1162,7 +1170,7 @@
           unit.lineInfo = new LineInfo(lineStarts);
           try {
             LibraryResolver resolver = new LibraryResolver(_context);
-            LibraryElementImpl library = resolver.resolveEmbeddedLibrary(htmlSource, unit, true) as LibraryElementImpl;
+            LibraryElementImpl library = resolver.resolveEmbeddedLibrary(htmlSource, _modificationStamp, unit, true) as LibraryElementImpl;
             script.scriptLibrary = library;
             _resolvedLibraries.addAll(resolver.resolvedLibraries);
             _errorListener.addAll(resolver.errorListener);
@@ -1174,14 +1182,15 @@
           ExternalHtmlScriptElementImpl script = new ExternalHtmlScriptElementImpl(node);
           if (scriptSourcePath != null) {
             try {
+              scriptSourcePath = Uri.encodeFull(scriptSourcePath);
               parseUriWithException(scriptSourcePath);
               Source scriptSource = _context.sourceFactory.resolveUri(htmlSource, scriptSourcePath);
               script.scriptSource = scriptSource;
-              if (!scriptSource.exists()) {
-                reportError(HtmlWarningCode.URI_DOES_NOT_EXIST, scriptAttribute.offset + 1, scriptSourcePath.length, [scriptSourcePath]);
+              if (scriptSource == null || !scriptSource.exists()) {
+                reportValueError(HtmlWarningCode.URI_DOES_NOT_EXIST, scriptAttribute, [scriptSourcePath]);
               }
             } on URISyntaxException catch (exception) {
-              reportError(HtmlWarningCode.INVALID_URI, scriptAttribute.offset + 1, scriptSourcePath.length, [scriptSourcePath]);
+              reportValueError(HtmlWarningCode.INVALID_URI, scriptAttribute, [scriptSourcePath]);
             }
           }
           _scripts.add(script);
@@ -1246,6 +1255,21 @@
   void reportError(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_htmlElement.source, offset, length, errorCode, arguments));
   }
+
+  /**
+   * Report an error with the given error code at the location of the value of the given attribute.
+   * Use the given arguments to compose the error message.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param offset the offset of the first character to be highlighted
+   * @param length the number of characters to be highlighted
+   * @param arguments the arguments used to compose the error message
+   */
+  void reportValueError(ErrorCode errorCode, ht.XmlAttributeNode attribute, List<Object> arguments) {
+    int offset = attribute.value.offset + 1;
+    int length = attribute.value.length - 2;
+    reportError(errorCode, offset, length, arguments);
+  }
 }
 /**
  * Instances of the class `DeadCodeVerifier` traverse an AST structure looking for cases of
@@ -1350,7 +1374,7 @@
   }
   Object visitTryStatement(TryStatement node) {
     safelyVisit(node.body);
-    safelyVisit(node.finallyClause);
+    safelyVisit(node.finallyBlock);
     NodeList<CatchClause> catchClauses = node.catchClauses;
     int numOfCatchClauses = catchClauses.length;
     List<Type2> visitedTypes = new List<Type2>();
@@ -1594,7 +1618,7 @@
             if (importDirective.asToken != null) {
               SimpleIdentifier prefixIdentifier = importDirective.prefix;
               if (prefixIdentifier != null) {
-                Element element = prefixIdentifier.element;
+                Element element = prefixIdentifier.staticElement;
                 if (element is PrefixElement) {
                   PrefixElement prefixElementKey = element as PrefixElement;
                   _prefixElementMap[prefixElementKey] = importDirective;
@@ -1602,7 +1626,7 @@
               }
             }
             putIntoLibraryMap(libraryElement, importDirective);
-            addAdditionalLibrariesForExports(_libraryMap, libraryElement, importDirective, new List<LibraryElement>());
+            addAdditionalLibrariesForExports(libraryElement, importDirective, new List<LibraryElement>());
           }
         }
       }
@@ -1617,14 +1641,14 @@
   Object visitLibraryDirective(LibraryDirective node) => null;
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefixIdentifier = node.prefix;
-    Element element = prefixIdentifier.element;
+    Element element = prefixIdentifier.staticElement;
     if (element is PrefixElement) {
       _unusedImports.remove(_prefixElementMap[element]);
       return null;
     }
     return visitIdentifier(element, prefixIdentifier.name);
   }
-  Object visitSimpleIdentifier(SimpleIdentifier node) => visitIdentifier(node.element, node.name);
+  Object visitSimpleIdentifier(SimpleIdentifier node) => visitIdentifier(node.staticElement, node.name);
   void set inDefiningCompilationUnit(bool inDefiningCompilationUnit2) {
     this._inDefiningCompilationUnit = inDefiningCompilationUnit2;
   }
@@ -1632,14 +1656,14 @@
   /**
    * Recursively add any exported library elements into the [libraryMap].
    */
-  void addAdditionalLibrariesForExports(Map<LibraryElement, List<ImportDirective>> map, LibraryElement library, ImportDirective importDirective, List<LibraryElement> exportPath) {
+  void addAdditionalLibrariesForExports(LibraryElement library, ImportDirective importDirective, List<LibraryElement> exportPath) {
     if (exportPath.contains(library)) {
       return;
     }
+    exportPath.add(library);
     for (LibraryElement exportedLibraryElt in library.exportedLibraries) {
       putIntoLibraryMap(exportedLibraryElt, importDirective);
-      exportPath.add(exportedLibraryElt);
-      addAdditionalLibrariesForExports(map, exportedLibraryElt, importDirective, exportPath);
+      addAdditionalLibrariesForExports(exportedLibraryElt, importDirective, exportPath);
     }
   }
 
@@ -1688,6 +1712,9 @@
         visitIdentifier(elt, name);
       }
       return null;
+    } else if (element is PrefixElement) {
+      _unusedImports.remove(_prefixElementMap[element]);
+      return null;
     }
     LibraryElement containingLibrary = element.library;
     if (containingLibrary == null) {
@@ -1762,7 +1789,7 @@
         if (JavaString.startsWithBefore(fullName, "/lib", fullNameIndex - 4)) {
           String relativePubspecPath = path.substring(0, pathIndex + 3) + _PUBSPEC_YAML;
           Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePubspecPath);
-          if (pubspecSource.exists()) {
+          if (pubspecSource != null && pubspecSource.exists()) {
             _errorReporter.reportError2(PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE, uriLiteral, []);
           }
           return true;
@@ -1802,7 +1829,7 @@
     Source source = getSource(uriLiteral);
     String relativePubspecPath = path.substring(0, pathIndex) + _PUBSPEC_YAML;
     Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePubspecPath);
-    if (!pubspecSource.exists()) {
+    if (pubspecSource == null || !pubspecSource.exists()) {
       return false;
     }
     String fullName = getSourceFullName(source);
@@ -1953,7 +1980,7 @@
         _enclosingExecutable = _enclosingClass.unnamedConstructor;
       } else {
         _enclosingExecutable = _enclosingClass.getNamedConstructor(constructorName.name);
-        constructorName.element = _enclosingExecutable;
+        constructorName.staticElement = _enclosingExecutable;
       }
       node.element = _enclosingExecutable as ConstructorElement;
       return super.visitConstructorDeclaration(node);
@@ -2029,7 +2056,7 @@
         PropertyAccessorElement accessor = find3(_enclosingUnit.accessors, functionName);
         if (identical(((property as sc.KeywordToken)).keyword, sc.Keyword.SET)) {
           accessor = accessor.variable.setter;
-          functionName.element = accessor;
+          functionName.staticElement = accessor;
         }
         _enclosingExecutable = accessor;
       }
@@ -2108,12 +2135,12 @@
       }
       if (property == null) {
         _enclosingExecutable = find4(_enclosingClass.methods, nameOfMethod, methodName.offset);
-        methodName.element = _enclosingExecutable;
+        methodName.staticElement = _enclosingExecutable;
       } else {
         PropertyAccessorElement accessor = find3(_enclosingClass.accessors, methodName);
         if (identical(((property as sc.KeywordToken)).keyword, sc.Keyword.SET)) {
           accessor = accessor.variable.setter;
-          methodName.element = accessor;
+          methodName.staticElement = accessor;
         }
         _enclosingExecutable = accessor;
       }
@@ -2257,7 +2284,7 @@
    */
   Element find3(List<Element> elements, SimpleIdentifier identifier) {
     Element element = find4(elements, identifier.name, identifier.offset);
-    identifier.element = element;
+    identifier.staticElement = element;
     return element;
   }
 
@@ -2499,6 +2526,16 @@
   bool _strictMode = false;
 
   /**
+   * The type representing the type 'dynamic'.
+   */
+  Type2 _dynamicType;
+
+  /**
+   * The type representing the type 'type'.
+   */
+  Type2 _typeType;
+
+  /**
    * The name of the method that can be implemented by a class to allow its instances to be invoked
    * as if they were a function.
    */
@@ -2518,6 +2555,8 @@
   ElementResolver(ResolverVisitor resolver) {
     this._resolver = resolver;
     _strictMode = resolver.definingLibrary.context.analysisOptions.strictMode;
+    _dynamicType = resolver.typeProvider.dynamicType;
+    _typeType = resolver.typeProvider.typeType;
   }
   Object visitAssignmentExpression(AssignmentExpression node) {
     sc.Token operator = node.operator;
@@ -2534,7 +2573,7 @@
         MethodElement propagatedMethod = lookUpMethod(leftHandSide, propagatedType, methodName);
         node.propagatedElement = propagatedMethod;
         if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
-          _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_METHOD, operator, [methodName, staticType.displayName]);
+          _resolver.reportErrorProxyConditionalAnalysisError3(staticType.element, StaticTypeWarningCode.UNDEFINED_METHOD, operator, [methodName, staticType.displayName]);
         }
       }
     }
@@ -2553,7 +2592,7 @@
         MethodElement propagatedMethod = lookUpMethod(leftOperand, propagatedType, methodName);
         node.propagatedElement = propagatedMethod;
         if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
-          _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
+          _resolver.reportErrorProxyConditionalAnalysisError3(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
         }
       }
     }
@@ -2563,7 +2602,7 @@
     SimpleIdentifier labelNode = node.label;
     LabelElementImpl labelElement = lookupLabel(node, labelNode);
     if (labelElement != null && labelElement.isOnSwitchMember) {
-      _resolver.reportError(ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labelNode, []);
+      _resolver.reportError5(ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labelNode, []);
     }
     return null;
   }
@@ -2590,13 +2629,13 @@
       } else {
         if (element.library == null || element.library != _resolver.definingLibrary) {
         }
-        recordResolution(simpleIdentifier, element);
+        simpleIdentifier.staticElement = element;
         if (node.newKeyword != null) {
           if (element is ClassElement) {
             ConstructorElement constructor = ((element as ClassElement)).unnamedConstructor;
             if (constructor == null) {
             } else {
-              recordResolution(simpleIdentifier, constructor);
+              simpleIdentifier.staticElement = constructor;
             }
           } else {
           }
@@ -2610,9 +2649,9 @@
       if (element == null) {
       } else {
         if (element is PrefixElement) {
-          recordResolution(prefix, element);
+          prefix.staticElement = element;
           element = _resolver.nameScope.lookup(identifier, _resolver.definingLibrary);
-          recordResolution(name, element);
+          name.staticElement = element;
           return null;
         }
         LibraryElement library = element.library;
@@ -2620,7 +2659,7 @@
           AnalysisEngine.instance.logger.logError("Found element with null library: ${element.name}");
         } else if (library != _resolver.definingLibrary) {
         }
-        recordResolution(name, element);
+        name.staticElement = element;
         if (node.newKeyword == null) {
           if (element is ClassElement) {
             Element memberElement = lookupGetterOrMethod(((element as ClassElement)).type, name.name);
@@ -2632,7 +2671,7 @@
             }
             if (memberElement == null) {
             } else {
-              recordResolution(name, memberElement);
+              name.staticElement = memberElement;
             }
           } else {
           }
@@ -2641,7 +2680,7 @@
             ConstructorElement constructor = ((element as ClassElement)).getNamedConstructor(name.name);
             if (constructor == null) {
             } else {
-              recordResolution(name, constructor);
+              name.staticElement = constructor;
             }
           } else {
           }
@@ -2657,12 +2696,12 @@
       ConstructorElementImpl constructorElement = element as ConstructorElementImpl;
       ConstructorName redirectedNode = node.redirectedConstructor;
       if (redirectedNode != null) {
-        ConstructorElement redirectedElement = redirectedNode.element;
+        ConstructorElement redirectedElement = redirectedNode.staticElement;
         constructorElement.redirectedConstructor = redirectedElement;
       }
       for (ConstructorInitializer initializer in node.initializers) {
         if (initializer is RedirectingConstructorInvocation) {
-          ConstructorElement redirectedElement = ((initializer as RedirectingConstructorInvocation)).element;
+          ConstructorElement redirectedElement = ((initializer as RedirectingConstructorInvocation)).staticElement;
           constructorElement.redirectedConstructor = redirectedElement;
         }
       }
@@ -2674,11 +2713,11 @@
     SimpleIdentifier fieldName = node.fieldName;
     ClassElement enclosingClass = _resolver.enclosingClass;
     FieldElement fieldElement = ((enclosingClass as ClassElementImpl)).getField(fieldName.name);
-    recordResolution(fieldName, fieldElement);
+    fieldName.staticElement = fieldElement;
     if (fieldElement == null || fieldElement.isSynthetic) {
-      _resolver.reportError(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+      _resolver.reportError5(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
     } else if (fieldElement.isStatic) {
-      _resolver.reportError(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, node, [fieldName]);
+      _resolver.reportError5(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, node, [fieldName]);
     }
     return null;
   }
@@ -2705,17 +2744,15 @@
     } else {
       constructor = interfaceType.lookUpConstructor(name.name, definingLibrary);
       name.staticElement = constructor;
-      name.element = constructor;
     }
     node.staticElement = constructor;
-    node.element = constructor;
     return null;
   }
   Object visitContinueStatement(ContinueStatement node) {
     SimpleIdentifier labelNode = node.label;
     LabelElementImpl labelElement = lookupLabel(node, labelNode);
     if (labelElement != null && labelElement.isOnSwitchStatement) {
-      _resolver.reportError(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNode, []);
+      _resolver.reportError5(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNode, []);
     }
     return null;
   }
@@ -2737,7 +2774,7 @@
     if (classElement != null) {
       FieldElement fieldElement = ((classElement as ClassElementImpl)).getField(fieldName);
       if (fieldElement == null) {
-        _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+        _resolver.reportError5(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
       } else {
         ParameterElement parameterElement = node.element;
         if (parameterElement is FieldFormalParameterElementImpl) {
@@ -2749,17 +2786,17 @@
             fieldFormal.type = fieldType;
           }
           if (fieldElement.isSynthetic) {
-            _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+            _resolver.reportError5(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
           } else if (fieldElement.isStatic) {
-            _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [fieldName]);
+            _resolver.reportError5(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [fieldName]);
           } else if (declaredType != null && fieldType != null && !declaredType.isAssignableTo(fieldType)) {
-            _resolver.reportError(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType.displayName, fieldType.displayName]);
+            _resolver.reportError5(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType.displayName, fieldType.displayName]);
           }
         } else {
           if (fieldElement.isSynthetic) {
-            _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
+            _resolver.reportError5(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, node, [fieldName]);
           } else if (fieldElement.isStatic) {
-            _resolver.reportError(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [fieldName]);
+            _resolver.reportError5(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [fieldName]);
           }
         }
       }
@@ -2781,7 +2818,7 @@
       String prefixName = prefixNode.name;
       for (PrefixElement prefixElement in _resolver.definingLibrary.prefixes) {
         if (prefixElement.displayName == prefixName) {
-          recordResolution(prefixNode, prefixElement);
+          prefixNode.staticElement = prefixElement;
           break;
         }
       }
@@ -2801,23 +2838,39 @@
     Expression target = node.realTarget;
     Type2 staticType = getStaticType(target);
     Type2 propagatedType = getPropagatedType(target);
-    if (node.inGetterContext()) {
-      String methodName = sc.TokenType.INDEX.lexeme;
-      bool error = lookUpCheckIndexOperator(node, target, methodName, staticType, propagatedType);
-      if (error) {
-        return null;
-      }
-    }
-    if (node.inSetterContext()) {
-      String methodName = sc.TokenType.INDEX_EQ.lexeme;
-      lookUpCheckIndexOperator(node, target, methodName, staticType, propagatedType);
+    String getterMethodName = sc.TokenType.INDEX.lexeme;
+    String setterMethodName = sc.TokenType.INDEX_EQ.lexeme;
+    bool isInGetterContext = node.inGetterContext();
+    bool isInSetterContext = node.inSetterContext();
+    if (isInGetterContext && isInSetterContext) {
+      MethodElement setterStaticMethod = lookUpMethod(target, staticType, setterMethodName);
+      MethodElement setterPropagatedMethod = lookUpMethod(target, propagatedType, setterMethodName);
+      node.staticElement = setterStaticMethod;
+      node.propagatedElement = setterPropagatedMethod;
+      checkForUndefinedIndexOperator(node, target, getterMethodName, setterStaticMethod, setterPropagatedMethod, staticType, propagatedType);
+      MethodElement getterStaticMethod = lookUpMethod(target, staticType, getterMethodName);
+      MethodElement getterPropagatedMethod = lookUpMethod(target, propagatedType, getterMethodName);
+      AuxiliaryElements auxiliaryElements = new AuxiliaryElements(getterStaticMethod, getterPropagatedMethod);
+      node.auxiliaryElements = auxiliaryElements;
+      checkForUndefinedIndexOperator(node, target, getterMethodName, getterStaticMethod, getterPropagatedMethod, staticType, propagatedType);
+    } else if (isInGetterContext) {
+      MethodElement staticMethod = lookUpMethod(target, staticType, getterMethodName);
+      MethodElement propagatedMethod = lookUpMethod(target, propagatedType, getterMethodName);
+      node.staticElement = staticMethod;
+      node.propagatedElement = propagatedMethod;
+      checkForUndefinedIndexOperator(node, target, getterMethodName, staticMethod, propagatedMethod, staticType, propagatedType);
+    } else if (isInSetterContext) {
+      MethodElement staticMethod = lookUpMethod(target, staticType, setterMethodName);
+      MethodElement propagatedMethod = lookUpMethod(target, propagatedType, setterMethodName);
+      node.staticElement = staticMethod;
+      node.propagatedElement = propagatedMethod;
+      checkForUndefinedIndexOperator(node, target, setterMethodName, staticMethod, propagatedMethod, staticType, propagatedType);
     }
     return null;
   }
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    ConstructorElement invokedConstructor = node.constructorName.element;
+    ConstructorElement invokedConstructor = node.constructorName.staticElement;
     node.staticElement = invokedConstructor;
-    node.element = invokedConstructor;
     ArgumentList argumentList = node.argumentList;
     List<ParameterElement> parameters = resolveArgumentsToParameters(node.isConst, argumentList, invokedConstructor);
     if (parameters != null) {
@@ -2836,22 +2889,22 @@
   Object visitMethodInvocation(MethodInvocation node) {
     SimpleIdentifier methodName = node.methodName;
     Expression target = node.realTarget;
-    Element staticElement;
-    Element propagatedElement;
-    if (target is SuperExpression && !isSuperInValidContext((target as SuperExpression))) {
+    if (target is SuperExpression && !isSuperInValidContext(target as SuperExpression)) {
       return null;
     }
+    Element staticElement;
+    Element propagatedElement;
     if (target == null) {
       staticElement = resolveInvokedElement2(methodName);
       propagatedElement = null;
     } else {
-      Type2 targetType = getStaticType(target);
-      staticElement = resolveInvokedElement(target, targetType, methodName);
+      staticElement = resolveInvokedElement(target, getStaticType(target), methodName);
       propagatedElement = resolveInvokedElement(target, getPropagatedType(target), methodName);
     }
     staticElement = convertSetterToGetter(staticElement);
     propagatedElement = convertSetterToGetter(propagatedElement);
-    recordResolution2(methodName, staticElement, propagatedElement);
+    methodName.staticElement = staticElement;
+    methodName.propagatedElement = propagatedElement;
     ArgumentList argumentList = node.argumentList;
     if (staticElement != null) {
       List<ParameterElement> parameters = computeCorrespondingParameters(argumentList, staticElement);
@@ -2867,29 +2920,30 @@
     }
     ErrorCode errorCode = checkForInvocationError(target, staticElement);
     if (identical(errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION)) {
-      _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName, [methodName.name]);
-    } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) {
-      _resolver.reportError(StaticTypeWarningCode.UNDEFINED_FUNCTION, methodName, [methodName.name]);
+      _resolver.reportError5(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName, [methodName.name]);
+    } else if (identical(errorCode, CompileTimeErrorCode.UNDEFINED_FUNCTION)) {
+      _resolver.reportError5(CompileTimeErrorCode.UNDEFINED_FUNCTION, methodName, [methodName.name]);
     } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) {
       String targetTypeName;
       if (target == null) {
         ClassElement enclosingClass = _resolver.enclosingClass;
         targetTypeName = enclosingClass.displayName;
+        _resolver.reportErrorProxyConditionalAnalysisError(_resolver.enclosingClass, StaticTypeWarningCode.UNDEFINED_METHOD, methodName, [methodName.name, targetTypeName]);
       } else {
         Type2 targetType = getStaticType(target);
         if (targetType != null && targetType.isDartCoreFunction && methodName.name == CALL_METHOD_NAME) {
           return null;
         }
         targetTypeName = targetType == null ? null : targetType.displayName;
+        _resolver.reportErrorProxyConditionalAnalysisError(targetType.element, StaticTypeWarningCode.UNDEFINED_METHOD, methodName, [methodName.name, targetTypeName]);
       }
-      _resolver.reportError(StaticTypeWarningCode.UNDEFINED_METHOD, methodName, [methodName.name, targetTypeName]);
     } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_SUPER_METHOD)) {
       Type2 targetType = getPropagatedType(target);
       if (targetType == null) {
         targetType = getStaticType(target);
       }
       String targetTypeName = targetType == null ? null : targetType.name;
-      _resolver.reportError(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, methodName, [methodName.name, targetTypeName]);
+      _resolver.reportError5(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, methodName, [methodName.name, targetTypeName]);
     }
     return null;
   }
@@ -2911,18 +2965,25 @@
     MethodElement propagatedMethod = lookUpMethod(operand, propagatedType, methodName);
     node.propagatedElement = propagatedMethod;
     if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
-      _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, node.operator, [methodName, staticType.displayName]);
+      _resolver.reportErrorProxyConditionalAnalysisError3(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, node.operator, [methodName, staticType.displayName]);
     }
     return null;
   }
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefix = node.prefix;
     SimpleIdentifier identifier = node.identifier;
-    Element prefixElement = prefix.element;
+    Element prefixElement = prefix.staticElement;
     if (prefixElement is PrefixElement) {
       Element element = _resolver.nameScope.lookup(node, _resolver.definingLibrary);
+      if (element == null && identifier.inSetterContext()) {
+        element = _resolver.nameScope.lookup(new ElementResolver_SyntheticIdentifier("${node.name}="), _resolver.definingLibrary);
+      }
       if (element == null) {
-        _resolver.reportError(StaticWarningCode.UNDEFINED_GETTER, identifier, [identifier.name, prefixElement.name]);
+        if (identifier.inSetterContext()) {
+          _resolver.reportError5(StaticWarningCode.UNDEFINED_SETTER, identifier, [identifier.name, prefixElement.name]);
+        } else {
+          _resolver.reportError5(StaticWarningCode.UNDEFINED_GETTER, identifier, [identifier.name, prefixElement.name]);
+        }
         return null;
       }
       if (element is PropertyAccessorElement && identifier.inSetterContext()) {
@@ -2934,7 +2995,7 @@
           }
         }
       }
-      recordResolution(identifier, element);
+      identifier.staticElement = element;
       if (node.parent is Annotation) {
         Annotation annotation = node.parent as Annotation;
         resolveAnnotationElement(annotation, element, null);
@@ -2944,7 +3005,7 @@
     }
     if (node.parent is Annotation) {
       Annotation annotation = node.parent as Annotation;
-      resolveAnnotationElement(annotation, prefixElement, node.identifier);
+      resolveAnnotationElement(annotation, prefixElement, identifier);
     }
     resolvePropertyAccess(prefix, identifier);
     return null;
@@ -2962,14 +3023,14 @@
       MethodElement propagatedMethod = lookUpMethod(operand, propagatedType, methodName);
       node.propagatedElement = propagatedMethod;
       if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
-        _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
+        _resolver.reportErrorProxyConditionalAnalysisError3(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
       }
     }
     return null;
   }
   Object visitPropertyAccess(PropertyAccess node) {
     Expression target = node.realTarget;
-    if (target is SuperExpression && !isSuperInValidContext((target as SuperExpression))) {
+    if (target is SuperExpression && !isSuperInValidContext(target as SuperExpression)) {
       return null;
     }
     SimpleIdentifier propertyName = node.propertyName;
@@ -2992,7 +3053,7 @@
       return null;
     }
     if (name != null) {
-      recordResolution(name, element);
+      name.staticElement = element;
     }
     node.staticElement = element;
     node.element = element;
@@ -3004,20 +3065,34 @@
     return null;
   }
   Object visitSimpleIdentifier(SimpleIdentifier node) {
-    if (node.staticElement != null || node.element != null) {
+    if (node.staticElement != null) {
+      return null;
+    }
+    if (node.name == _dynamicType.name) {
+      node.staticElement = _dynamicType.element;
+      node.staticType = _typeType;
       return null;
     }
     Element element = resolveSimpleIdentifier(node);
-    if (isFactoryConstructorReturnType(node) && element != _resolver.enclosingClass) {
-      _resolver.reportError(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS, node, []);
+    ClassElement enclosingClass = _resolver.enclosingClass;
+    if (isFactoryConstructorReturnType(node) && element != enclosingClass) {
+      _resolver.reportError5(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS, node, []);
+    } else if (isConstructorReturnType(node) && element != enclosingClass) {
+      _resolver.reportError5(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
+      element = null;
     } else if (element == null || (element is PrefixElement && !isValidAsPrefix(node))) {
       if (isConstructorReturnType(node)) {
-        _resolver.reportError(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
+        _resolver.reportError5(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
       } else {
-        _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, node, [node.name]);
+        _resolver.reportErrorProxyConditionalAnalysisError(_resolver.enclosingClass, StaticWarningCode.UNDEFINED_IDENTIFIER, node, [node.name]);
       }
     }
-    recordResolution(node, element);
+    node.staticElement = element;
+    if (node.inSetterContext() && node.inGetterContext() && enclosingClass != null) {
+      InterfaceType enclosingType = enclosingClass.type;
+      AuxiliaryElements auxiliaryElements = new AuxiliaryElements(lookUpGetter(null, enclosingType, node.name), null);
+      node.auxiliaryElements = auxiliaryElements;
+    }
     if (node.parent is Annotation) {
       Annotation annotation = node.parent as Annotation;
       resolveAnnotationElement(annotation, element, null);
@@ -3042,18 +3117,18 @@
     }
     if (element == null) {
       if (name != null) {
-        _resolver.reportError(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, node, [superclass.name, name]);
+        _resolver.reportError5(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, node, [superclass.name, name]);
       } else {
-        _resolver.reportError(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node, [superclass.name]);
+        _resolver.reportError5(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node, [superclass.name]);
       }
       return null;
     } else {
       if (element.isFactory) {
-        _resolver.reportError(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node, [element]);
+        _resolver.reportError5(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node, [element]);
       }
     }
     if (name != null) {
-      recordResolution(name, element);
+      name.staticElement = element;
     }
     node.staticElement = element;
     node.element = element;
@@ -3066,14 +3141,14 @@
   }
   Object visitSuperExpression(SuperExpression node) {
     if (!isSuperInValidContext(node)) {
-      _resolver.reportError(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, node, []);
+      _resolver.reportError5(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, node, []);
     }
     return super.visitSuperExpression(node);
   }
   Object visitTypeParameter(TypeParameter node) {
     TypeName bound = node.bound;
     if (bound != null) {
-      TypeVariableElementImpl variable = node.name.element as TypeVariableElementImpl;
+      TypeVariableElementImpl variable = node.name.staticElement as TypeVariableElementImpl;
       if (variable != null) {
         variable.bound = bound.type;
       }
@@ -3111,6 +3186,9 @@
    * @return the error code that should be reported
    */
   ErrorCode checkForInvocationError(Expression target, Element element) {
+    if (element is PrefixElement) {
+      element = null;
+    }
     if (element is PropertyAccessorElement) {
       FunctionType getterType = ((element as PropertyAccessorElement)).type;
       if (getterType != null) {
@@ -3142,7 +3220,7 @@
         if (target == null) {
           ClassElement enclosingClass = _resolver.enclosingClass;
           if (enclosingClass == null) {
-            return StaticTypeWarningCode.UNDEFINED_FUNCTION;
+            return CompileTimeErrorCode.UNDEFINED_FUNCTION;
           } else if (element == null) {
             return StaticTypeWarningCode.UNDEFINED_METHOD;
           } else {
@@ -3151,7 +3229,7 @@
         } else {
           Type2 targetType = getStaticType(target);
           if (targetType == null) {
-            return StaticTypeWarningCode.UNDEFINED_FUNCTION;
+            return CompileTimeErrorCode.UNDEFINED_FUNCTION;
           } else if (!targetType.isDynamic) {
             return StaticTypeWarningCode.UNDEFINED_METHOD;
           }
@@ -3162,6 +3240,32 @@
   }
 
   /**
+   * Check that the for some index expression that the method element was resolved, otherwise a
+   * [StaticWarningCode#UNDEFINED_OPERATOR] is generated.
+   *
+   * @param node the index expression to resolve
+   * @param target the target of the expression
+   * @param methodName the name of the operator associated with the context of using of the given
+   *          index expression
+   * @return `true` if and only if an error code is generated on the passed node
+   */
+  bool checkForUndefinedIndexOperator(IndexExpression node, Expression target, String methodName, MethodElement staticMethod, MethodElement propagatedMethod, Type2 staticType, Type2 propagatedType) {
+    if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
+      sc.Token leftBracket = node.leftBracket;
+      sc.Token rightBracket = node.rightBracket;
+      if (leftBracket == null || rightBracket == null) {
+        _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, node, [methodName, staticType.displayName]);
+      } else {
+        int offset = leftBracket.offset;
+        int length = rightBracket.offset - offset + 1;
+        _resolver.reportErrorProxyConditionalAnalysisError2(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, offset, length, [methodName, staticType.displayName]);
+      }
+      return true;
+    }
+    return false;
+  }
+
+  /**
    * Given a list of arguments and the element that will be invoked using those argument, compute
    * the list of parameters that correspond to the list of arguments. Return the parameters that
    * correspond to the arguments, or `null` if no correspondence could be computed.
@@ -3183,12 +3287,12 @@
         } else if (getterReturnType is FunctionType) {
           Element functionElement = ((getterReturnType as FunctionType)).element;
           if (functionElement is ExecutableElement) {
-            return resolveArgumentsToParameters(false, argumentList, (functionElement as ExecutableElement));
+            return resolveArgumentsToParameters(false, argumentList, functionElement as ExecutableElement);
           }
         }
       }
     } else if (element2 is ExecutableElement) {
-      return resolveArgumentsToParameters(false, argumentList, (element2 as ExecutableElement));
+      return resolveArgumentsToParameters(false, argumentList, element2 as ExecutableElement);
     } else if (element2 is VariableElement) {
       VariableElement variable = element2 as VariableElement;
       Type2 type = variable.type;
@@ -3389,37 +3493,6 @@
   }
 
   /**
-   * Looks up the method element with the given name for index expression, reports
-   * [StaticWarningCode#UNDEFINED_OPERATOR] if not found.
-   *
-   * @param node the index expression to resolve
-   * @param target the target of the expression
-   * @param methodName the name of the operator associated with the context of using of the given
-   *          index expression
-   * @return `true` if and only if an error code is generated on the passed node
-   */
-  bool lookUpCheckIndexOperator(IndexExpression node, Expression target, String methodName, Type2 staticType, Type2 propagatedType) {
-    MethodElement staticMethod = lookUpMethod(target, staticType, methodName);
-    MethodElement propagatedMethod = lookUpMethod(target, propagatedType, methodName);
-    node.staticElement = staticMethod;
-    node.propagatedElement = propagatedMethod;
-    if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
-      sc.Token leftBracket = node.leftBracket;
-      sc.Token rightBracket = node.rightBracket;
-      if (leftBracket == null || rightBracket == null) {
-        _resolver.reportError(StaticTypeWarningCode.UNDEFINED_OPERATOR, node, [methodName, staticType.displayName]);
-        return true;
-      } else {
-        int offset = leftBracket.offset;
-        int length = rightBracket.offset - offset + 1;
-        _resolver.reportError5(StaticTypeWarningCode.UNDEFINED_OPERATOR, offset, length, [methodName, staticType.displayName]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
    * Look up the getter with the given name in the given type. Return the element representing the
    * getter that was found, or `null` if there is no getter with the given name.
    *
@@ -3582,20 +3655,20 @@
       }
     } else {
       if (labelScope == null) {
-        _resolver.reportError(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
+        _resolver.reportError5(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
       } else {
         labelElement = labelScope.lookup(labelNode) as LabelElementImpl;
         if (labelElement == null) {
-          _resolver.reportError(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
+          _resolver.reportError5(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
         } else {
-          recordResolution(labelNode, labelElement);
+          labelNode.staticElement = labelElement;
         }
       }
     }
     if (labelElement != null) {
       ExecutableElement labelContainer = labelElement.getAncestor(ExecutableElement);
       if (labelContainer != _resolver.enclosingFunction) {
-        _resolver.reportError(CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE, labelNode, [labelNode.name]);
+        _resolver.reportError5(CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE, labelNode, [labelNode.name]);
         labelElement = null;
       }
     }
@@ -3778,32 +3851,6 @@
     AnalysisEngine.instance.logger.logError("Failed to map ${operator.lexeme} to it's corresponding operator");
     return operator;
   }
-
-  /**
-   * Record the fact that the given AST node was resolved to the given element.
-   *
-   * @param node the AST node that was resolved
-   * @param element the element to which the AST node was resolved
-   */
-  void recordResolution(SimpleIdentifier node, Element element2) {
-    node.staticElement = element2;
-    node.element = element2;
-  }
-
-  /**
-   * Record the fact that the given AST node was resolved to the given elements.
-   *
-   * @param node the AST node that was resolved
-   * @param staticElement the element to which the AST node was resolved using static type
-   *          information
-   * @param propagatedElement the element to which the AST node was resolved using propagated type
-   *          information
-   * @return the element that was associated with the node
-   */
-  void recordResolution2(SimpleIdentifier node, Element staticElement2, Element propagatedElement) {
-    node.staticElement = staticElement2;
-    node.element = propagatedElement == null ? staticElement2 : propagatedElement;
-  }
   void resolveAnnotationConstructorInvocationArguments(Annotation annotation, ConstructorElement constructor) {
     ArgumentList argumentList = annotation.arguments;
     if (argumentList == null) {
@@ -3828,12 +3875,12 @@
     if (element2 is PropertyAccessorElement) {
       PropertyAccessorElement accessorElement = element2 as PropertyAccessorElement;
       if (!accessorElement.isSynthetic) {
-        _resolver.reportError(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+        _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
         return;
       }
       VariableElement variableElement = accessorElement.variable;
       if (!variableElement.isConst) {
-        _resolver.reportError(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+        _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
       }
       return;
     }
@@ -3844,23 +3891,23 @@
       String name = nameNode != null ? nameNode.name : null;
       ConstructorElement constructor;
       {
-        InterfaceType interfaceType = new InterfaceTypeImpl.con1((element2 as ClassElement));
+        InterfaceType interfaceType = new InterfaceTypeImpl.con1(element2 as ClassElement);
         LibraryElement definingLibrary = _resolver.definingLibrary;
         constructor = interfaceType.lookUpConstructor(name, definingLibrary);
       }
       if (constructor == null) {
-        _resolver.reportError(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+        _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
         return;
       }
       annotation.element = constructor;
       if (nameNode != null) {
-        recordResolution(nameNode, constructor);
+        nameNode.staticElement = constructor;
       }
       resolveAnnotationConstructorInvocationArguments(annotation, constructor);
       return;
     }
     if (element2 != null) {
-      _resolver.reportError(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+      _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
     }
   }
 
@@ -3894,7 +3941,7 @@
    * @param parameters the of the function that will be invoked with the arguments
    * @return the parameters that correspond to the arguments
    */
-  List<ParameterElement> resolveArgumentsToParameters2(bool reportError2, ArgumentList argumentList, List<ParameterElement> parameters) {
+  List<ParameterElement> resolveArgumentsToParameters2(bool reportError, ArgumentList argumentList, List<ParameterElement> parameters) {
     List<ParameterElement> requiredParameters = new List<ParameterElement>();
     List<ParameterElement> positionalParameters = new List<ParameterElement>();
     Map<String, ParameterElement> namedParameters = new Map<String, ParameterElement>();
@@ -3924,14 +3971,14 @@
         String name = nameNode.name;
         ParameterElement element = namedParameters[name];
         if (element == null) {
-          ErrorCode errorCode = (reportError2 ? CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER : StaticWarningCode.UNDEFINED_NAMED_PARAMETER) as ErrorCode;
-          _resolver.reportError(errorCode, nameNode, [name]);
+          ErrorCode errorCode = (reportError ? CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER : StaticWarningCode.UNDEFINED_NAMED_PARAMETER) as ErrorCode;
+          _resolver.reportError5(errorCode, nameNode, [name]);
         } else {
           resolvedParameters[i] = element;
-          recordResolution(nameNode, element);
+          nameNode.staticElement = element;
         }
         if (!javaSetAdd(usedNames, name)) {
-          _resolver.reportError(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, nameNode, [name]);
+          _resolver.reportError5(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, nameNode, [name]);
         }
       } else {
         positionalArgumentCount++;
@@ -3941,11 +3988,11 @@
       }
     }
     if (positionalArgumentCount < requiredParameters.length) {
-      ErrorCode errorCode = (reportError2 ? CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS : StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS) as ErrorCode;
-      _resolver.reportError(errorCode, argumentList, [requiredParameters.length, positionalArgumentCount]);
+      ErrorCode errorCode = (reportError ? CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS : StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS) as ErrorCode;
+      _resolver.reportError5(errorCode, argumentList, [requiredParameters.length, positionalArgumentCount]);
     } else if (positionalArgumentCount > unnamedParameterCount) {
-      ErrorCode errorCode = (reportError2 ? CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS : StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS) as ErrorCode;
-      _resolver.reportError(errorCode, argumentList, [unnamedParameterCount, positionalArgumentCount]);
+      ErrorCode errorCode = (reportError ? CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS : StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS) as ErrorCode;
+      _resolver.reportError5(errorCode, argumentList, [unnamedParameterCount, positionalArgumentCount]);
     }
     return resolvedParameters;
   }
@@ -3971,7 +4018,7 @@
       for (SimpleIdentifier name in names) {
         Element element = namespace.get(name.name);
         if (element != null) {
-          name.element = element;
+          name.staticElement = element;
         }
       }
     }
@@ -3997,7 +4044,7 @@
       }
       return element;
     } else if (target is SimpleIdentifier) {
-      Element targetElement = ((target as SimpleIdentifier)).element;
+      Element targetElement = ((target as SimpleIdentifier)).staticElement;
       if (targetElement is PrefixElement) {
         String name = "${((target as SimpleIdentifier)).name}.${methodName}";
         Identifier functionName = new ElementResolver_SyntheticIdentifier(name);
@@ -4061,31 +4108,31 @@
     ExecutableElement staticElement = resolveProperty(target, staticType, propertyName);
     if (target.parent.parent is Annotation) {
       if (staticElement != null) {
-        recordResolution(propertyName, staticElement);
+        propertyName.staticElement = staticElement;
       }
       return;
     }
     propertyName.staticElement = staticElement;
     Type2 propagatedType = getPropagatedType(target);
     ExecutableElement propagatedElement = resolveProperty(target, propagatedType, propertyName);
-    Element selectedElement = select(staticElement, propagatedElement);
-    propertyName.element = selectedElement;
+    propertyName.propagatedElement = propagatedElement;
     if (shouldReportMissingMember(staticType, staticElement) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedElement))) {
+      Element selectedElement = select(staticElement, propagatedElement);
       bool isStaticProperty = isStatic(selectedElement);
       if (propertyName.inSetterContext()) {
         if (isStaticProperty) {
-          _resolver.reportError(StaticWarningCode.UNDEFINED_SETTER, propertyName, [propertyName.name, staticType.displayName]);
+          _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, StaticWarningCode.UNDEFINED_SETTER, propertyName, [propertyName.name, staticType.displayName]);
         } else {
-          _resolver.reportError(StaticTypeWarningCode.UNDEFINED_SETTER, propertyName, [propertyName.name, staticType.displayName]);
+          _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, StaticTypeWarningCode.UNDEFINED_SETTER, propertyName, [propertyName.name, staticType.displayName]);
         }
       } else if (propertyName.inGetterContext()) {
         if (isStaticProperty) {
-          _resolver.reportError(StaticWarningCode.UNDEFINED_GETTER, propertyName, [propertyName.name, staticType.displayName]);
+          _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, StaticWarningCode.UNDEFINED_GETTER, propertyName, [propertyName.name, staticType.displayName]);
         } else {
-          _resolver.reportError(StaticTypeWarningCode.UNDEFINED_GETTER, propertyName, [propertyName.name, staticType.displayName]);
+          _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, StaticTypeWarningCode.UNDEFINED_GETTER, propertyName, [propertyName.name, staticType.displayName]);
         }
       } else {
-        _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, propertyName, [propertyName.name]);
+        _resolver.reportErrorProxyConditionalAnalysisError(staticType.element, StaticWarningCode.UNDEFINED_IDENTIFIER, propertyName, [propertyName.name]);
       }
     }
   }
@@ -4162,15 +4209,6 @@
   ExecutableElement select(ExecutableElement staticElement, ExecutableElement propagatedElement) => propagatedElement != null ? propagatedElement : staticElement;
 
   /**
-   * Return the propagated method if it is not `null`, or the static method if it is.
-   *
-   * @param staticMethod the method computed using static type information
-   * @param propagatedMethod the method computed using propagated type information
-   * @return the more specific of the two methods
-   */
-  MethodElement select2(MethodElement staticMethod, MethodElement propagatedMethod) => propagatedMethod != null ? propagatedMethod : staticMethod;
-
-  /**
    * Given a node that can have annotations associated with it and the element to which that node
    * has been resolved, create the annotations in the element model representing the annotations on
    * the node.
@@ -4238,11 +4276,12 @@
   }
   accept(ASTVisitor visitor) => null;
   sc.Token get beginToken => null;
-  Element get element => null;
+  Element get bestElement => null;
   sc.Token get endToken => null;
   String get name => _name;
+  Element get propagatedElement => null;
   Element get staticElement => null;
-  void visitChildren(ASTVisitor<Object> visitor) {
+  void visitChildren(ASTVisitor visitor) {
   }
 }
 /**
@@ -4448,14 +4487,11 @@
         _classLookup[superclassElt] = resultMap;
         return resultMap;
       }
-      recordMapWithClassMembers(resultMap, superclassElt);
+      recordMapWithClassMembers(resultMap, supertype);
     }
     List<InterfaceType> mixins = classElt.mixins;
     for (int i = mixins.length - 1; i >= 0; i--) {
-      ClassElement mixinElement = mixins[i].element;
-      if (mixinElement != null) {
-        recordMapWithClassMembers(resultMap, mixinElement);
-      }
+      recordMapWithClassMembers(resultMap, mixins[i]);
     }
     _classLookup[classElt] = resultMap;
     return resultMap;
@@ -4530,16 +4566,26 @@
     ClassElement superclassElement = supertype != null ? supertype.element : null;
     List<InterfaceType> mixins = classElt.mixins;
     List<InterfaceType> interfaces = classElt.interfaces;
-    if ((superclassElement == null || supertype.isObject) && mixins.length == 0 && interfaces.length == 0) {
-      _interfaceLookup[classElt] = resultMap;
-      return resultMap;
-    }
     List<Map<String, ExecutableElement>> lookupMaps = new List<Map<String, ExecutableElement>>();
     if (superclassElement != null) {
       if (!visitedInterfaces.contains(superclassElement)) {
         try {
           javaSetAdd(visitedInterfaces, superclassElement);
-          lookupMaps.add(computeInterfaceLookupMap(superclassElement, visitedInterfaces));
+          Map<String, ExecutableElement> map = computeInterfaceLookupMap(superclassElement, visitedInterfaces);
+          map = new Map<String, ExecutableElement>.from(map);
+          List<MethodElement> methods = supertype.methods;
+          for (MethodElement method in methods) {
+            if (method.isAccessibleIn(_library) && !method.isStatic) {
+              map[method.name] = method;
+            }
+          }
+          List<PropertyAccessorElement> accessors = supertype.accessors;
+          for (PropertyAccessorElement accessor in accessors) {
+            if (accessor.isAccessibleIn(_library) && !accessor.isStatic) {
+              map[accessor.name] = accessor;
+            }
+          }
+          lookupMaps.add(map);
         } finally {
           visitedInterfaces.remove(superclassElement);
         }
@@ -4554,12 +4600,8 @@
       }
     }
     for (InterfaceType mixinType in mixins) {
-      ClassElement mixinElement = mixinType.element;
-      if (mixinElement == null) {
-        continue;
-      }
       Map<String, ExecutableElement> mapWithMixinMembers = new Map<String, ExecutableElement>();
-      recordMapWithClassMembers(mapWithMixinMembers, mixinElement);
+      recordMapWithClassMembers(mapWithMixinMembers, mixinType);
       lookupMaps.add(mapWithMixinMembers);
     }
     for (InterfaceType interfaceType in interfaces) {
@@ -4568,7 +4610,21 @@
         if (!visitedInterfaces.contains(interfaceElement)) {
           try {
             javaSetAdd(visitedInterfaces, interfaceElement);
-            lookupMaps.add(computeInterfaceLookupMap(interfaceElement, visitedInterfaces));
+            Map<String, ExecutableElement> map = computeInterfaceLookupMap(interfaceElement, visitedInterfaces);
+            map = new Map<String, ExecutableElement>.from(map);
+            List<MethodElement> methods = interfaceType.methods;
+            for (MethodElement method in methods) {
+              if (method.isAccessibleIn(_library) && !method.isStatic) {
+                map[method.name] = method;
+              }
+            }
+            List<PropertyAccessorElement> accessors = interfaceType.accessors;
+            for (PropertyAccessorElement accessor in accessors) {
+              if (accessor.isAccessibleIn(_library) && !accessor.isStatic) {
+                map[accessor.name] = accessor;
+              }
+            }
+            lookupMaps.add(map);
           } finally {
             visitedInterfaces.remove(interfaceElement);
           }
@@ -4591,72 +4647,12 @@
     for (Map<String, ExecutableElement> lookupMap in lookupMaps) {
       for (MapEntry<String, ExecutableElement> entry in getMapEntrySet(lookupMap)) {
         String key = entry.getKey();
-        if (!unionMap.containsKey(key)) {
-          Set<ExecutableElement> set = new Set<ExecutableElement>();
-          javaSetAdd(set, entry.getValue());
+        Set<ExecutableElement> set = unionMap[key];
+        if (set == null) {
+          set = new Set<ExecutableElement>();
           unionMap[key] = set;
-        } else {
-          javaSetAdd(unionMap[key], entry.getValue());
         }
-      }
-    }
-    if (superclassElement != null) {
-      List<MethodElement> methods = superclassElement.methods;
-      for (MethodElement method in methods) {
-        if (method.isAccessibleIn(_library) && !method.isStatic) {
-          String key = method.name;
-          if (!unionMap.containsKey(key)) {
-            Set<ExecutableElement> set = new Set<ExecutableElement>();
-            javaSetAdd(set, method);
-            unionMap[key] = set;
-          } else {
-            javaSetAdd(unionMap[key], method);
-          }
-        }
-      }
-      List<PropertyAccessorElement> accessors = superclassElement.accessors;
-      for (PropertyAccessorElement accessor in accessors) {
-        if (accessor.isAccessibleIn(_library) && !accessor.isStatic) {
-          String key = accessor.name;
-          if (!unionMap.containsKey(key)) {
-            Set<ExecutableElement> set = new Set<ExecutableElement>();
-            javaSetAdd(set, accessor);
-            unionMap[key] = set;
-          } else {
-            javaSetAdd(unionMap[key], accessor);
-          }
-        }
-      }
-    }
-    for (InterfaceType interfaceType in interfaces) {
-      ClassElement interfaceElement = interfaceType.element;
-      if (interfaceElement != null) {
-        List<MethodElement> methods = interfaceElement.methods;
-        for (MethodElement method in methods) {
-          if (method.isAccessibleIn(_library) && !method.isStatic) {
-            String key = method.name;
-            if (!unionMap.containsKey(key)) {
-              Set<ExecutableElement> set = new Set<ExecutableElement>();
-              javaSetAdd(set, method);
-              unionMap[key] = set;
-            } else {
-              javaSetAdd(unionMap[key], method);
-            }
-          }
-        }
-        List<PropertyAccessorElement> accessors = interfaceElement.accessors;
-        for (PropertyAccessorElement accessor in accessors) {
-          if (accessor.isAccessibleIn(_library) && !accessor.isStatic) {
-            String key = accessor.name;
-            if (!unionMap.containsKey(key)) {
-              Set<ExecutableElement> set = new Set<ExecutableElement>();
-              javaSetAdd(set, accessor);
-              unionMap[key] = set;
-            } else {
-              javaSetAdd(unionMap[key], accessor);
-            }
-          }
-        }
+        javaSetAdd(set, entry.getValue());
       }
     }
     for (MapEntry<String, Set<ExecutableElement>> entry in getMapEntrySet(unionMap)) {
@@ -4750,21 +4746,21 @@
   }
 
   /**
-   * Record the passed map with the set of all members (methods, getters and setters) in the class
+   * Record the passed map with the set of all members (methods, getters and setters) in the type
    * into the passed map.
    *
    * @param map some non-`null` map to put the methods and accessors from the passed
    *          [ClassElement] into
-   * @param classElt the class element that will be recorded into the passed map
+   * @param type the type that will be recorded into the passed map
    */
-  void recordMapWithClassMembers(Map<String, ExecutableElement> map, ClassElement classElt) {
-    List<MethodElement> methods = classElt.methods;
+  void recordMapWithClassMembers(Map<String, ExecutableElement> map, InterfaceType type) {
+    List<MethodElement> methods = type.methods;
     for (MethodElement method in methods) {
       if (method.isAccessibleIn(_library) && !method.isStatic) {
         map[method.name] = method;
       }
     }
-    List<PropertyAccessorElement> accessors = classElt.accessors;
+    List<PropertyAccessorElement> accessors = type.accessors;
     for (PropertyAccessorElement accessor in accessors) {
       if (accessor.isAccessibleIn(_library) && !accessor.isStatic) {
         map[accessor.name] = accessor;
@@ -4850,7 +4846,7 @@
    * A table mapping the sources for the compilation units in this library to their corresponding
    * AST structures.
    */
-  Map<Source, CompilationUnit> _astMap = new Map<Source, CompilationUnit>();
+  Map<Source, ResolvableCompilationUnit> _astMap = new Map<Source, ResolvableCompilationUnit>();
 
   /**
    * The library scope used when resolving elements within this library's compilation units.
@@ -4884,12 +4880,12 @@
    * @throws AnalysisException if an AST structure could not be created for the compilation unit
    */
   CompilationUnit getAST(Source source) {
-    CompilationUnit unit = _astMap[source];
-    if (unit == null) {
-      unit = _analysisContext.computeResolvableCompilationUnit(source);
-      _astMap[source] = unit;
+    ResolvableCompilationUnit holder = _astMap[source];
+    if (holder == null) {
+      holder = _analysisContext.computeResolvableCompilationUnit(source);
+      _astMap[source] = holder;
     }
-    return unit;
+    return holder.compilationUnit;
   }
 
   /**
@@ -5013,6 +5009,22 @@
   Source get librarySource => _librarySource;
 
   /**
+   * Return the modification stamp associated with the given source.
+   *
+   * @param source the source representing the compilation unit whose AST is to be returned
+   * @return the AST structure associated with the given source
+   * @throws AnalysisException if an AST structure could not be created for the compilation unit
+   */
+  int getModificationStamp(Source source) {
+    ResolvableCompilationUnit holder = _astMap[source];
+    if (holder == null) {
+      holder = _analysisContext.computeResolvableCompilationUnit(source);
+      _astMap[source] = holder;
+    }
+    return holder.modificationStamp;
+  }
+
+  /**
    * Return the result of resolving the URI of the given URI-based directive against the URI of the
    * library, or `null` if the URI is not valid. If the URI is not valid, report the error.
    *
@@ -5030,7 +5042,7 @@
     uriContent = Uri.encodeFull(uriContent);
     try {
       parseUriWithException(uriContent);
-      Source source = getSource2(uriContent);
+      Source source = _analysisContext.sourceFactory.resolveUri(_librarySource, uriContent);
       if (source == null || !source.exists()) {
         _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent]));
       }
@@ -5050,10 +5062,12 @@
    * Set the AST structure associated with the defining compilation unit for this library to the
    * given AST structure.
    *
+   * @param modificationStamp the modification time of the source from which the compilation unit
+   *          was created
    * @param unit the AST structure associated with the defining compilation unit for this library
    */
-  void set definingCompilationUnit(CompilationUnit unit) {
-    _astMap[_librarySource] = unit;
+  void setDefiningCompilationUnit(int modificationStamp, CompilationUnit unit) {
+    _astMap[_librarySource] = new ResolvableCompilationUnit(modificationStamp, unit);
   }
 
   /**
@@ -5095,20 +5109,6 @@
     }
   }
   String toString() => _librarySource.shortName;
-
-  /**
-   * Return the result of resolving the given URI against the URI of the library, or `null` if
-   * the URI is not valid.
-   *
-   * @param uri the URI to be resolved
-   * @return the result of resolving the given URI against the URI of the library
-   */
-  Source getSource2(String uri) {
-    if (uri == null) {
-      return null;
-    }
-    return _analysisContext.sourceFactory.resolveUri(_librarySource, uri);
-  }
 }
 /**
  * Instances of the class `LibraryElementBuilder` build an element model for a single library.
@@ -5388,17 +5388,19 @@
    *
    * @param librarySource the source specifying the defining compilation unit of the library to be
    *          resolved
+   * @param modificationStamp the time stamp of the source from which the compilation unit was
+   *          created
    * @param unit the compilation unit representing the embedded library
    * @param fullAnalysis `true` if a full analysis should be performed
    * @return the element representing the resolved library
    * @throws AnalysisException if the library could not be resolved for some reason
    */
-  LibraryElement resolveEmbeddedLibrary(Source librarySource, CompilationUnit unit, bool fullAnalysis) {
+  LibraryElement resolveEmbeddedLibrary(Source librarySource, int modificationStamp, CompilationUnit unit, bool fullAnalysis) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engine.LibraryResolver.resolveEmbeddedLibrary");
     try {
       instrumentation.metric("fullAnalysis", fullAnalysis);
       instrumentation.data3("fullName", librarySource.fullName);
-      Library targetLibrary = createLibrary2(librarySource, unit);
+      Library targetLibrary = createLibrary2(librarySource, modificationStamp, unit);
       _coreLibrary = _libraryMap[_coreLibrarySource];
       if (_coreLibrary == null) {
         _coreLibrary = createLibrary(_coreLibrarySource);
@@ -5732,12 +5734,12 @@
     Set<Source> importedSources = new Set<Source>();
     for (Directive directive in unit.directives) {
       if (directive is ExportDirective) {
-        Source exportSource = resolveSource(librarySource, (directive as ExportDirective));
+        Source exportSource = resolveSource(librarySource, directive as ExportDirective);
         if (exportSource != null) {
           javaSetAdd(exportedSources, exportSource);
         }
       } else if (directive is ImportDirective) {
-        Source importSource = resolveSource(librarySource, (directive as ImportDirective));
+        Source importSource = resolveSource(librarySource, directive as ImportDirective);
         if (importSource != null) {
           javaSetAdd(importedSources, importSource);
         }
@@ -5820,12 +5822,15 @@
    * with the given source.
    *
    * @param librarySource the source of the library's defining compilation unit
+   * @param modificationStamp the modification time of the source from which the compilation unit
+   *          was created
+   * @param unit the compilation unit that defines the library
    * @return the library object that was created
    * @throws AnalysisException if the library source is not valid
    */
-  Library createLibrary2(Source librarySource, CompilationUnit unit) {
+  Library createLibrary2(Source librarySource, int modificationStamp, CompilationUnit unit) {
     Library library = new Library(_analysisContext, _errorListener, librarySource);
-    library.definingCompilationUnit = unit;
+    library.setDefiningCompilationUnit(modificationStamp, unit);
     _libraryMap[librarySource] = library;
     return library;
   }
@@ -5843,11 +5848,6 @@
       return null;
     }
     Library library = new Library(_analysisContext, _errorListener, librarySource);
-    try {
-      library.definingCompilationUnit;
-    } on AnalysisException catch (exception) {
-      return null;
-    }
     _libraryMap[librarySource] = library;
     return library;
   }
@@ -5926,6 +5926,11 @@
     for (Source source in library.compilationUnitSources) {
       ResolverVisitor visitor = new ResolverVisitor.con1(library, source, _typeProvider);
       library.getAST(source).accept(visitor);
+      for (ProxyConditionalAnalysisError conditionalCode in visitor.proxyConditionalAnalysisErrors) {
+        if (conditionalCode.shouldIncludeErrorCode()) {
+          visitor.reportError(conditionalCode.analysisError);
+        }
+      }
     }
   }
 
@@ -5943,16 +5948,11 @@
       return null;
     }
     String uriContent = uriLiteral.stringValue.trim();
-    if (uriContent == null) {
+    if (uriContent == null || uriContent.isEmpty) {
       return null;
     }
     uriContent = Uri.encodeFull(uriContent);
-    try {
-      parseUriWithException(uriContent);
-      return _analysisContext.sourceFactory.resolveUri(librarySource, uriContent);
-    } on URISyntaxException catch (exception) {
-      return null;
-    }
+    return _analysisContext.sourceFactory.resolveUri(librarySource, uriContent);
   }
 
   /**
@@ -5992,6 +5992,87 @@
   }
 }
 /**
+ * This class is a wrapper for an [AnalysisError] which can also be queried after resolution
+ * to find out if the error should actually be reported. In this case, these errors are conditional
+ * on the non-existence of an `@proxy` annotation.
+ *
+ * If we have other conditional error codes in the future, we should have this class implement some
+ * ConditionalErrorCode so that after resolution, a list of ConditionalErrorCode can be visited
+ * instead of multiple lists of *ConditionalErrorCodes.
+ */
+class ProxyConditionalAnalysisError {
+
+  /**
+   * The name of the proxy annotation, from the meta pub package.
+   */
+  static String _PROXY_ANNOTATION_NAME = "proxy";
+
+  /**
+   * The name of the meta library name, from the meta pub package.
+   */
+  static String _META_LIBRARY_NAME = "meta";
+
+  /**
+   * Return `true` if the given element represents a class that has the proxy annotation.
+   *
+   * @param element the class being tested
+   * @return `true` if the given element represents a class that has the proxy annotation
+   */
+  static bool classHasProxyAnnotation(Element element2) {
+    if (element2 is ClassElement) {
+      ClassElement classElement = element2 as ClassElement;
+      List<ElementAnnotation> annotations = classElement.metadata;
+      for (ElementAnnotation annotation in annotations) {
+        Element elementAnnotation = annotation.element;
+        if (elementAnnotation != null) {
+          LibraryElement lib = elementAnnotation.library;
+          if (elementAnnotation.name == _PROXY_ANNOTATION_NAME && lib != null && lib.name == _META_LIBRARY_NAME) {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
+   * The enclosing [ClassElement], this is what will determine if the error code should, or
+   * should not, be generated on the source.
+   */
+  Element _enclosingElement;
+
+  /**
+   * The conditional analysis error.
+   */
+  AnalysisError _analysisError;
+
+  /**
+   * Instantiate a new ProxyConditionalErrorCode with some enclosing element and the conditional
+   * analysis error.
+   *
+   * @param enclosingElement the enclosing element
+   * @param analysisError the conditional analysis error
+   */
+  ProxyConditionalAnalysisError(Element enclosingElement, AnalysisError analysisError) {
+    this._enclosingElement = enclosingElement;
+    this._analysisError = analysisError;
+  }
+
+  /**
+   * Return the analysis error.
+   *
+   * @return the analysis error
+   */
+  AnalysisError get analysisError => _analysisError;
+
+  /**
+   * Return `true` iff the enclosing class has the proxy annotation.
+   *
+   * @return `true` iff the enclosing class has the proxy annotation
+   */
+  bool shouldIncludeErrorCode() => !classHasProxyAnnotation(_enclosingElement);
+}
+/**
  * Instances of the class `ResolverVisitor` are used to resolve the nodes within a single
  * compilation unit.
  *
@@ -6032,6 +6113,11 @@
   TypeOverrideManager _overrideManager = new TypeOverrideManager();
 
   /**
+   * Proxy conditional error codes.
+   */
+  List<ProxyConditionalAnalysisError> _proxyConditionalAnalysisErrors = new List<ProxyConditionalAnalysisError>();
+
+  /**
    * Initialize a newly created visitor to resolve the nodes in a compilation unit.
    *
    * @param library the library containing the compilation unit being resolved
@@ -6066,12 +6152,10 @@
    * @return the object keeping track of which elements have had their types overridden
    */
   TypeOverrideManager get overrideManager => _overrideManager;
+  List<ProxyConditionalAnalysisError> get proxyConditionalAnalysisErrors => _proxyConditionalAnalysisErrors;
   Object visitAsExpression(AsExpression node) {
     super.visitAsExpression(node);
-    VariableElement element = getOverridableElement(node.expression);
-    if (element != null) {
-      override(element, node.type.type);
-    }
+    override(node.expression, node.type.type);
     return null;
   }
   Object visitAssertStatement(AssertStatement node) {
@@ -6272,7 +6356,7 @@
     ExecutableElement outerFunction = _enclosingFunction;
     try {
       SimpleIdentifier functionName = node.name;
-      _enclosingFunction = functionName.element as ExecutableElement;
+      _enclosingFunction = functionName.staticElement as ExecutableElement;
       super.visitFunctionDeclaration(node);
     } finally {
       _enclosingFunction = outerFunction;
@@ -6460,20 +6544,20 @@
   ExecutableElement get enclosingFunction => _enclosingFunction;
 
   /**
-   * Return the element associated with the given expression whose type can be overridden, or
-   * `null` if there is no element whose type can be overridden.
+   * Return the propagated element associated with the given expression whose type can be
+   * overridden, or `null` if there is no element whose type can be overridden.
    *
    * @param expression the expression with which the element is associated
    * @return the element associated with the given expression
    */
-  VariableElement getOverridableElement(Expression expression) {
+  VariableElement getOverridablePropagatedElement(Expression expression) {
     Element element = null;
     if (expression is SimpleIdentifier) {
-      element = ((expression as SimpleIdentifier)).element;
+      element = ((expression as SimpleIdentifier)).propagatedElement;
     } else if (expression is PrefixedIdentifier) {
-      element = ((expression as PrefixedIdentifier)).element;
+      element = ((expression as PrefixedIdentifier)).propagatedElement;
     } else if (expression is PropertyAccess) {
-      element = ((expression as PropertyAccess)).propertyName.element;
+      element = ((expression as PropertyAccess)).propertyName.propagatedElement;
     }
     if (element is VariableElement) {
       return element as VariableElement;
@@ -6482,6 +6566,48 @@
   }
 
   /**
+   * Return the static element associated with the given expression whose type can be overridden, or
+   * `null` if there is no element whose type can be overridden.
+   *
+   * @param expression the expression with which the element is associated
+   * @return the element associated with the given expression
+   */
+  VariableElement getOverridableStaticElement(Expression expression) {
+    Element element = null;
+    if (expression is SimpleIdentifier) {
+      element = ((expression as SimpleIdentifier)).staticElement;
+    } else if (expression is PrefixedIdentifier) {
+      element = ((expression as PrefixedIdentifier)).staticElement;
+    } else if (expression is PropertyAccess) {
+      element = ((expression as PropertyAccess)).propertyName.staticElement;
+    }
+    if (element is VariableElement) {
+      return element as VariableElement;
+    }
+    return null;
+  }
+
+  /**
+   * If it is appropriate to do so, override the current type of the static and propagated elements
+   * associated with the given expression with the given type. Generally speaking, it is appropriate
+   * if the given type is more specific than the current type.
+   *
+   * @param expression the expression used to access the static and propagated elements whose types
+   *          might be overridden
+   * @param potentialType the potential type of the elements
+   */
+  void override(Expression expression, Type2 potentialType) {
+    VariableElement element = getOverridableStaticElement(expression);
+    if (element != null) {
+      override2(element, potentialType);
+    }
+    element = getOverridablePropagatedElement(expression);
+    if (element != null) {
+      override2(element, potentialType);
+    }
+  }
+
+  /**
    * If it is appropriate to do so, override the current type of the given element with the given
    * type. Generally speaking, it is appropriate if the given type is more specific than the current
    * type.
@@ -6489,7 +6615,7 @@
    * @param element the element whose type might be overridden
    * @param potentialType the potential type of the element
    */
-  void override(VariableElement element, Type2 potentialType) {
+  void override2(VariableElement element, Type2 potentialType) {
     if (potentialType == null || identical(potentialType, BottomTypeImpl.instance)) {
       return;
     }
@@ -6504,6 +6630,43 @@
       _overrideManager.setType(element, potentialType);
     }
   }
+
+  /**
+   * Report a conditional analysis error with the given error code and arguments.
+   *
+   * @param enclosingElement the enclosing element
+   * @param errorCode the error code of the error to be reported
+   * @param node the node specifying the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportErrorProxyConditionalAnalysisError(Element enclosingElement, ErrorCode errorCode, ASTNode node, List<Object> arguments) {
+    _proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclosingElement, new AnalysisError.con2(source, node.offset, node.length, errorCode, arguments)));
+  }
+
+  /**
+   * Report a conditional analysis error with the given error code and arguments.
+   *
+   * @param enclosingElement the enclosing element
+   * @param errorCode the error code of the error to be reported
+   * @param offset the offset of the location of the error
+   * @param length the length of the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportErrorProxyConditionalAnalysisError2(Element enclosingElement, ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+    _proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclosingElement, new AnalysisError.con2(source, offset, length, errorCode, arguments)));
+  }
+
+  /**
+   * Report a conditional analysis error with the given error code and arguments.
+   *
+   * @param enclosingElement the enclosing element
+   * @param errorCode the error code of the error to be reported
+   * @param token the token specifying the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportErrorProxyConditionalAnalysisError3(Element enclosingElement, ErrorCode errorCode, sc.Token token, List<Object> arguments) {
+    _proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclosingElement, new AnalysisError.con2(source, token.offset, token.length, errorCode, arguments)));
+  }
   void visitForEachStatementInScope(ForEachStatement node) {
     Expression iterator = node.iterator;
     safelyVisit(iterator);
@@ -6517,7 +6680,7 @@
           LocalVariableElement loopElement = loopVariable.element;
           if (loopElement != null) {
             Type2 iteratorElementType = getIteratorElementType(iterator);
-            override(loopElement, iteratorElementType);
+            override2(loopElement, iteratorElementType);
             recordPropagatedType(loopVariable.identifier, iteratorElementType);
           }
         }
@@ -6686,10 +6849,7 @@
     } else if (condition is IsExpression) {
       IsExpression is2 = condition as IsExpression;
       if (is2.notOperator != null) {
-        VariableElement element = getOverridableElement(is2.expression);
-        if (element != null) {
-          override(element, is2.type.type);
-        }
+        override(is2.expression, is2.type.type);
       }
     } else if (condition is PrefixExpression) {
       PrefixExpression prefix = condition as PrefixExpression;
@@ -6726,10 +6886,7 @@
     } else if (condition is IsExpression) {
       IsExpression is2 = condition as IsExpression;
       if (is2.notOperator == null) {
-        VariableElement element = getOverridableElement(is2.expression);
-        if (element != null) {
-          override(element, is2.type.type);
-        }
+        override(is2.expression, is2.type.type);
       }
     } else if (condition is PrefixExpression) {
       PrefixExpression prefix = condition as PrefixExpression;
@@ -6849,10 +7006,21 @@
    * @return the object used to access the types from the core library
    */
   TypeProvider get typeProvider => _typeProvider;
+
+  /**
+   * Report an error with the given analysis error.
+   *
+   * @param errorCode analysis error
+   */
+  void reportError(AnalysisError analysisError) {
+    _errorListener.onError(analysisError);
+  }
   Object visitBlock(Block node) {
     Scope outerScope = _nameScope;
     try {
-      _nameScope = new EnclosedScope(_nameScope);
+      EnclosedScope enclosedScope = new EnclosedScope(_nameScope);
+      hideNamesDefinedInBlock(enclosedScope, node);
+      _nameScope = enclosedScope;
       super.visitBlock(node);
     } finally {
       _nameScope = outerScope;
@@ -6865,15 +7033,17 @@
       Scope outerScope = _nameScope;
       try {
         _nameScope = new EnclosedScope(_nameScope);
-        _nameScope.define(exception.element);
+        _nameScope.define(exception.staticElement);
         SimpleIdentifier stackTrace = node.stackTraceParameter;
         if (stackTrace != null) {
-          _nameScope.define(stackTrace.element);
+          _nameScope.define(stackTrace.staticElement);
         }
         super.visitCatchClause(node);
       } finally {
         _nameScope = outerScope;
       }
+    } else {
+      super.visitCatchClause(node);
     }
     return null;
   }
@@ -7047,7 +7217,7 @@
       for (SwitchMember member in node.members) {
         for (Label label in member.labels) {
           SimpleIdentifier labelName = label.label;
-          LabelElement labelElement = labelName.element as LabelElement;
+          LabelElement labelElement = labelName.staticElement as LabelElement;
           _labelScope = new LabelScope.con2(_labelScope, labelName.name, labelElement);
         }
       }
@@ -7094,13 +7264,20 @@
   Scope get nameScope => _nameScope;
 
   /**
+   * Return the source.
+   *
+   * @return the source
+   */
+  Source get source => _source;
+
+  /**
    * Report an error with the given error code and arguments.
    *
    * @param errorCode the error code of the error to be reported
    * @param node the node specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError(ErrorCode errorCode, ASTNode node, List<Object> arguments) {
+  void reportError5(ErrorCode errorCode, ASTNode node, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_source, node.offset, node.length, errorCode, arguments));
   }
 
@@ -7112,7 +7289,7 @@
    * @param length the length of the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError5(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+  void reportError6(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_source, offset, length, errorCode, arguments));
   }
 
@@ -7123,7 +7300,7 @@
    * @param token the token specifying the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
-  void reportError6(ErrorCode errorCode, sc.Token token, List<Object> arguments) {
+  void reportError7(ErrorCode errorCode, sc.Token token, List<Object> arguments) {
     _errorListener.onError(new AnalysisError.con2(_source, token.offset, token.length, errorCode, arguments));
   }
 
@@ -7174,7 +7351,7 @@
    */
   void visitStatementInScope(Statement node) {
     if (node is Block) {
-      visitBlock((node as Block));
+      visitBlock(node as Block);
     } else if (node != null) {
       Scope outerNameScope = _nameScope;
       try {
@@ -7197,11 +7374,33 @@
     for (Label label in labels) {
       SimpleIdentifier labelNameNode = label.label;
       String labelName = labelNameNode.name;
-      LabelElement labelElement = labelNameNode.element as LabelElement;
+      LabelElement labelElement = labelNameNode.staticElement as LabelElement;
       _labelScope = new LabelScope.con2(_labelScope, labelName, labelElement);
     }
     return outerScope;
   }
+
+  /**
+   * Marks the local declarations of the given [Block] hidden in the enclosing scope.
+   * According to the scoping rules name is hidden if block defines it, but name is defined after
+   * its declaration statement.
+   */
+  void hideNamesDefinedInBlock(EnclosedScope scope, Block block) {
+    for (Statement statement in block.statements) {
+      if (statement is VariableDeclarationStatement) {
+        VariableDeclarationStatement vds = statement as VariableDeclarationStatement;
+        for (VariableDeclaration variableDeclaration in vds.variables.variables) {
+          Element element = variableDeclaration.element;
+          scope.hide(element);
+        }
+      }
+      if (statement is FunctionDeclarationStatement) {
+        FunctionDeclarationStatement fds = statement as FunctionDeclarationStatement;
+        Element element = fds.functionDeclaration.element;
+        scope.hide(element);
+      }
+    }
+  }
 }
 /**
  * Instances of the class `StaticTypeAnalyzer` perform two type-related tasks. First, they
@@ -7427,10 +7626,7 @@
         }
         overrideType = propagatedType;
       }
-      VariableElement element = _resolver.getOverridableElement(node.leftHandSide);
-      if (element != null) {
-        _resolver.override(element, overrideType);
-      }
+      _resolver.override(node.leftHandSide, overrideType);
     } else {
       ExecutableElement staticMethodElement = node.staticElement;
       Type2 staticType = computeStaticReturnType(staticMethodElement);
@@ -7894,9 +8090,6 @@
   Object visitMethodInvocation(MethodInvocation node) {
     SimpleIdentifier methodNameNode = node.methodName;
     Element staticMethodElement = methodNameNode.staticElement;
-    if (staticMethodElement == null) {
-      staticMethodElement = methodNameNode.element;
-    }
     Type2 staticStaticType = computeStaticReturnType(staticMethodElement);
     recordStaticType(node, staticStaticType);
     Type2 staticPropagatedType = computePropagatedReturnType(staticMethodElement);
@@ -7947,7 +8140,7 @@
     } else if (methodName == "query") {
       Expression target = node.realTarget;
       if (target == null) {
-        Element methodElement = methodNameNode.element;
+        Element methodElement = methodNameNode.bestElement;
         if (methodElement != null) {
           LibraryElement library = methodElement.library;
           if (isHtmlLibrary(library)) {
@@ -7987,7 +8180,7 @@
         recordPropagatedType2(node, returnType);
       }
     } else {
-      Element propagatedElement = methodNameNode.element;
+      Element propagatedElement = methodNameNode.propagatedElement;
       if (propagatedElement != staticMethodElement) {
         Type2 propagatedStaticType = computeStaticReturnType(propagatedElement);
         if (propagatedStaticType != null && (staticStaticType == null || propagatedStaticType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedStaticType.isMoreSpecificThan(staticPropagatedType))) {
@@ -8069,7 +8262,7 @@
    */
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefixedIdentifier = node.identifier;
-    Element element = prefixedIdentifier.element;
+    Element element = prefixedIdentifier.staticElement;
     Type2 staticType = _dynamicType;
     if (element is ClassElement) {
       if (isNotTypeLiteral(node)) {
@@ -8082,7 +8275,7 @@
     } else if (element is MethodElement) {
       staticType = ((element as MethodElement)).type;
     } else if (element is PropertyAccessorElement) {
-      staticType = getType((element as PropertyAccessorElement), node.prefix.staticType);
+      staticType = getType(element as PropertyAccessorElement, node.prefix.staticType);
     } else if (element is ExecutableElement) {
       staticType = ((element as ExecutableElement)).type;
     } else if (element is TypeVariableElement) {
@@ -8175,12 +8368,12 @@
    */
   Object visitPropertyAccess(PropertyAccess node) {
     SimpleIdentifier propertyName = node.propertyName;
-    Element element = propertyName.element;
+    Element element = propertyName.staticElement;
     Type2 staticType = _dynamicType;
     if (element is MethodElement) {
       staticType = ((element as MethodElement)).type;
     } else if (element is PropertyAccessorElement) {
-      staticType = getType((element as PropertyAccessorElement), node.target != null ? getStaticType(node.target) : null);
+      staticType = getType(element as PropertyAccessorElement, node.target != null ? getStaticType(node.target) : null);
     } else {
     }
     recordStaticType(propertyName, staticType);
@@ -8244,7 +8437,7 @@
    * </blockquote>
    */
   Object visitSimpleIdentifier(SimpleIdentifier node) {
-    Element element = node.element;
+    Element element = node.staticElement;
     Type2 staticType = _dynamicType;
     if (element is ClassElement) {
       if (isNotTypeLiteral(node)) {
@@ -8257,7 +8450,7 @@
     } else if (element is MethodElement) {
       staticType = ((element as MethodElement)).type;
     } else if (element is PropertyAccessorElement) {
-      staticType = getType((element as PropertyAccessorElement), null);
+      staticType = getType(element as PropertyAccessorElement, null);
     } else if (element is ExecutableElement) {
       staticType = ((element as ExecutableElement)).type;
     } else if (element is TypeVariableElement) {
@@ -8334,9 +8527,9 @@
       Type2 rightType = initializer.bestType;
       SimpleIdentifier name = node.name;
       recordPropagatedType2(name, rightType);
-      VariableElement element = name.element as VariableElement;
+      VariableElement element = name.staticElement as VariableElement;
       if (element != null) {
-        _resolver.override(element, rightType);
+        _resolver.override2(element, rightType);
       }
     }
     return null;
@@ -8606,7 +8799,7 @@
     }
     Type2 returnType = functionType.returnType;
     if (returnType is TypeVariableType && context is InterfaceType) {
-      InterfaceType interfaceTypeContext = (context as InterfaceType);
+      InterfaceType interfaceTypeContext = context as InterfaceType;
       List<TypeVariableElement> parameterElements = interfaceTypeContext.element != null ? interfaceTypeContext.element.typeVariables : null;
       if (parameterElements != null) {
         for (int i = 0; i < parameterElements.length; i++) {
@@ -8966,6 +9159,13 @@
 abstract class TypeProvider {
 
   /**
+   * Return the type representing the built-in type 'Null'.
+   *
+   * @return the type representing the built-in type 'null'
+   */
+  InterfaceType get nullType;
+
+  /**
    * Return the type representing the built-in type 'bool'.
    *
    * @return the type representing the built-in type 'bool'
@@ -9112,6 +9312,11 @@
   InterfaceType _mapType;
 
   /**
+   * The type representing the type 'Null'.
+   */
+  InterfaceType _nullType;
+
+  /**
    * The type representing the built-in type 'num'.
    */
   InterfaceType _numType;
@@ -9157,6 +9362,7 @@
   InterfaceType get intType => _intType;
   InterfaceType get listType => _listType;
   InterfaceType get mapType => _mapType;
+  InterfaceType get nullType => _nullType;
   InterfaceType get numType => _numType;
   InterfaceType get objectType => _objectType;
   InterfaceType get stackTraceType => _stackTraceType;
@@ -9196,6 +9402,7 @@
     _intType = getType(namespace, "int");
     _listType = getType(namespace, "List");
     _mapType = getType(namespace, "Map");
+    _nullType = getType(namespace, "Null");
     _numType = getType(namespace, "num");
     _objectType = getType(namespace, "Object");
     _stackTraceType = getType(namespace, "StackTrace");
@@ -9260,7 +9467,7 @@
         exceptionType = getType3(exceptionTypeName);
       }
       recordType(exception, exceptionType);
-      Element element = exception.element;
+      Element element = exception.staticElement;
       if (element is VariableElementImpl) {
         ((element as VariableElementImpl)).type = exceptionType;
       } else {
@@ -9341,7 +9548,7 @@
   }
   Object visitFieldFormalParameter(FieldFormalParameter node) {
     super.visitFieldFormalParameter(node);
-    Element element = node.identifier.element;
+    Element element = node.identifier.staticElement;
     if (element is ParameterElementImpl) {
       ParameterElementImpl parameter = element as ParameterElementImpl;
       FormalParameterList parameterList = node.parameters;
@@ -9381,9 +9588,9 @@
   }
   Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     super.visitFunctionTypedFormalParameter(node);
-    Element element = node.identifier.element;
+    Element element = node.identifier.staticElement;
     if (element is ParameterElementImpl) {
-      setFunctionTypedParameterType((element as ParameterElementImpl), node.returnType, node.parameters);
+      setFunctionTypedParameterType(element as ParameterElementImpl, node.returnType, node.parameters);
     } else {
     }
     return null;
@@ -9421,7 +9628,7 @@
     } else {
       declaredType = getType3(typeName);
     }
-    Element element = node.identifier.element;
+    Element element = node.identifier.staticElement;
     if (element is ParameterElement) {
       ((element as ParameterElementImpl)).type = declaredType;
     } else {
@@ -9463,9 +9670,9 @@
           element = nameScope.lookup(prefix, definingLibrary);
           if (element is PrefixElement) {
             if (parent.parent is InstanceCreationExpression && ((parent.parent as InstanceCreationExpression)).isConst) {
-              reportError(CompileTimeErrorCode.CONST_WITH_NON_TYPE, prefixedIdentifier.identifier, [prefixedIdentifier.identifier.name]);
+              reportError5(CompileTimeErrorCode.CONST_WITH_NON_TYPE, prefixedIdentifier.identifier, [prefixedIdentifier.identifier.name]);
             } else {
-              reportError(StaticWarningCode.NEW_WITH_NON_TYPE, prefixedIdentifier.identifier, [prefixedIdentifier.identifier.name]);
+              reportError5(StaticWarningCode.NEW_WITH_NON_TYPE, prefixedIdentifier.identifier, [prefixedIdentifier.identifier.name]);
             }
             setElement(prefix, element);
             return null;
@@ -9484,14 +9691,14 @@
       InstanceCreationExpression creation = node.parent.parent as InstanceCreationExpression;
       if (creation.isConst) {
         if (element == null) {
-          reportError(CompileTimeErrorCode.UNDEFINED_CLASS, typeNameSimple, [typeName]);
+          reportError5(CompileTimeErrorCode.UNDEFINED_CLASS, typeNameSimple, [typeName]);
         } else {
-          reportError(CompileTimeErrorCode.CONST_WITH_NON_TYPE, typeNameSimple, [typeName]);
+          reportError5(CompileTimeErrorCode.CONST_WITH_NON_TYPE, typeNameSimple, [typeName]);
         }
         elementValid = false;
       } else {
         if (element != null) {
-          reportError(StaticWarningCode.NEW_WITH_NON_TYPE, typeNameSimple, [typeName]);
+          reportError5(StaticWarningCode.NEW_WITH_NON_TYPE, typeNameSimple, [typeName]);
           elementValid = false;
         }
       }
@@ -9499,19 +9706,19 @@
     if (elementValid && element == null) {
       SimpleIdentifier typeNameSimple = getTypeSimpleIdentifier(typeName);
       if (typeNameSimple.name == "boolean") {
-        reportError(StaticWarningCode.UNDEFINED_CLASS_BOOLEAN, typeNameSimple, []);
+        reportError5(StaticWarningCode.UNDEFINED_CLASS_BOOLEAN, typeNameSimple, []);
       } else if (isTypeNameInCatchClause(node)) {
-        reportError(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeName.name]);
+        reportError5(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeName.name]);
       } else if (isTypeNameInAsExpression(node)) {
-        reportError(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
+        reportError5(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
       } else if (isTypeNameInIsExpression(node)) {
-        reportError(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
+        reportError5(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
       } else if (isTypeNameTargetInRedirectedConstructor(node)) {
-        reportError(StaticWarningCode.REDIRECT_TO_NON_CLASS, typeName, [typeName.name]);
+        reportError5(StaticWarningCode.REDIRECT_TO_NON_CLASS, typeName, [typeName.name]);
       } else if (isTypeNameInTypeArgumentList(node)) {
-        reportError(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [typeName.name]);
+        reportError5(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [typeName.name]);
       } else {
-        reportError(StaticWarningCode.UNDEFINED_CLASS, typeName, [typeName.name]);
+        reportError5(StaticWarningCode.UNDEFINED_CLASS, typeName, [typeName.name]);
       }
       elementValid = false;
     }
@@ -9545,15 +9752,15 @@
       }
     } else {
       if (isTypeNameInCatchClause(node)) {
-        reportError(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeName.name]);
+        reportError5(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeName.name]);
       } else if (isTypeNameInAsExpression(node)) {
-        reportError(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
+        reportError5(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
       } else if (isTypeNameInIsExpression(node)) {
-        reportError(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
+        reportError5(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
       } else if (isTypeNameTargetInRedirectedConstructor(node)) {
-        reportError(StaticWarningCode.REDIRECT_TO_NON_CLASS, typeName, [typeName.name]);
+        reportError5(StaticWarningCode.REDIRECT_TO_NON_CLASS, typeName, [typeName.name]);
       } else if (isTypeNameInTypeArgumentList(node)) {
-        reportError(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [typeName.name]);
+        reportError5(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [typeName.name]);
       } else {
         ASTNode parent = typeName.parent;
         while (parent is TypeName) {
@@ -9561,7 +9768,7 @@
         }
         if (parent is ExtendsClause || parent is ImplementsClause || parent is WithClause || parent is ClassTypeAlias) {
         } else {
-          reportError(StaticWarningCode.NOT_A_TYPE, typeName, [typeName.name]);
+          reportError5(StaticWarningCode.NOT_A_TYPE, typeName, [typeName.name]);
         }
       }
       setElement(typeName, _dynamicType.element);
@@ -9583,7 +9790,7 @@
         }
       }
       if (argumentCount != parameterCount) {
-        reportError(getInvalidTypeParametersErrorCode(node), node, [typeName.name, parameterCount, argumentCount]);
+        reportError5(getInvalidTypeParametersErrorCode(node), node, [typeName.name, parameterCount, argumentCount]);
       }
       argumentCount = typeArguments.length;
       if (argumentCount < parameterCount) {
@@ -9624,7 +9831,7 @@
     } else {
       declaredType = getType3(typeName);
     }
-    Element element = node.name.element;
+    Element element = node.name.staticElement;
     if (element is VariableElement) {
       ((element as VariableElementImpl)).type = declaredType;
       if (element is PropertyInducingElement) {
@@ -9681,7 +9888,7 @@
     if (identifier == null) {
       return null;
     }
-    Element element = identifier.element;
+    Element element = identifier.staticElement;
     if (element is! ClassElementImpl) {
       return null;
     }
@@ -9698,7 +9905,7 @@
   List<ParameterElement> getElements(FormalParameterList parameterList) {
     List<ParameterElement> elements = new List<ParameterElement>();
     for (FormalParameter parameter in parameterList.parameters) {
-      ParameterElement element = parameter.identifier.element as ParameterElement;
+      ParameterElement element = parameter.identifier.staticElement as ParameterElement;
       if (element != null) {
         elements.add(element);
       }
@@ -9915,6 +10122,9 @@
     if (implementsClause != null) {
       NodeList<TypeName> interfaces = implementsClause.interfaces;
       List<InterfaceType> interfaceTypes = resolveTypes(interfaces, CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, CompileTimeErrorCode.IMPLEMENTS_DYNAMIC);
+      if (classElement != null) {
+        classElement.interfaces = interfaceTypes;
+      }
       List<TypeName> typeNames = new List.from(interfaces);
       List<bool> detectedRepeatOnIndex = new List<bool>.filled(typeNames.length, false);
       for (int i = 0; i < detectedRepeatOnIndex.length; i++) {
@@ -9923,22 +10133,19 @@
       for (int i = 0; i < typeNames.length; i++) {
         TypeName typeName = typeNames[i];
         if (!detectedRepeatOnIndex[i]) {
+          Element element = typeName.name.staticElement;
           for (int j = i + 1; j < typeNames.length; j++) {
-            Element element = typeName.name.element;
             TypeName typeName2 = typeNames[j];
             Identifier identifier2 = typeName2.name;
             String name2 = identifier2.name;
-            Element element2 = identifier2.element;
+            Element element2 = identifier2.staticElement;
             if (element != null && element == element2) {
               detectedRepeatOnIndex[j] = true;
-              reportError(CompileTimeErrorCode.IMPLEMENTS_REPEATED, typeName2, [name2]);
+              reportError5(CompileTimeErrorCode.IMPLEMENTS_REPEATED, typeName2, [name2]);
             }
           }
         }
       }
-      if (classElement != null) {
-        classElement.interfaces = interfaceTypes;
-      }
     }
   }
 
@@ -9958,9 +10165,9 @@
     }
     Identifier name = typeName.name;
     if (name.name == sc.Keyword.DYNAMIC.syntax) {
-      reportError(dynamicTypeError, name, [name.name]);
+      reportError5(dynamicTypeError, name, [name.name]);
     } else {
-      reportError(nonTypeError, name, [name.name]);
+      reportError5(nonTypeError, name, [name.name]);
     }
     return null;
   }
@@ -9984,20 +10191,17 @@
     }
     return new List.from(types);
   }
-  void setElement(Identifier typeName, Element element2) {
-    if (element2 != null) {
+  void setElement(Identifier typeName, Element element) {
+    if (element != null) {
       if (typeName is SimpleIdentifier) {
-        ((typeName as SimpleIdentifier)).staticElement = element2;
-        ((typeName as SimpleIdentifier)).element = element2;
+        ((typeName as SimpleIdentifier)).staticElement = element;
       } else if (typeName is PrefixedIdentifier) {
         PrefixedIdentifier identifier = typeName as PrefixedIdentifier;
-        identifier.identifier.staticElement = element2;
-        identifier.identifier.element = element2;
+        identifier.identifier.staticElement = element;
         SimpleIdentifier prefix = identifier.prefix;
         Element prefixElement = nameScope.lookup(prefix, definingLibrary);
         if (prefixElement != null) {
           prefix.staticElement = prefixElement;
-          prefix.element = prefixElement;
         }
       }
     }
@@ -10105,6 +10309,13 @@
   Scope _enclosingScope;
 
   /**
+   * A set of names that will be defined in this scope, but right now are not defined. However
+   * according to the scoping rules these names are hidden, even if they were defined in an outer
+   * scope.
+   */
+  Set<String> _hiddenNames = new Set<String>();
+
+  /**
    * Initialize a newly created scope enclosed within another scope.
    *
    * @param enclosingScope the scope in which this scope is lexically enclosed
@@ -10116,6 +10327,21 @@
   AnalysisErrorListener get errorListener => _enclosingScope.errorListener;
 
   /**
+   * Hides the name of the given element in this scope. If there is already an element with the
+   * given name defined in an outer scope, then it will become unavailable.
+   *
+   * @param element the element to be hidden in this scope
+   */
+  void hide(Element element) {
+    if (element != null) {
+      String name = element.name;
+      if (name != null && !name.isEmpty) {
+        javaSetAdd(_hiddenNames, name);
+      }
+    }
+  }
+
+  /**
    * Return the scope in which this scope is lexically enclosed.
    *
    * @return the scope in which this scope is lexically enclosed
@@ -10126,6 +10352,9 @@
     if (element != null) {
       return element;
     }
+    if (_hiddenNames.contains(name)) {
+      return null;
+    }
     return _enclosingScope.lookup3(identifier, name, referencingLibrary);
   }
 }
@@ -10973,7 +11202,7 @@
   }
   Object visitListLiteral(ListLiteral node) {
     super.visitListLiteral(node);
-    if (node.modifier != null) {
+    if (node.constKeyword != null) {
       for (Expression element in node.elements) {
         validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT);
       }
@@ -10982,7 +11211,7 @@
   }
   Object visitMapLiteral(MapLiteral node) {
     super.visitMapLiteral(node);
-    bool isConst = node.modifier != null;
+    bool isConst = node.constKeyword != null;
     bool reportEqualKeys = true;
     Set<Object> keys = new Set<Object>();
     List<Expression> invalidKeys = new List<Expression>();
@@ -11202,7 +11431,7 @@
   List<ParameterElement> parameterElements;
   ConstantVisitor_10(this.ConstantVerifier_this, this.parameterElements) : super();
   EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) {
-    Element element = node.element;
+    Element element = node.staticElement;
     for (ParameterElement parameterElement in parameterElements) {
       if (identical(parameterElement, element) && parameterElement != null) {
         Type2 type = parameterElement.type;
@@ -11246,7 +11475,7 @@
   static bool isTypeReference(Expression expr) {
     if (expr is Identifier) {
       Identifier identifier = expr as Identifier;
-      return identifier.element is ClassElement;
+      return identifier.staticElement is ClassElement;
     }
     return false;
   }
@@ -11300,6 +11529,12 @@
 
   /**
    * This is set to `true` iff the visitor is currently visiting children nodes of an
+   * [Comment].
+   */
+  bool _isInComment = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting children nodes of an
    * [InstanceCreationExpression].
    */
   bool _isInConstInstanceCreation = false;
@@ -11335,6 +11570,12 @@
   bool _isInConstructorInitializer = false;
 
   /**
+   * This is set to `true` iff the visitor is currently visiting a
+   * [FunctionTypedFormalParameter].
+   */
+  bool _isInFunctionTypedFormalParameter = false;
+
+  /**
    * This is set to `true` iff the visitor is currently visiting a static method. By "method"
    * here getter, setter and operator declarations are also implied since they are all represented
    * with a [MethodDeclaration] in the AST structure.
@@ -11415,6 +11656,7 @@
     _isInStaticMethod = false;
     _dynamicType = typeProvider.dynamicType;
     _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT = <InterfaceType> [
+        typeProvider.nullType,
         typeProvider.numType,
         typeProvider.intType,
         typeProvider.doubleType,
@@ -11511,6 +11753,14 @@
     }
     return super.visitClassTypeAlias(node);
   }
+  Object visitComment(Comment node) {
+    _isInComment = true;
+    try {
+      return super.visitComment(node);
+    } finally {
+      _isInComment = false;
+    }
+  }
   Object visitConditionalExpression(ConditionalExpression node) {
     checkForNonBoolCondition(node.condition);
     return super.visitConditionalExpression(node);
@@ -11521,13 +11771,15 @@
       _enclosingFunction = node.element;
       _isEnclosingConstructorConst = node.constKeyword != null;
       checkForConstConstructorWithNonFinalField(node);
+      checkForConstConstructorWithNonConstSuper(node);
       checkForConflictingConstructorNameAndMember(node);
       checkForAllFinalInitializedErrorCodes(node);
       checkForRedirectingConstructorErrorCodes(node);
       checkForMultipleSuperInitializers(node);
       checkForRecursiveConstructorRedirect(node);
-      checkForRecursiveFactoryRedirect(node);
-      checkForAllRedirectConstructorErrorCodes(node);
+      if (!checkForRecursiveFactoryRedirect(node)) {
+        checkForAllRedirectConstructorErrorCodes(node);
+      }
       checkForUndefinedConstructorInInitializerImplicit(node);
       checkForRedirectToNonConstConstructor(node);
       checkForReturnInGenerativeConstructor(node);
@@ -11546,6 +11798,11 @@
       _isInConstructorInitializer = false;
     }
   }
+  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+    checkForInvalidAssignment2(node.identifier, node.defaultValue);
+    checkForDefaultValueInFunctionTypedParameter(node);
+    return super.visitDefaultFormalParameter(node);
+  }
   Object visitDoStatement(DoStatement node) {
     checkForNonBoolCondition(node.condition);
     return super.visitDoStatement(node);
@@ -11623,12 +11880,29 @@
       return super.visitFunctionExpression(node);
     }
   }
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    Expression functionExpression = node.function;
+    Type2 expressionType = functionExpression.staticType;
+    if (!isFunctionType(expressionType)) {
+      _errorReporter.reportError2(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, functionExpression, []);
+    }
+    return super.visitFunctionExpressionInvocation(node);
+  }
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
     checkForDefaultValueInFunctionTypeAlias(node);
     checkForTypeAliasCannotReferenceItself_function(node);
     return super.visitFunctionTypeAlias(node);
   }
+  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    bool old = _isInFunctionTypedFormalParameter;
+    _isInFunctionTypedFormalParameter = true;
+    try {
+      return super.visitFunctionTypedFormalParameter(node);
+    } finally {
+      _isInFunctionTypedFormalParameter = old;
+    }
+  }
   Object visitIfStatement(IfStatement node) {
     checkForNonBoolCondition(node.condition);
     return super.visitIfStatement(node);
@@ -11665,7 +11939,7 @@
     }
   }
   Object visitListLiteral(ListLiteral node) {
-    if (node.modifier != null) {
+    if (node.constKeyword != null) {
       TypeArgumentList typeArguments = node.typeArguments;
       if (typeArguments != null) {
         NodeList<TypeName> arguments = typeArguments.arguments;
@@ -11682,8 +11956,7 @@
     if (typeArguments != null) {
       NodeList<TypeName> arguments = typeArguments.arguments;
       if (arguments.length != 0) {
-        checkForInvalidTypeArgumentForKey(arguments);
-        if (node.modifier != null) {
+        if (node.constKeyword != null) {
           checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
         }
       }
@@ -11726,7 +11999,13 @@
     }
   }
   Object visitMethodInvocation(MethodInvocation node) {
-    checkForStaticAccessToInstanceMember(node.target, node.methodName);
+    Expression target = node.realTarget;
+    SimpleIdentifier methodName = node.methodName;
+    checkForStaticAccessToInstanceMember(target, methodName);
+    checkForInstanceAccessToStaticMember(target, methodName);
+    if (target == null) {
+      checkForUnqualifiedReferenceToNonLocalStaticMember(methodName);
+    }
     return super.visitMethodInvocation(node);
   }
   Object visitNativeClause(NativeClause node) {
@@ -11747,6 +12026,7 @@
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     if (node.parent is! Annotation) {
       checkForStaticAccessToInstanceMember(node.prefix, node.identifier);
+      checkForInstanceAccessToStaticMember(node.prefix, node.identifier);
     }
     return super.visitPrefixedIdentifier(node);
   }
@@ -11759,7 +12039,9 @@
   }
   Object visitPropertyAccess(PropertyAccess node) {
     Expression target = node.realTarget;
-    checkForStaticAccessToInstanceMember(target, node.propertyName);
+    SimpleIdentifier propertyName = node.propertyName;
+    checkForStaticAccessToInstanceMember(target, propertyName);
+    checkForInstanceAccessToStaticMember(target, propertyName);
     return super.visitPropertyAccess(node);
   }
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
@@ -11786,6 +12068,9 @@
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     checkForReferenceToDeclaredVariableInInitializer(node);
     checkForImplicitThisReferenceInInitializer(node);
+    if (!isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
+      checkForUnqualifiedReferenceToNonLocalStaticMember(node);
+    }
     return super.visitSimpleIdentifier(node);
   }
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
@@ -11886,7 +12171,7 @@
           fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL;
         } else if (identical(state, INIT_STATE.INIT_IN_DECLARATION)) {
           if (fieldElement.isFinal || fieldElement.isConst) {
-            _errorReporter.reportError2(CompileTimeErrorCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, formalParameter.identifier, [fieldElement.displayName]);
+            _errorReporter.reportError2(StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, formalParameter.identifier, [fieldElement.displayName]);
             foundError = true;
           }
         } else if (identical(state, INIT_STATE.INIT_IN_FIELD_FORMAL)) {
@@ -11905,7 +12190,7 @@
       if (constructorInitializer is ConstructorFieldInitializer) {
         ConstructorFieldInitializer constructorFieldInitializer = constructorInitializer as ConstructorFieldInitializer;
         SimpleIdentifier fieldName = constructorFieldInitializer.fieldName;
-        Element element = fieldName.element;
+        Element element = fieldName.staticElement;
         if (element is FieldElement) {
           FieldElement fieldElement = element as FieldElement;
           INIT_STATE state = fieldElementsMap[fieldElement];
@@ -11913,7 +12198,7 @@
             fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_INITIALIZERS;
           } else if (identical(state, INIT_STATE.INIT_IN_DECLARATION)) {
             if (fieldElement.isFinal || fieldElement.isConst) {
-              _errorReporter.reportError2(CompileTimeErrorCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, fieldName, []);
+              _errorReporter.reportError2(StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, fieldName, []);
               foundError = true;
             }
           } else if (identical(state, INIT_STATE.INIT_IN_FIELD_FORMAL)) {
@@ -11941,7 +12226,7 @@
   /**
    * This checks the passed executable element against override-error codes.
    *
-   * @param executableElement the [ExecutableElement] to evaluate
+   * @param executableElement a non-null [ExecutableElement] to evaluate
    * @param parameters the parameters of the executable element
    * @param errorNameTarget the node to report problems on
    * @return `true` if and only if an error code is generated on the passed node
@@ -11959,7 +12244,7 @@
    */
   bool checkForAllInvalidOverrideErrorCodes(ExecutableElement executableElement, List<ParameterElement> parameters2, List<ASTNode> parameterLocations, SimpleIdentifier errorNameTarget) {
     String executableElementName = executableElement.name;
-    ExecutableElement overriddenExecutable = _inheritanceManager.lookupInheritance(_enclosingClass, executableElement.name);
+    ExecutableElement overriddenExecutable = _inheritanceManager.lookupInheritance(_enclosingClass, executableElementName);
     bool isGetter = false;
     bool isSetter = false;
     if (executableElement is PropertyAccessorElement) {
@@ -12014,13 +12299,13 @@
     Map<String, Type2> overridingNamedPT = overridingFT.namedParameterTypes;
     Map<String, Type2> overriddenNamedPT = overriddenFT.namedParameterTypes;
     if (overridingNormalPT.length != overriddenNormalPT.length) {
-      _errorReporter.reportError2(CompileTimeErrorCode.INVALID_OVERRIDE_REQUIRED, errorNameTarget, [
+      _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_REQUIRED, errorNameTarget, [
           overriddenNormalPT.length,
           overriddenExecutable.enclosingElement.displayName]);
       return true;
     }
     if (overridingPositionalPT.length < overriddenPositionalPT.length) {
-      _errorReporter.reportError2(CompileTimeErrorCode.INVALID_OVERRIDE_POSITIONAL, errorNameTarget, [
+      _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_POSITIONAL, errorNameTarget, [
           overriddenPositionalPT.length,
           overriddenExecutable.enclosingElement.displayName]);
       return true;
@@ -12030,7 +12315,7 @@
     while (overriddenParameterNameIterator.hasNext) {
       String overriddenParamName = overriddenParameterNameIterator.next();
       if (!overridingParameterNameSet.contains(overriddenParamName)) {
-        _errorReporter.reportError2(CompileTimeErrorCode.INVALID_OVERRIDE_NAMED, errorNameTarget, [
+        _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_NAMED, errorNameTarget, [
             overriddenParamName,
             overriddenExecutable.enclosingElement.displayName]);
         return true;
@@ -12103,12 +12388,16 @@
       ParameterElement parameter = parameters2[i];
       if (parameter.parameterKind.isOptional) {
         formalParameters.add(parameterLocations[i]);
-        parameterElts.add((parameter as ParameterElementImpl));
+        parameterElts.add(parameter as ParameterElementImpl);
       }
     }
     for (ParameterElement parameterElt in overriddenPEs) {
       if (parameterElt.parameterKind.isOptional) {
-        overriddenParameterElts.add((parameterElt as ParameterElementImpl));
+        if (parameterElt is ParameterElementImpl) {
+          overriddenParameterElts.add(parameterElt as ParameterElementImpl);
+        } else if (parameterElt is ParameterMember) {
+          overriddenParameterElts.add(((parameterElt as ParameterMember)).baseElement as ParameterElementImpl);
+        }
       }
     }
     if (parameterElts.length > 0) {
@@ -12237,10 +12526,14 @@
       if (mixinType is! InterfaceType) {
         continue;
       }
-      ClassElement mixinElement = ((mixinType as InterfaceType)).element;
-      problemReported = javaBooleanOr(problemReported, checkForMixinDeclaresConstructor(mixinName, mixinElement));
-      problemReported = javaBooleanOr(problemReported, checkForMixinInheritsNotFromObject(mixinName, mixinElement));
-      problemReported = javaBooleanOr(problemReported, checkForMixinReferencesSuper(mixinName, mixinElement));
+      if (checkForExtendsOrImplementsDisallowedClass(mixinName, CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS)) {
+        problemReported = true;
+      } else {
+        ClassElement mixinElement = ((mixinType as InterfaceType)).element;
+        problemReported = javaBooleanOr(problemReported, checkForMixinDeclaresConstructor(mixinName, mixinElement));
+        problemReported = javaBooleanOr(problemReported, checkForMixinInheritsNotFromObject(mixinName, mixinElement));
+        problemReported = javaBooleanOr(problemReported, checkForMixinReferencesSuper(mixinName, mixinElement));
+      }
     }
     return problemReported;
   }
@@ -12259,7 +12552,7 @@
     if (redirectedNode == null) {
       return false;
     }
-    ConstructorElement redirectedElement = redirectedNode.element;
+    ConstructorElement redirectedElement = redirectedNode.staticElement;
     if (redirectedElement == null) {
       TypeName constructorTypeName = redirectedNode.type;
       Type2 redirectedType = constructorTypeName.type;
@@ -12370,7 +12663,7 @@
    */
   bool checkForArgumentDefinitionTestNonParameter(ArgumentDefinitionTest node) {
     SimpleIdentifier identifier = node.identifier;
-    Element element = identifier.element;
+    Element element = identifier.staticElement;
     if (element != null && element is! ParameterElement) {
       _errorReporter.reportError2(CompileTimeErrorCode.ARGUMENT_DEFINITION_TEST_NON_PARAMETER, identifier, [identifier.name]);
       return true;
@@ -12501,10 +12794,10 @@
   bool checkForAssignmentToFinal2(Expression expression) {
     Element element = null;
     if (expression is Identifier) {
-      element = ((expression as Identifier)).element;
+      element = ((expression as Identifier)).staticElement;
     }
     if (expression is PropertyAccess) {
-      element = ((expression as PropertyAccess)).propertyName.element;
+      element = ((expression as PropertyAccess)).propertyName.staticElement;
     }
     if (element is PropertyAccessorElement) {
       PropertyAccessorElement accessor = element as PropertyAccessorElement;
@@ -12629,7 +12922,7 @@
     for (int i = 0; i < lastMember; i++) {
       SwitchMember member = members[i];
       if (member is SwitchCase) {
-        foundError = javaBooleanOr(foundError, checkForCaseBlockNotTerminated((member as SwitchCase)));
+        foundError = javaBooleanOr(foundError, checkForCaseBlockNotTerminated(member as SwitchCase));
       }
     }
     return foundError;
@@ -12892,7 +13185,51 @@
   }
 
   /**
-   * This verifies that the passed constructor declaration is 'const' then there are no non-final
+   * This verifies that if the passed constructor declaration is 'const' then there are no
+   * invocations of non-'const' super constructors.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER
+   */
+  bool checkForConstConstructorWithNonConstSuper(ConstructorDeclaration node) {
+    if (!_isEnclosingConstructorConst) {
+      return false;
+    }
+    if (node.factoryKeyword != null) {
+      return false;
+    }
+    for (ConstructorInitializer initializer in node.initializers) {
+      if (initializer is SuperConstructorInvocation) {
+        SuperConstructorInvocation superInvocation = initializer as SuperConstructorInvocation;
+        ConstructorElement element = superInvocation.staticElement;
+        if (element.isConst) {
+          return false;
+        }
+        _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, superInvocation, []);
+        return true;
+      }
+    }
+    InterfaceType supertype = _enclosingClass.supertype;
+    if (supertype == null) {
+      return false;
+    }
+    if (supertype.isObject) {
+      return false;
+    }
+    ConstructorElement unnamedConstructor = supertype.element.unnamedConstructor;
+    if (unnamedConstructor == null) {
+      return false;
+    }
+    if (unnamedConstructor.isConst) {
+      return false;
+    }
+    _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, node, []);
+    return true;
+  }
+
+  /**
+   * This verifies that if the passed constructor declaration is 'const' then there are no non-final
    * instance variable.
    *
    * @param node the constructor declaration to evaluate
@@ -12957,7 +13294,7 @@
    */
   bool checkForConstOrNewWithAbstractClass(InstanceCreationExpression node, TypeName typeName, InterfaceType type) {
     if (type.element.isAbstract) {
-      ConstructorElement element = node.element;
+      ConstructorElement element = node.staticElement;
       if (element != null && !element.isFactory) {
         if (identical(((node.keyword as sc.KeywordToken)).keyword, sc.Keyword.CONST)) {
           _errorReporter.reportError2(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName, []);
@@ -12981,7 +13318,7 @@
    * @see CompileTimeErrorCode#CONST_WITH_NON_CONST
    */
   bool checkForConstWithNonConst(InstanceCreationExpression node) {
-    ConstructorElement constructorElement = node.element;
+    ConstructorElement constructorElement = node.staticElement;
     if (constructorElement != null && !constructorElement.isConst) {
       _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_NON_CONST, node, []);
       return true;
@@ -13023,7 +13360,7 @@
     if (name == null) {
       return false;
     }
-    if (name.element is TypeVariableElement) {
+    if (name.staticElement is TypeVariableElement) {
       _errorReporter.reportError2(CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS, name, []);
     }
     TypeArgumentList typeArguments = typeName.typeArguments;
@@ -13049,7 +13386,7 @@
    * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT
    */
   bool checkForConstWithUndefinedConstructor(InstanceCreationExpression node) {
-    if (node.element != null) {
+    if (node.staticElement != null) {
       return false;
     }
     ConstructorName constructorName = node.constructorName;
@@ -13094,6 +13431,25 @@
   }
 
   /**
+   * This verifies that the given default formal parameter is not part of a function typed
+   * parameter.
+   *
+   * @param node the default formal parameter to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER
+   */
+  bool checkForDefaultValueInFunctionTypedParameter(DefaultFormalParameter node) {
+    if (!_isInFunctionTypedFormalParameter) {
+      return false;
+    }
+    if (node.defaultValue == null) {
+      return false;
+    }
+    _errorReporter.reportError2(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER, node, []);
+    return true;
+  }
+
+  /**
    * This verifies that the enclosing class does not have an instance member with the given name of
    * the static member.
    *
@@ -13105,11 +13461,17 @@
       return false;
     }
     bool hasProblem = false;
-    for (MethodElement method in _enclosingClass.methods) {
-      if (!method.isStatic) {
+    for (ExecutableElement member in _enclosingClass.methods) {
+      if (!member.isStatic) {
         continue;
       }
-      hasProblem = javaBooleanOr(hasProblem, checkForDuplicateDefinitionInheritance2(method));
+      hasProblem = javaBooleanOr(hasProblem, checkForDuplicateDefinitionInheritance2(member));
+    }
+    for (ExecutableElement member in _enclosingClass.accessors) {
+      if (!member.isStatic) {
+        continue;
+      }
+      hasProblem = javaBooleanOr(hasProblem, checkForDuplicateDefinitionInheritance2(member));
     }
     return hasProblem;
   }
@@ -13260,7 +13622,7 @@
    * @see StaticWarningCode#FIELD_INITIALIZER_NOT_ASSIGNABLE
    */
   bool checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node) {
-    Element fieldNameElement = node.fieldName.element;
+    Element fieldNameElement = node.fieldName.staticElement;
     if (fieldNameElement is! FieldElement) {
       return false;
     }
@@ -13412,7 +13774,7 @@
     if (!_isInConstructorInitializer && !_isInStaticMethod && !_isInInstanceVariableInitializer && !_isInStaticVariableDeclaration) {
       return false;
     }
-    Element element = node.element;
+    Element element = node.staticElement;
     if (!(element is MethodElement || element is PropertyAccessorElement)) {
       return false;
     }
@@ -13569,6 +13931,40 @@
   }
 
   /**
+   * This checks that if the given "target" is not a type reference then the "name" is reference to
+   * an instance member.
+   *
+   * @param target the target of the name access to evaluate
+   * @param name the accessed name to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#INSTANCE_ACCESS_TO_STATIC_MEMBER
+   */
+  bool checkForInstanceAccessToStaticMember(Expression target, SimpleIdentifier name2) {
+    if (target == null) {
+      return false;
+    }
+    if (_isInComment) {
+      return false;
+    }
+    Element element = name2.staticElement;
+    if (element is! ExecutableElement) {
+      return false;
+    }
+    ExecutableElement executableElement = element as ExecutableElement;
+    if (executableElement.enclosingElement is! ClassElement) {
+      return false;
+    }
+    if (!executableElement.isStatic) {
+      return false;
+    }
+    if (isTypeReference(target)) {
+      return false;
+    }
+    _errorReporter.reportError2(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, name2, [name2.name]);
+    return true;
+  }
+
+  /**
    * This verifies that an 'int' can be assigned to the parameter corresponding to the given
    * expression. This is used for prefix and postfix expressions where the argument value is
    * implicit.
@@ -13673,24 +14069,6 @@
   }
 
   /**
-   * Checks to ensure that first type argument to a map literal must be the 'String' type.
-   *
-   * @param arguments a non-`null`, non-empty [TypeName] node list from the respective
-   *          [MapLiteral]
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_FOR_KEY
-   */
-  bool checkForInvalidTypeArgumentForKey(NodeList<TypeName> arguments) {
-    TypeName firstArgument = arguments[0];
-    Type2 firstArgumentType = firstArgument.type;
-    if (firstArgumentType != null && firstArgumentType != _typeProvider.stringType) {
-      _errorReporter.reportError2(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_FOR_KEY, firstArgument, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
    * Checks to ensure that the passed [ListLiteral] or [MapLiteral] does not have a type
    * parameter as a type argument.
    *
@@ -13731,7 +14109,7 @@
     }
     Type2 listElementType = typeArguments[0].type;
     ErrorCode errorCode;
-    if (node.modifier != null) {
+    if (node.constKeyword != null) {
       errorCode = CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE;
     } else {
       errorCode = StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE;
@@ -13767,7 +14145,7 @@
     Type2 valueType = typeArguments[1].type;
     ErrorCode keyErrorCode;
     ErrorCode valueErrorCode;
-    if (node.modifier != null) {
+    if (node.constKeyword != null) {
       keyErrorCode = CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE;
       valueErrorCode = CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE;
     } else {
@@ -13952,7 +14330,7 @@
    * @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR
    */
   bool checkForNewWithUndefinedConstructor(InstanceCreationExpression node) {
-    if (node.element != null) {
+    if (node.staticElement != null) {
       return false;
     }
     ConstructorName constructorName = node.constructorName;
@@ -14156,7 +14534,7 @@
    * @see CompileTimeErrorCode#NON_CONST_MAP_AS_EXPRESSION_STATEMENT
    */
   bool checkForNonConstMapAsExpressionStatement(MapLiteral node) {
-    if (node.modifier != null) {
+    if (node.constKeyword != null) {
       return false;
     }
     if (node.typeArguments != null) {
@@ -14578,7 +14956,7 @@
    * @see StaticWarningCode#STATIC_ACCESS_TO_INSTANCE_MEMBER
    */
   bool checkForStaticAccessToInstanceMember(Expression target, SimpleIdentifier name2) {
-    Element element = name2.element;
+    Element element = name2.staticElement;
     if (element is! ExecutableElement) {
       return false;
     }
@@ -14692,7 +15070,7 @@
           } else {
             errorCode = StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
           }
-          _errorReporter.reportError2(errorCode, argTypeName, [argTypeName.name, boundType.displayName]);
+          _errorReporter.reportError2(errorCode, argTypeName, [argType.displayName, boundType.displayName]);
           foundError = true;
         }
       }
@@ -14771,6 +15149,33 @@
   }
 
   /**
+   * This checks that if the given name is a reference to a static member it is defined in the
+   * enclosing class rather than in a superclass.
+   *
+   * @param name the name to be evaluated
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
+   */
+  bool checkForUnqualifiedReferenceToNonLocalStaticMember(SimpleIdentifier name2) {
+    Element element = name2.staticElement;
+    if (element == null || element is TypeVariableElement) {
+      return false;
+    }
+    Element enclosingElement = element.enclosingElement;
+    if (enclosingElement is! ClassElement) {
+      return false;
+    }
+    if ((element is MethodElement && !((element as MethodElement)).isStatic) || (element is PropertyAccessorElement && !((element as PropertyAccessorElement)).isStatic)) {
+      return false;
+    }
+    if (identical(enclosingElement, _enclosingClass)) {
+      return false;
+    }
+    _errorReporter.reportError2(StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER, name2, [name2.name]);
+    return true;
+  }
+
+  /**
    * This verifies the passed operator-method declaration, has correct number of parameters.
    *
    * This method assumes that the method declaration was tested to be an operator declaration before
@@ -14913,7 +15318,7 @@
    */
   VariableElement getVariableElement(Expression expression) {
     if (expression is Identifier) {
-      Element element = ((expression as Identifier)).element;
+      Element element = ((expression as Identifier)).staticElement;
       if (element is VariableElement) {
         return element as VariableElement;
       }
@@ -14972,6 +15377,20 @@
       javaSetAdd(checked, current);
     }
   }
+  bool isFunctionType(Type2 type) {
+    if (type.isDynamic || identical(type, BottomTypeImpl.instance)) {
+      return true;
+    } else if (type is InterfaceType) {
+      if (identical(type, _typeProvider.functionType)) {
+        return true;
+      }
+      MethodElement callMethod = ((type as InterfaceType)).lookUpMethod(ElementResolver.CALL_METHOD_NAME, _currentLibrary);
+      return callMethod != null;
+    } else if (type is FunctionType || type.isDartCoreFunction) {
+      return true;
+    }
+    return false;
+  }
 
   /**
    * @return `true` if the given [ASTNode] is the part of constant constructor
@@ -14998,7 +15417,7 @@
         ConstructorDeclaration constructor = n as ConstructorDeclaration;
         return constructor.factoryKeyword == null;
       }
-      if (n is ConstructorFieldInitializer) {
+      if (n is ConstructorInitializer) {
         return false;
       }
       if (n is MethodDeclaration) {
@@ -15010,6 +15429,31 @@
   }
 
   /**
+   * Return `true` if the given identifier is in a location where it is allowed to resolve to
+   * a static member of a supertype.
+   *
+   * @param node the node being tested
+   * @return `true` if the given identifier is in a location where it is allowed to resolve to
+   *         a static member of a supertype
+   */
+  bool isUnqualifiedReferenceToNonLocalStaticMemberAllowed(SimpleIdentifier node) {
+    if (node.inDeclarationContext()) {
+      return true;
+    }
+    ASTNode parent = node.parent;
+    if (parent is ConstructorName || parent is MethodInvocation || parent is PropertyAccess || parent is SuperConstructorInvocation) {
+      return true;
+    }
+    if (parent is PrefixedIdentifier && identical(((parent as PrefixedIdentifier)).identifier, node)) {
+      return true;
+    }
+    if (parent is Annotation && identical(((parent as Annotation)).constructorName, node)) {
+      return true;
+    }
+    return false;
+  }
+
+  /**
    * Return `true` iff the passed [ClassElement] has a concrete implementation of the
    * passed accessor name in the superclass chain.
    */
@@ -15096,7 +15540,7 @@
  * signature, not initialized, initialized in the field declaration, initialized in the field
  * formal, and finally, initialized in the initializers list.
  */
-class INIT_STATE implements Enum<INIT_STATE> {
+class INIT_STATE extends Enum<INIT_STATE> {
   static final INIT_STATE NOT_INIT = new INIT_STATE('NOT_INIT', 0);
   static final INIT_STATE INIT_IN_DECLARATION = new INIT_STATE('INIT_IN_DECLARATION', 1);
   static final INIT_STATE INIT_IN_FIELD_FORMAL = new INIT_STATE('INIT_IN_FIELD_FORMAL', 2);
@@ -15106,16 +15550,7 @@
       INIT_IN_DECLARATION,
       INIT_IN_FIELD_FORMAL,
       INIT_IN_INITIALIZERS];
-
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-  INIT_STATE(this.name, this.ordinal);
-  int compareTo(INIT_STATE other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
+  INIT_STATE(String name, int ordinal) : super(name, ordinal);
 }
 class GeneralizingElementVisitor_11 extends GeneralizingElementVisitor<Object> {
   Element target;
@@ -15179,45 +15614,56 @@
  *
  * @coverage dart.engine.resolver
  */
-class ResolverErrorCode implements Enum<ResolverErrorCode>, ErrorCode {
-  static final ResolverErrorCode BREAK_LABEL_ON_SWITCH_MEMBER = new ResolverErrorCode('BREAK_LABEL_ON_SWITCH_MEMBER', 0, ErrorType.COMPILE_TIME_ERROR, "Break label resolves to case or default statement");
-  static final ResolverErrorCode CONTINUE_LABEL_ON_SWITCH = new ResolverErrorCode('CONTINUE_LABEL_ON_SWITCH', 1, ErrorType.COMPILE_TIME_ERROR, "A continue label resolves to switch, must be loop or switch member");
-  static final ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART = new ResolverErrorCode('MISSING_LIBRARY_DIRECTIVE_WITH_PART', 2, ErrorType.COMPILE_TIME_ERROR, "Libraries that have parts must have a library directive");
+class ResolverErrorCode extends Enum<ResolverErrorCode> implements ErrorCode {
+  static final ResolverErrorCode BREAK_LABEL_ON_SWITCH_MEMBER = new ResolverErrorCode.con1('BREAK_LABEL_ON_SWITCH_MEMBER', 0, ErrorType.COMPILE_TIME_ERROR, "Break label resolves to case or default statement");
+  static final ResolverErrorCode CONTINUE_LABEL_ON_SWITCH = new ResolverErrorCode.con1('CONTINUE_LABEL_ON_SWITCH', 1, ErrorType.COMPILE_TIME_ERROR, "A continue label resolves to switch, must be loop or switch member");
+  static final ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART = new ResolverErrorCode.con1('MISSING_LIBRARY_DIRECTIVE_WITH_PART', 2, ErrorType.COMPILE_TIME_ERROR, "Libraries that have parts must have a library directive");
   static final List<ResolverErrorCode> values = [
       BREAK_LABEL_ON_SWITCH_MEMBER,
       CONTINUE_LABEL_ON_SWITCH,
       MISSING_LIBRARY_DIRECTIVE_WITH_PART];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
    * The type of this error.
    */
   ErrorType _type;
 
   /**
-   * The message template used to create the message to be displayed for this error.
+   * The template used to create the message to be displayed for this error.
    */
   String _message;
 
   /**
+   * The template used to create the correction to be displayed for this error, or `null` if
+   * there is no correction information for this error.
+   */
+  String correction9;
+
+  /**
    * Initialize a newly created error code to have the given type and message.
    *
    * @param type the type of this error
    * @param message the message template used to create the message to be displayed for the error
    */
-  ResolverErrorCode(this.name, this.ordinal, ErrorType type, String message) {
+  ResolverErrorCode.con1(String name, int ordinal, ErrorType type, String message) : super(name, ordinal) {
     this._type = type;
     this._message = message;
   }
+
+  /**
+   * Initialize a newly created error code to have the given type, message and correction.
+   *
+   * @param type the type of this error
+   * @param message the template used to create the message to be displayed for the error
+   * @param correction the template used to create the correction to be displayed for the error
+   */
+  ResolverErrorCode.con2(String name, int ordinal, ErrorType type, String message, String correction) : super(name, ordinal) {
+    this._type = type;
+    this._message = message;
+    this.correction9 = correction;
+  }
+  String get correction => correction9;
   ErrorSeverity get errorSeverity => _type.severity;
   String get message => _message;
   ErrorType get type => _type;
-  int compareTo(ResolverErrorCode other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/generated/scanner.dart b/pkg/analyzer_experimental/lib/src/generated/scanner.dart
index 0f816df..89c7df4 100644
--- a/pkg/analyzer_experimental/lib/src/generated/scanner.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/scanner.dart
@@ -135,14 +135,14 @@
  *
  * @coverage dart.engine.parser
  */
-class ScannerErrorCode implements Enum<ScannerErrorCode>, ErrorCode {
-  static final ScannerErrorCode CHARACTER_EXPECTED_AFTER_SLASH = new ScannerErrorCode('CHARACTER_EXPECTED_AFTER_SLASH', 0, "Character expected after slash");
-  static final ScannerErrorCode ILLEGAL_CHARACTER = new ScannerErrorCode('ILLEGAL_CHARACTER', 1, "Illegal character %x");
-  static final ScannerErrorCode MISSING_DIGIT = new ScannerErrorCode('MISSING_DIGIT', 2, "Decimal digit expected");
-  static final ScannerErrorCode MISSING_HEX_DIGIT = new ScannerErrorCode('MISSING_HEX_DIGIT', 3, "Hexidecimal digit expected");
-  static final ScannerErrorCode MISSING_QUOTE = new ScannerErrorCode('MISSING_QUOTE', 4, "Expected quote (' or \")");
-  static final ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = new ScannerErrorCode('UNTERMINATED_MULTI_LINE_COMMENT', 5, "Unterminated multi-line comment");
-  static final ScannerErrorCode UNTERMINATED_STRING_LITERAL = new ScannerErrorCode('UNTERMINATED_STRING_LITERAL', 6, "Unterminated string literal");
+class ScannerErrorCode extends Enum<ScannerErrorCode> implements ErrorCode {
+  static final ScannerErrorCode CHARACTER_EXPECTED_AFTER_SLASH = new ScannerErrorCode.con1('CHARACTER_EXPECTED_AFTER_SLASH', 0, "Character expected after slash");
+  static final ScannerErrorCode ILLEGAL_CHARACTER = new ScannerErrorCode.con1('ILLEGAL_CHARACTER', 1, "Illegal character %x");
+  static final ScannerErrorCode MISSING_DIGIT = new ScannerErrorCode.con1('MISSING_DIGIT', 2, "Decimal digit expected");
+  static final ScannerErrorCode MISSING_HEX_DIGIT = new ScannerErrorCode.con1('MISSING_HEX_DIGIT', 3, "Hexidecimal digit expected");
+  static final ScannerErrorCode MISSING_QUOTE = new ScannerErrorCode.con1('MISSING_QUOTE', 4, "Expected quote (' or \")");
+  static final ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = new ScannerErrorCode.con1('UNTERMINATED_MULTI_LINE_COMMENT', 5, "Unterminated multi-line comment");
+  static final ScannerErrorCode UNTERMINATED_STRING_LITERAL = new ScannerErrorCode.con1('UNTERMINATED_STRING_LITERAL', 6, "Unterminated string literal");
   static final List<ScannerErrorCode> values = [
       CHARACTER_EXPECTED_AFTER_SLASH,
       ILLEGAL_CHARACTER,
@@ -152,31 +152,40 @@
       UNTERMINATED_MULTI_LINE_COMMENT,
       UNTERMINATED_STRING_LITERAL];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
-   * The message template used to create the message to be displayed for this error.
+   * The template used to create the message to be displayed for this error.
    */
   String _message;
 
   /**
+   * The template used to create the correction to be displayed for this error, or `null` if
+   * there is no correction information for this error.
+   */
+  String correction10;
+
+  /**
    * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for this error
    */
-  ScannerErrorCode(this.name, this.ordinal, String message) {
+  ScannerErrorCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
     this._message = message;
   }
+
+  /**
+   * Initialize a newly created error code to have the given message and correction.
+   *
+   * @param message the template used to create the message to be displayed for the error
+   * @param correction the template used to create the correction to be displayed for the error
+   */
+  ScannerErrorCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this._message = message;
+    this.correction10 = correction;
+  }
+  String get correction => correction10;
   ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
   String get message => _message;
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
-  int compareTo(ScannerErrorCode other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 /**
  * Instances of the class `TokenWithComment` represent a string token that is preceded by
@@ -209,7 +218,7 @@
  *
  * @coverage dart.engine.parser
  */
-class Keyword implements Enum<Keyword> {
+class Keyword extends Enum<Keyword> {
   static final Keyword ASSERT = new Keyword.con1('ASSERT', 0, "assert");
   static final Keyword BREAK = new Keyword.con1('BREAK', 1, "break");
   static final Keyword CASE = new Keyword.con1('CASE', 2, "case");
@@ -308,12 +317,6 @@
       STATIC,
       TYPEDEF];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
    * The lexeme for the keyword.
    */
@@ -358,7 +361,7 @@
    * @param syntax the lexeme for the keyword
    * @param isPseudoKeyword `true` if this keyword is a pseudo-keyword
    */
-  Keyword.con2(this.name, this.ordinal, String syntax, bool isPseudoKeyword) {
+  Keyword.con2(String name, int ordinal, String syntax, bool isPseudoKeyword) : super(name, ordinal) {
     this._syntax = syntax;
     this._isPseudoKeyword2 = isPseudoKeyword;
   }
@@ -377,9 +380,6 @@
    * @return `true` if this keyword is a pseudo-keyword
    */
   bool get isPseudoKeyword => _isPseudoKeyword2;
-  int compareTo(Keyword other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 /**
  * The abstract class `AbstractScanner` implements a scanner for Dart code. Subclasses are
@@ -830,7 +830,7 @@
       return next;
     }
   }
-  int select3(int choice, TokenType yesType, TokenType noType, int offset) {
+  int select2(int choice, TokenType yesType, TokenType noType, int offset) {
     int next = advance();
     if (next == choice) {
       appendToken2(yesType, offset);
@@ -937,7 +937,7 @@
     if (!hasDigit) {
       appendStringToken(TokenType.INT, getString(start, -2));
       if (0x2E == next) {
-        return select3(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD, offset - 1);
+        return select2(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD, offset - 1);
       }
       appendToken2(TokenType.PERIOD, offset - 1);
       return bigSwitch(next);
@@ -1046,7 +1046,7 @@
     KeywordState state = KeywordState.KEYWORD_STATE;
     int start = offset;
     while (state != null && 0x61 <= next2 && next2 <= 0x7A) {
-      state = state.next((next2 as int));
+      state = state.next(next2 as int);
       next2 = advance();
     }
     if (state == null || state.keyword() == null) {
@@ -1232,7 +1232,10 @@
   int tokenizeSingleLineComment(int next) {
     while (true) {
       next = advance();
-      if (0xA == next || 0xD == next || -1 == next) {
+      if (-1 == next) {
+        appendCommentToken(TokenType.SINGLE_LINE_COMMENT, getString(_tokenStart, 0));
+        return next;
+      } else if (0xA == next || 0xD == next) {
         appendCommentToken(TokenType.SINGLE_LINE_COMMENT, getString(_tokenStart, -1));
         return next;
       }
@@ -1800,7 +1803,7 @@
  *
  * @coverage dart.engine.parser
  */
-class TokenClass implements Enum<TokenClass> {
+class TokenClass extends Enum<TokenClass> {
 
   /**
    * A value used to indicate that the token type is not part of any specific class of token.
@@ -1899,19 +1902,13 @@
       UNARY_POSTFIX_OPERATOR,
       UNARY_PREFIX_OPERATOR];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
    * The precedence of tokens of this class, or `0` if the such tokens do not represent an
    * operator.
    */
   int _precedence = 0;
   TokenClass.con1(String name, int ordinal) : this.con2(name, ordinal, 0);
-  TokenClass.con2(this.name, this.ordinal, int precedence) {
+  TokenClass.con2(String name, int ordinal, int precedence) : super(name, ordinal) {
     this._precedence = precedence;
   }
 
@@ -1922,9 +1919,6 @@
    * @return the precedence of tokens of this class
    */
   int get precedence => _precedence;
-  int compareTo(TokenClass other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 /**
  * Instances of the class `KeywordTokenWithComment` implement a keyword token that is preceded
@@ -1958,7 +1952,7 @@
  *
  * @coverage dart.engine.parser
  */
-class TokenType implements Enum<TokenType> {
+class TokenType extends Enum<TokenType> {
 
   /**
    * The type of the token that marks the end of the input.
@@ -2101,12 +2095,6 @@
       BACKSLASH,
       PERIOD_PERIOD_PERIOD];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
    * The class of the token.
    */
@@ -2118,7 +2106,7 @@
    */
   String _lexeme;
   TokenType.con1(String name, int ordinal) : this.con2(name, ordinal, TokenClass.NO_CLASS, null);
-  TokenType.con2(this.name, this.ordinal, TokenClass tokenClass, String lexeme) {
+  TokenType.con2(String name, int ordinal, TokenClass tokenClass, String lexeme) : super(name, ordinal) {
     this._tokenClass = tokenClass == null ? TokenClass.NO_CLASS : tokenClass;
     this._lexeme = lexeme;
   }
@@ -2228,9 +2216,6 @@
    * @return `true` if this token type represents an operator that can be defined by users
    */
   bool get isUserDefinableOperator => identical(_lexeme, "==") || identical(_lexeme, "~") || identical(_lexeme, "[]") || identical(_lexeme, "[]=") || identical(_lexeme, "*") || identical(_lexeme, "/") || identical(_lexeme, "%") || identical(_lexeme, "~/") || identical(_lexeme, "+") || identical(_lexeme, "-") || identical(_lexeme, "<<") || identical(_lexeme, ">>") || identical(_lexeme, ">=") || identical(_lexeme, ">") || identical(_lexeme, "<=") || identical(_lexeme, "<") || identical(_lexeme, "&") || identical(_lexeme, "^") || identical(_lexeme, "|");
-  int compareTo(TokenType other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 class TokenType_EOF extends TokenType {
   TokenType_EOF(String name, int ordinal, TokenClass arg0, String arg1) : super.con2(name, ordinal, arg0, arg1);
diff --git a/pkg/analyzer_experimental/lib/src/generated/sdk.dart b/pkg/analyzer_experimental/lib/src/generated/sdk.dart
index 364d40a..2accc54 100644
--- a/pkg/analyzer_experimental/lib/src/generated/sdk.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/sdk.dart
@@ -1,8 +1,6 @@
 // This code was auto-generated, is not intended to be edited, and is subject to
 // significant change. Please see the README file for more information.
 library engine.sdk;
-import 'java_core.dart';
-import 'java_engine.dart';
 import 'source.dart' show ContentCache, Source, UriKind;
 import 'engine.dart' show AnalysisContext;
 /**
diff --git a/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart b/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
index 71f1e68..47d9a8f 100644
--- a/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
@@ -1,10 +1,8 @@
 // This code was auto-generated, is not intended to be edited, and is subject to
 // significant change. Please see the README file for more information.
 library engine.sdk.io;
-import 'dart:io';
 import 'java_core.dart';
 import 'java_io.dart';
-import 'java_engine.dart';
 import 'java_engine_io.dart';
 import 'source_io.dart';
 import 'error.dart';
@@ -115,6 +113,16 @@
   static String _LIBRARIES_FILE = "libraries.dart";
 
   /**
+   * The name of the pub executable on windows.
+   */
+  static String _PUB_EXECUTABLE_NAME_WIN = "pub.bat";
+
+  /**
+   * The name of the pub executable on non-windows operating systems.
+   */
+  static String _PUB_EXECUTABLE_NAME = "pub";
+
+  /**
    * The name of the file within the SDK directory that contains the revision number of the SDK.
    */
   static String _REVISION_FILE_NAME = "revision";
@@ -253,6 +261,17 @@
    * @return the directory that contains the libraries
    */
   JavaFile get libraryDirectory => new JavaFile.relative(_sdkDirectory, _LIB_DIRECTORY_NAME);
+
+  /**
+   * Return the file containing the Pub executable, or `null` if it does not exist.
+   *
+   * @return the file containing the Pub executable
+   */
+  JavaFile get pubExecutable {
+    String pubBinaryName = OSUtilities.isWindows() ? _PUB_EXECUTABLE_NAME_WIN : _PUB_EXECUTABLE_NAME;
+    JavaFile file = new JavaFile.relative(new JavaFile.relative(_sdkDirectory, _BIN_DIRECTORY_NAME), pubBinaryName);
+    return file.exists() ? file : null;
+  }
   List<SdkLibrary> get sdkLibraries => _libraryMap.sdkLibraries;
   SdkLibrary getSdkLibrary(String dartUri) => _libraryMap.getLibrary(dartUri);
 
@@ -294,7 +313,7 @@
   JavaFile get vmExecutable {
     {
       if (_vmExecutable == null) {
-        JavaFile file = new JavaFile.relative(new JavaFile.relative(_sdkDirectory, _BIN_DIRECTORY_NAME), binaryName);
+        JavaFile file = new JavaFile.relative(new JavaFile.relative(_sdkDirectory, _BIN_DIRECTORY_NAME), vmBinaryName);
         if (file.exists()) {
           _vmExecutable = file;
         }
@@ -332,19 +351,6 @@
   }
 
   /**
-   * Return the name of the file containing the VM executable.
-   *
-   * @return the name of the file containing the VM executable
-   */
-  String get binaryName {
-    if (OSUtilities.isWindows()) {
-      return _VM_EXECUTABLE_NAME_WIN;
-    } else {
-      return _VM_EXECUTABLE_NAME;
-    }
-  }
-
-  /**
    * Return the name of the file containing the Dartium executable.
    *
    * @return the name of the file containing the Dartium executable
@@ -360,6 +366,19 @@
   }
 
   /**
+   * Return the name of the file containing the VM executable.
+   *
+   * @return the name of the file containing the VM executable
+   */
+  String get vmBinaryName {
+    if (OSUtilities.isWindows()) {
+      return _VM_EXECUTABLE_NAME_WIN;
+    } else {
+      return _VM_EXECUTABLE_NAME;
+    }
+  }
+
+  /**
    * Read all of the configuration files to initialize the library maps.
    */
   void initializeLibraryMap() {
diff --git a/pkg/analyzer_experimental/lib/src/generated/source.dart b/pkg/analyzer_experimental/lib/src/generated/source.dart
index cf901a3..128cf1f 100644
--- a/pkg/analyzer_experimental/lib/src/generated/source.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/source.dart
@@ -135,7 +135,7 @@
    * @return the source representing the contained URI
    */
   Source resolveUri(Source containingSource, String containedUri) {
-    if (containedUri == null) {
+    if (containedUri == null || containedUri.isEmpty) {
       return null;
     }
     try {
@@ -422,7 +422,7 @@
  *
  * @coverage dart.engine.source
  */
-class SourceKind implements Enum<SourceKind> {
+class SourceKind extends Enum<SourceKind> {
 
   /**
    * A source containing HTML. The HTML might or might not contain Dart scripts.
@@ -447,16 +447,7 @@
    */
   static final SourceKind UNKNOWN = new SourceKind('UNKNOWN', 3);
   static final List<SourceKind> values = [HTML, LIBRARY, PART, UNKNOWN];
-
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-  SourceKind(this.name, this.ordinal);
-  int compareTo(SourceKind other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
+  SourceKind(String name, int ordinal) : super(name, ordinal);
 }
 /**
  * The enumeration `UriKind` defines the different kinds of URI's that are known to the
@@ -464,7 +455,7 @@
  *
  * @coverage dart.engine.source
  */
-class UriKind implements Enum<UriKind> {
+class UriKind extends Enum<UriKind> {
 
   /**
    * A 'dart:' URI.
@@ -482,12 +473,6 @@
   static final UriKind PACKAGE_URI = new UriKind('PACKAGE_URI', 2, 0x70);
   static final List<UriKind> values = [DART_URI, FILE_URI, PACKAGE_URI];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
    * The single character encoding used to identify this kind of URI.
    */
@@ -498,7 +483,7 @@
    *
    * @param encoding the single character encoding used to identify this kind of URI.
    */
-  UriKind(this.name, this.ordinal, int encoding) {
+  UriKind(String name, int ordinal, int encoding) : super(name, ordinal) {
     this._encoding = encoding;
   }
 
@@ -529,9 +514,6 @@
    * @return the single character encoding used to identify this kind of URI
    */
   int get encoding => _encoding;
-  int compareTo(UriKind other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
 /**
  * A source range defines an [Element]'s source coordinates relative to its [Source].
diff --git a/pkg/analyzer_experimental/lib/src/generated/source_io.dart b/pkg/analyzer_experimental/lib/src/generated/source_io.dart
index 23f6c1b..fd374b5 100644
--- a/pkg/analyzer_experimental/lib/src/generated/source_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/source_io.dart
@@ -2,10 +2,8 @@
 // significant change. Please see the README file for more information.
 library engine.source.io;
 import 'source.dart';
-import 'dart:io';
 import 'java_core.dart';
 import 'java_io.dart';
-import 'sdk.dart' show DartSdk;
 import 'engine.dart' show AnalysisContext, AnalysisEngine;
 export 'source.dart';
 /**
diff --git a/pkg/analyzer_experimental/lib/src/generated/utilities_collection.dart b/pkg/analyzer_experimental/lib/src/generated/utilities_collection.dart
index 9e33a1a..4dd72cb 100644
--- a/pkg/analyzer_experimental/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/utilities_collection.dart
@@ -16,7 +16,7 @@
    * @return the value of the element at the given index
    * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
    */
-  static bool get(int array, Enum<Object> index) => get2(array, index.ordinal);
+  static bool get(int array, Enum index) => get2(array, index.ordinal);
 
   /**
    * Return the value of the element at the given index.
@@ -40,7 +40,7 @@
    * @return the updated value of the array
    * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
    */
-  static int set(int array, Enum<Object> index, bool value) => set2(array, index.ordinal, value);
+  static int set(int array, Enum index, bool value) => set2(array, index.ordinal, value);
 
   /**
    * Set the value of the element at the given index to the given value.
diff --git a/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart b/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
index c7879f6..726e294 100644
--- a/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
@@ -9,18 +9,12 @@
  *
  * @coverage dart.engine.utilities
  */
-class ParameterKind implements Enum<ParameterKind> {
+class ParameterKind extends Enum<ParameterKind> {
   static final ParameterKind REQUIRED = new ParameterKind('REQUIRED', 0, false);
   static final ParameterKind POSITIONAL = new ParameterKind('POSITIONAL', 1, true);
   static final ParameterKind NAMED = new ParameterKind('NAMED', 2, true);
   static final List<ParameterKind> values = [REQUIRED, POSITIONAL, NAMED];
 
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-
   /**
    * A flag indicating whether this is an optional parameter.
    */
@@ -31,7 +25,7 @@
    *
    * @param isOptional `true` if this is an optional parameter
    */
-  ParameterKind(this.name, this.ordinal, bool isOptional) {
+  ParameterKind(String name, int ordinal, bool isOptional) : super(name, ordinal) {
     this._isOptional2 = isOptional;
   }
 
@@ -41,7 +35,4 @@
    * @return `true` if this is an optional parameter
    */
   bool get isOptional => _isOptional2;
-  int compareTo(ParameterKind other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
 }
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/services/formatter.dart b/pkg/analyzer_experimental/lib/src/services/formatter.dart
index 51141dd..1ea1b36 100644
--- a/pkg/analyzer_experimental/lib/src/services/formatter.dart
+++ b/pkg/analyzer_experimental/lib/src/services/formatter.dart
@@ -4,7 +4,7 @@
 
 library formatter;
 
-import 'package:analyzer_experimental/src/services/formatter_impl.dart';
+//import 'package:analyzer_experimental/src/services/formatter_impl.dart';
 
 //export 'package:analyzer_experimental/src/services/formatter_impl.dart'
 //  show CodeFormatter;
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/services/formatter_impl.dart b/pkg/analyzer_experimental/lib/src/services/formatter_impl.dart
index 4a17d67..ce7da334 100644
--- a/pkg/analyzer_experimental/lib/src/services/formatter_impl.dart
+++ b/pkg/analyzer_experimental/lib/src/services/formatter_impl.dart
@@ -452,7 +452,7 @@
   }
 
   visitFieldDeclaration(FieldDeclaration node) {
-    modifier(node.keyword);
+    modifier(node.staticKeyword);
     visit(node.fields);
     token(node.semicolon);
   }
@@ -671,7 +671,7 @@
   }
 
   visitListLiteral(ListLiteral node) {
-    modifier(node.modifier);
+    modifier(node.constKeyword);
     visit(node.typeArguments);
     token(node.leftBracket);
     visitNodes(node.elements, separatedBy: commaSeperator);
@@ -679,7 +679,7 @@
   }
 
   visitMapLiteral(MapLiteral node) {
-    modifier(node.modifier);
+    modifier(node.constKeyword);
     visitNode(node.typeArguments, followedBy: space);
     token(node.leftBracket);
     visitNodes(node.entries, separatedBy: commaSeperator);
@@ -906,7 +906,7 @@
     visit(node.body);
     visitNodes(node.catchClauses, precededBy: space, separatedBy: space);
     token(node.finallyKeyword, precededBy: space, followedBy: space);
-    visit(node.finallyClause);
+    visit(node.finallyBlock);
   }
 
   visitTypeArgumentList(TypeArgumentList node) {
diff --git a/pkg/analyzer_experimental/lib/src/string_source.dart b/pkg/analyzer_experimental/lib/src/string_source.dart
index b473365..ab21809 100644
--- a/pkg/analyzer_experimental/lib/src/string_source.dart
+++ b/pkg/analyzer_experimental/lib/src/string_source.dart
@@ -15,26 +15,31 @@
   StringSource(this._contents, this.fullName)
       : modificationStamp = new DateTime.now().millisecondsSinceEpoch;
 
-  bool operator==(Object object) => object is StringSource &&
-      object._contents == _contents && object._name == _name;
+  bool operator==(Object object) {
+    if (object is StringSource) {
+      StringSource ssObject = object;
+      return ssObject._contents == _contents && ssObject.fullName == fullName;
+    }
+    return false;
+  }
 
   bool exists() => true;
 
   void getContents(Source_ContentReceiver receiver) =>
       receiver.accept2(_contents, modificationStamp);
 
-  String get encoding => throw UnsupportedError("StringSource doesn't support "
+  String get encoding => throw new UnsupportedError("StringSource doesn't support "
       "encoding.");
 
   String get shortName => fullName;
 
-  String get uriKind => throw UnsupportedError("StringSource doesn't support "
+  UriKind get uriKind => throw new UnsupportedError("StringSource doesn't support "
       "uriKind.");
 
-  int get hashCode => _contents.hashCode ^ _name.hashCode;
+  int get hashCode => _contents.hashCode ^ fullName.hashCode;
 
   bool get isInSystemLibrary => false;
 
-  Source resolveRelative(Uri relativeUri) => throw UnsupportedError(
+  Source resolveRelative(Uri relativeUri) => throw new UnsupportedError(
       "StringSource doesn't support resolveRelative.");
 }
diff --git a/pkg/analyzer_experimental/test/generated/ast_test.dart b/pkg/analyzer_experimental/test/generated/ast_test.dart
index a839e84..06dcee9 100644
--- a/pkg/analyzer_experimental/test/generated/ast_test.dart
+++ b/pkg/analyzer_experimental/test/generated/ast_test.dart
@@ -1,12 +1,8 @@
 // This code was auto-generated, is not intended to be edited, and is subject to
 // significant change. Please see the README file for more information.
 library engine.ast_test;
-import 'dart:collection';
 import 'package:analyzer_experimental/src/generated/java_core.dart';
-import 'package:analyzer_experimental/src/generated/java_engine.dart';
 import 'package:analyzer_experimental/src/generated/java_junit.dart';
-import 'package:analyzer_experimental/src/generated/source.dart';
-import 'package:analyzer_experimental/src/generated/error.dart';
 import 'package:analyzer_experimental/src/generated/scanner.dart';
 import 'package:analyzer_experimental/src/generated/ast.dart';
 import 'package:analyzer_experimental/src/generated/utilities_dart.dart';
@@ -427,11 +423,11 @@
    * @param element the element defining the type represented by the type name
    * @return the type name that was created
    */
-  static TypeName typeName(ClassElement element2, List<TypeName> arguments) {
-    SimpleIdentifier name = identifier3(element2.name);
-    name.element = element2;
+  static TypeName typeName(ClassElement element, List<TypeName> arguments) {
+    SimpleIdentifier name = identifier3(element.name);
+    name.staticElement = element;
     TypeName typeName = typeName3(name, arguments);
-    typeName.type = element2.type;
+    typeName.type = element.type;
     return typeName;
   }
   static TypeName typeName3(Identifier name, List<TypeName> arguments) {
@@ -717,7 +713,7 @@
     });
   }
 }
-class AssignmentKind implements Enum<AssignmentKind> {
+class AssignmentKind extends Enum<AssignmentKind> {
   static final AssignmentKind BINARY = new AssignmentKind('BINARY', 0);
   static final AssignmentKind COMPOUND_LEFT = new AssignmentKind('COMPOUND_LEFT', 1);
   static final AssignmentKind COMPOUND_RIGHT = new AssignmentKind('COMPOUND_RIGHT', 2);
@@ -739,18 +735,9 @@
       SIMPLE_LEFT,
       SIMPLE_RIGHT,
       NONE];
-
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-  AssignmentKind(this.name, this.ordinal);
-  int compareTo(AssignmentKind other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
+  AssignmentKind(String name, int ordinal) : super(name, ordinal);
 }
-class WrapperKind implements Enum<WrapperKind> {
+class WrapperKind extends Enum<WrapperKind> {
   static final WrapperKind PREFIXED_LEFT = new WrapperKind('PREFIXED_LEFT', 0);
   static final WrapperKind PREFIXED_RIGHT = new WrapperKind('PREFIXED_RIGHT', 1);
   static final WrapperKind PROPERTY_LEFT = new WrapperKind('PROPERTY_LEFT', 2);
@@ -762,16 +749,7 @@
       PROPERTY_LEFT,
       PROPERTY_RIGHT,
       NONE];
-
-  /// The name of this enum constant, as declared in the enum declaration.
-  final String name;
-
-  /// The position in the enum declaration.
-  final int ordinal;
-  WrapperKind(this.name, this.ordinal);
-  int compareTo(WrapperKind other) => ordinal - other.ordinal;
-  int get hashCode => ordinal;
-  String toString() => name;
+  WrapperKind(String name, int ordinal) : super(name, ordinal);
 }
 class BreadthFirstVisitorTest extends ParserTestCase {
   void testIt() {
@@ -854,27 +832,27 @@
   void test_binary_bitAnd() {
     Object value = getConstantValue("74 & 42");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(74 & 42, ((value as int)));
+    JUnitTestCase.assertEquals(74 & 42, value as int);
   }
   void test_binary_bitOr() {
     Object value = getConstantValue("74 | 42");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(74 | 42, ((value as int)));
+    JUnitTestCase.assertEquals(74 | 42, value as int);
   }
   void test_binary_bitXor() {
     Object value = getConstantValue("74 ^ 42");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(74 ^ 42, ((value as int)));
+    JUnitTestCase.assertEquals(74 ^ 42, value as int);
   }
   void test_binary_divide_double() {
     Object value = getConstantValue("3.2 / 2.3");
     EngineTestCase.assertInstanceOf(double, value);
-    JUnitTestCase.assertEquals(3.2 / 2.3, ((value as double)));
+    JUnitTestCase.assertEquals(3.2 / 2.3, value as double);
   }
   void test_binary_divide_integer() {
     Object value = getConstantValue("3 / 2");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(1, ((value as int)));
+    JUnitTestCase.assertEquals(1, value as int);
   }
   void test_binary_equal_boolean() {
     Object value = getConstantValue("true == false");
@@ -907,7 +885,7 @@
   void test_binary_leftShift() {
     Object value = getConstantValue("16 << 2");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(64, ((value as int)));
+    JUnitTestCase.assertEquals(64, value as int);
   }
   void test_binary_lessThan() {
     Object value = getConstantValue("2 < 3");
@@ -928,12 +906,12 @@
   void test_binary_minus_double() {
     Object value = getConstantValue("3.2 - 2.3");
     EngineTestCase.assertInstanceOf(double, value);
-    JUnitTestCase.assertEquals(3.2 - 2.3, ((value as double)));
+    JUnitTestCase.assertEquals(3.2 - 2.3, value as double);
   }
   void test_binary_minus_integer() {
     Object value = getConstantValue("3 - 2");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(1, ((value as int)));
+    JUnitTestCase.assertEquals(1, value as int);
   }
   void test_binary_notEqual_boolean() {
     Object value = getConstantValue("true != false");
@@ -958,47 +936,47 @@
   void test_binary_plus_double() {
     Object value = getConstantValue("2.3 + 3.2");
     EngineTestCase.assertInstanceOf(double, value);
-    JUnitTestCase.assertEquals(2.3 + 3.2, ((value as double)));
+    JUnitTestCase.assertEquals(2.3 + 3.2, value as double);
   }
   void test_binary_plus_integer() {
     Object value = getConstantValue("2 + 3");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(5, ((value as int)));
+    JUnitTestCase.assertEquals(5, value as int);
   }
   void test_binary_remainder_double() {
     Object value = getConstantValue("3.2 % 2.3");
     EngineTestCase.assertInstanceOf(double, value);
-    JUnitTestCase.assertEquals(3.2 % 2.3, ((value as double)));
+    JUnitTestCase.assertEquals(3.2 % 2.3, value as double);
   }
   void test_binary_remainder_integer() {
     Object value = getConstantValue("8 % 3");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(2, ((value as int)));
+    JUnitTestCase.assertEquals(2, value as int);
   }
   void test_binary_rightShift() {
     Object value = getConstantValue("64 >> 2");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(16, ((value as int)));
+    JUnitTestCase.assertEquals(16, value as int);
   }
   void test_binary_times_double() {
     Object value = getConstantValue("2.3 * 3.2");
     EngineTestCase.assertInstanceOf(double, value);
-    JUnitTestCase.assertEquals(2.3 * 3.2, ((value as double)));
+    JUnitTestCase.assertEquals(2.3 * 3.2, value as double);
   }
   void test_binary_times_integer() {
     Object value = getConstantValue("2 * 3");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(6, ((value as int)));
+    JUnitTestCase.assertEquals(6, value as int);
   }
   void test_binary_truncatingDivide_double() {
     Object value = getConstantValue("3.2 ~/ 2.3");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(1, ((value as int)));
+    JUnitTestCase.assertEquals(1, value as int);
   }
   void test_binary_truncatingDivide_integer() {
     Object value = getConstantValue("10 ~/ 3");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(3, ((value as int)));
+    JUnitTestCase.assertEquals(3, value as int);
   }
   void test_literal_boolean_false() {
     Object value = getConstantValue("false");
@@ -1011,7 +989,7 @@
   void test_literal_list() {
     Object value = getConstantValue("['a', 'b', 'c']");
     EngineTestCase.assertInstanceOf(List, value);
-    List<Object> list = value as List<Object>;
+    List list = value as List;
     JUnitTestCase.assertEquals(3, list.length);
     JUnitTestCase.assertEquals("a", list[0]);
     JUnitTestCase.assertEquals("b", list[1]);
@@ -1020,7 +998,7 @@
   void test_literal_map() {
     Object value = getConstantValue("{'a' : 'm', 'b' : 'n', 'c' : 'o'}");
     EngineTestCase.assertInstanceOf(Map, value);
-    Map<Object, Object> map = value as Map<Object, Object>;
+    Map map = value as Map;
     JUnitTestCase.assertEquals(3, map.length);
     JUnitTestCase.assertEquals("m", map["a"]);
     JUnitTestCase.assertEquals("n", map["b"]);
@@ -1033,12 +1011,12 @@
   void test_literal_number_double() {
     Object value = getConstantValue("3.45");
     EngineTestCase.assertInstanceOf(double, value);
-    JUnitTestCase.assertEquals(3.45, ((value as double)));
+    JUnitTestCase.assertEquals(3.45, value as double);
   }
   void test_literal_number_integer() {
     Object value = getConstantValue("42");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(42, ((value as int)));
+    JUnitTestCase.assertEquals(42, value as int);
   }
   void test_literal_string_adjacent() {
     Object value = getConstantValue("'abc' 'def'");
@@ -1063,7 +1041,7 @@
   void test_unary_bitNot() {
     Object value = getConstantValue("~42");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(~42, ((value as int)));
+    JUnitTestCase.assertEquals(~42, value as int);
   }
   void test_unary_logicalNot() {
     Object value = getConstantValue("!true");
@@ -1072,12 +1050,12 @@
   void test_unary_negated_double() {
     Object value = getConstantValue("-42.3");
     EngineTestCase.assertInstanceOf(double, value);
-    JUnitTestCase.assertEquals(-42.3, ((value as double)));
+    JUnitTestCase.assertEquals(-42.3, value as double);
   }
   void test_unary_negated_integer() {
     Object value = getConstantValue("-42");
     EngineTestCase.assertInstanceOf(int, value);
-    JUnitTestCase.assertEquals(-42, ((value as int)));
+    JUnitTestCase.assertEquals(-42, value as int);
   }
   Object getConstantValue(String source) => ParserTestCase.parseExpression(source, []).accept(new ConstantEvaluator());
   static dartSuite() {
@@ -1648,10 +1626,10 @@
         ASTFactory.positionalFormalParameter(ASTFactory.simpleFormalParameter3("d"), ASTFactory.integer(4))]));
   }
   void test_visitForStatement_c() {
-    assertSource("for (; c;) {}", ASTFactory.forStatement((null as Expression), ASTFactory.identifier3("c"), null, ASTFactory.block([])));
+    assertSource("for (; c;) {}", ASTFactory.forStatement(null as Expression, ASTFactory.identifier3("c"), null, ASTFactory.block([])));
   }
   void test_visitForStatement_cu() {
-    assertSource("for (; c; u) {}", ASTFactory.forStatement((null as Expression), ASTFactory.identifier3("c"), ASTFactory.list([(ASTFactory.identifier3("u") as Expression)]), ASTFactory.block([])));
+    assertSource("for (; c; u) {}", ASTFactory.forStatement(null as Expression, ASTFactory.identifier3("c"), ASTFactory.list([(ASTFactory.identifier3("u") as Expression)]), ASTFactory.block([])));
   }
   void test_visitForStatement_e() {
     assertSource("for (e;;) {}", ASTFactory.forStatement(ASTFactory.identifier3("e"), null, null, ASTFactory.block([])));
@@ -1678,7 +1656,7 @@
     assertSource("for (var i;; u) {}", ASTFactory.forStatement2(ASTFactory.variableDeclarationList2(Keyword.VAR, [ASTFactory.variableDeclaration("i")]), null, ASTFactory.list([(ASTFactory.identifier3("u") as Expression)]), ASTFactory.block([])));
   }
   void test_visitForStatement_u() {
-    assertSource("for (;; u) {}", ASTFactory.forStatement((null as Expression), null, ASTFactory.list([(ASTFactory.identifier3("u") as Expression)]), ASTFactory.block([])));
+    assertSource("for (;; u) {}", ASTFactory.forStatement(null as Expression, null, ASTFactory.list([(ASTFactory.identifier3("u") as Expression)]), ASTFactory.block([])));
   }
   void test_visitFunctionDeclaration_getter() {
     assertSource("get f() {}", ASTFactory.functionDeclaration(null, Keyword.GET, "f", ASTFactory.functionExpression()));
diff --git a/pkg/analyzer_experimental/test/generated/element_test.dart b/pkg/analyzer_experimental/test/generated/element_test.dart
index c5d24f1..3619510 100644
--- a/pkg/analyzer_experimental/test/generated/element_test.dart
+++ b/pkg/analyzer_experimental/test/generated/element_test.dart
@@ -1,22 +1,16 @@
 // This code was auto-generated, is not intended to be edited, and is subject to
 // significant change. Please see the README file for more information.
 library engine.element_test;
-import 'dart:collection';
-import 'dart:io';
 import 'package:analyzer_experimental/src/generated/java_core.dart';
-import 'package:analyzer_experimental/src/generated/java_engine.dart';
 import 'package:analyzer_experimental/src/generated/java_engine_io.dart';
 import 'package:analyzer_experimental/src/generated/java_junit.dart';
 import 'package:analyzer_experimental/src/generated/source_io.dart';
-import 'package:analyzer_experimental/src/generated/error.dart';
-import 'package:analyzer_experimental/src/generated/scanner.dart';
 import 'package:analyzer_experimental/src/generated/utilities_dart.dart';
 import 'package:analyzer_experimental/src/generated/ast.dart';
 import 'package:analyzer_experimental/src/generated/element.dart';
 import 'package:analyzer_experimental/src/generated/engine.dart' show AnalysisContext, AnalysisContextImpl;
 import 'package:unittest/unittest.dart' as _ut;
 import 'test_support.dart';
-import 'scanner_test.dart' show TokenFactory;
 import 'ast_test.dart' show ASTFactory;
 import 'resolver_test.dart' show TestTypeProvider;
 class ElementLocationImplTest extends EngineTestCase {
@@ -1619,6 +1613,16 @@
   }
 }
 class TypeVariableTypeImplTest extends EngineTestCase {
+  void fail_isMoreSpecificThan_typeArguments_object() {
+    TypeVariableElementImpl element = new TypeVariableElementImpl(ASTFactory.identifier3("E"));
+    TypeVariableTypeImpl type = new TypeVariableTypeImpl(element);
+    JUnitTestCase.assertTrue(type.isMoreSpecificThan(ElementFactory.object.type));
+  }
+  void fail_isMoreSpecificThan_typeArguments_self() {
+    TypeVariableElementImpl element = new TypeVariableElementImpl(ASTFactory.identifier3("E"));
+    TypeVariableTypeImpl type = new TypeVariableTypeImpl(element);
+    JUnitTestCase.assertTrue(type.isMoreSpecificThan(type));
+  }
   void test_creation() {
     JUnitTestCase.assertNotNull(new TypeVariableTypeImpl(new TypeVariableElementImpl(ASTFactory.identifier3("E"))));
   }
@@ -1627,6 +1631,13 @@
     TypeVariableTypeImpl type = new TypeVariableTypeImpl(element);
     JUnitTestCase.assertEquals(element, type.element);
   }
+  void test_isMoreSpecificThan_typeArguments_upperBound() {
+    ClassElementImpl classS = ElementFactory.classElement2("A", []);
+    TypeVariableElementImpl typeVarT = new TypeVariableElementImpl(ASTFactory.identifier3("T"));
+    typeVarT.bound = classS.type;
+    TypeVariableTypeImpl typeVarTypeT = new TypeVariableTypeImpl(typeVarT);
+    JUnitTestCase.assertTrue(typeVarTypeT.isMoreSpecificThan(classS.type));
+  }
   void test_substitute_equal() {
     TypeVariableElementImpl element = new TypeVariableElementImpl(ASTFactory.identifier3("E"));
     TypeVariableTypeImpl type = new TypeVariableTypeImpl(element);
@@ -1650,6 +1661,10 @@
         final __test = new TypeVariableTypeImplTest();
         runJUnitTest(__test, __test.test_getElement);
       });
+      _ut.test('test_isMoreSpecificThan_typeArguments_upperBound', () {
+        final __test = new TypeVariableTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_typeArguments_upperBound);
+      });
       _ut.test('test_substitute_equal', () {
         final __test = new TypeVariableTypeImplTest();
         runJUnitTest(__test, __test.test_substitute_equal);
@@ -1803,7 +1818,7 @@
   static FunctionElementImpl functionElement7(String functionName, List<ClassElement> normalParameters, List<String> names, List<ClassElement> namedParameters) => functionElement4(functionName, null, normalParameters, names, namedParameters);
   static ClassElementImpl get object {
     if (_objectElement == null) {
-      _objectElement = classElement("Object", (null as InterfaceType), []);
+      _objectElement = classElement("Object", null as InterfaceType, []);
     }
     return _objectElement;
   }
@@ -2353,9 +2368,18 @@
     type.hashCode;
   }
   void test_hashCode_noElement() {
-    FunctionTypeImpl type = new FunctionTypeImpl.con1((null as ExecutableElement));
+    FunctionTypeImpl type = new FunctionTypeImpl.con1(null as ExecutableElement);
     type.hashCode;
   }
+  void test_isAssignableTo_normalAndPositionalArgs() {
+    ClassElement a = ElementFactory.classElement2("A", []);
+    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [a]).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+    JUnitTestCase.assertTrue(t.isAssignableTo(s));
+    JUnitTestCase.assertFalse(s.isAssignableTo(t));
+  }
   void test_isSubtypeOf_baseCase_classFunction() {
     ClassElementImpl functionElement = ElementFactory.classElement2("Function", []);
     InterfaceTypeImpl functionType = new InterfaceTypeImpl_21(functionElement);
@@ -2679,6 +2703,10 @@
         final __test = new FunctionTypeImplTest();
         runJUnitTest(__test, __test.test_hashCode_noElement);
       });
+      _ut.test('test_isAssignableTo_normalAndPositionalArgs', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isAssignableTo_normalAndPositionalArgs);
+      });
       _ut.test('test_isSubtypeOf_Object', () {
         final __test = new FunctionTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_Object);
diff --git a/pkg/analyzer_experimental/test/generated/parser_test.dart b/pkg/analyzer_experimental/test/generated/parser_test.dart
index 077e787..c4b11b8 100644
--- a/pkg/analyzer_experimental/test/generated/parser_test.dart
+++ b/pkg/analyzer_experimental/test/generated/parser_test.dart
@@ -1,11 +1,8 @@
 // This code was auto-generated, is not intended to be edited, and is subject to
 // significant change. Please see the README file for more information.
 library engine.parser_test;
-import 'dart:collection';
 import 'package:analyzer_experimental/src/generated/java_core.dart';
-import 'package:analyzer_experimental/src/generated/java_engine.dart';
 import 'package:analyzer_experimental/src/generated/java_junit.dart';
-import 'package:analyzer_experimental/src/generated/source.dart';
 import 'package:analyzer_experimental/src/generated/error.dart';
 import 'package:analyzer_experimental/src/generated/scanner.dart';
 import 'package:analyzer_experimental/src/generated/ast.dart';
@@ -676,7 +673,7 @@
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "p.A f;");
     JUnitTestCase.assertNull(field.documentationComment);
     EngineTestCase.assertSize(0, field.metadata);
-    JUnitTestCase.assertNull(field.keyword);
+    JUnitTestCase.assertNull(field.staticKeyword);
     VariableDeclarationList list = field.fields;
     JUnitTestCase.assertNotNull(list);
     NodeList<VariableDeclaration> variables = list.variables;
@@ -688,7 +685,7 @@
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var get;");
     JUnitTestCase.assertNull(field.documentationComment);
     EngineTestCase.assertSize(0, field.metadata);
-    JUnitTestCase.assertNull(field.keyword);
+    JUnitTestCase.assertNull(field.staticKeyword);
     VariableDeclarationList list = field.fields;
     JUnitTestCase.assertNotNull(list);
     NodeList<VariableDeclaration> variables = list.variables;
@@ -700,7 +697,7 @@
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var operator;");
     JUnitTestCase.assertNull(field.documentationComment);
     EngineTestCase.assertSize(0, field.metadata);
-    JUnitTestCase.assertNull(field.keyword);
+    JUnitTestCase.assertNull(field.staticKeyword);
     VariableDeclarationList list = field.fields;
     JUnitTestCase.assertNotNull(list);
     NodeList<VariableDeclaration> variables = list.variables;
@@ -712,7 +709,7 @@
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var set;");
     JUnitTestCase.assertNull(field.documentationComment);
     EngineTestCase.assertSize(0, field.metadata);
-    JUnitTestCase.assertNull(field.keyword);
+    JUnitTestCase.assertNull(field.staticKeyword);
     VariableDeclarationList list = field.fields;
     JUnitTestCase.assertNotNull(list);
     NodeList<VariableDeclaration> variables = list.variables;
@@ -1424,7 +1421,7 @@
   }
   void test_parseConstExpression_listLiteral_typed() {
     ListLiteral literal = ParserTestCase.parse5("parseConstExpression", "const <A> []", []);
-    JUnitTestCase.assertNotNull(literal.modifier);
+    JUnitTestCase.assertNotNull(literal.constKeyword);
     JUnitTestCase.assertNotNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
     EngineTestCase.assertSize(0, literal.elements);
@@ -1432,7 +1429,7 @@
   }
   void test_parseConstExpression_listLiteral_untyped() {
     ListLiteral literal = ParserTestCase.parse5("parseConstExpression", "const []", []);
-    JUnitTestCase.assertNotNull(literal.modifier);
+    JUnitTestCase.assertNotNull(literal.constKeyword);
     JUnitTestCase.assertNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
     EngineTestCase.assertSize(0, literal.elements);
@@ -2346,7 +2343,7 @@
     JUnitTestCase.assertNull(fields.keyword);
     JUnitTestCase.assertEquals(type, fields.type);
     EngineTestCase.assertSize(3, fields.variables);
-    JUnitTestCase.assertEquals(staticKeyword, declaration.keyword);
+    JUnitTestCase.assertEquals(staticKeyword, declaration.staticKeyword);
     JUnitTestCase.assertNotNull(declaration.semicolon);
   }
   void test_parseInitializedIdentifierList_var() {
@@ -2364,7 +2361,7 @@
     JUnitTestCase.assertEquals(varKeyword, fields.keyword);
     JUnitTestCase.assertNull(fields.type);
     EngineTestCase.assertSize(3, fields.variables);
-    JUnitTestCase.assertEquals(staticKeyword, declaration.keyword);
+    JUnitTestCase.assertEquals(staticKeyword, declaration.staticKeyword);
     JUnitTestCase.assertNotNull(declaration.semicolon);
   }
   void test_parseInstanceCreationExpression_qualifiedType() {
@@ -2431,7 +2428,7 @@
     Token token = TokenFactory.token(Keyword.CONST);
     TypeArgumentList typeArguments = null;
     ListLiteral literal = ParserTestCase.parse("parseListLiteral", <Object> [token, typeArguments], "[]");
-    JUnitTestCase.assertEquals(token, literal.modifier);
+    JUnitTestCase.assertEquals(token, literal.constKeyword);
     JUnitTestCase.assertEquals(typeArguments, literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
     EngineTestCase.assertSize(0, literal.elements);
@@ -2441,7 +2438,7 @@
     Token token = TokenFactory.token(Keyword.CONST);
     TypeArgumentList typeArguments = null;
     ListLiteral literal = ParserTestCase.parse("parseListLiteral", <Object> [token, typeArguments], "[ ]");
-    JUnitTestCase.assertEquals(token, literal.modifier);
+    JUnitTestCase.assertEquals(token, literal.constKeyword);
     JUnitTestCase.assertEquals(typeArguments, literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
     EngineTestCase.assertSize(0, literal.elements);
@@ -2449,7 +2446,7 @@
   }
   void test_parseListLiteral_multiple() {
     ListLiteral literal = ParserTestCase.parse("parseListLiteral", <Object> [null, null], "[1, 2, 3]");
-    JUnitTestCase.assertNull(literal.modifier);
+    JUnitTestCase.assertNull(literal.constKeyword);
     JUnitTestCase.assertNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
     EngineTestCase.assertSize(3, literal.elements);
@@ -2457,7 +2454,7 @@
   }
   void test_parseListLiteral_single() {
     ListLiteral literal = ParserTestCase.parse("parseListLiteral", <Object> [null, null], "[1]");
-    JUnitTestCase.assertNull(literal.modifier);
+    JUnitTestCase.assertNull(literal.constKeyword);
     JUnitTestCase.assertNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
     EngineTestCase.assertSize(1, literal.elements);
@@ -2465,7 +2462,7 @@
   }
   void test_parseListOrMapLiteral_list_noType() {
     ListLiteral literal = ParserTestCase.parse("parseListOrMapLiteral", <Object> [null], "[1]");
-    JUnitTestCase.assertNull(literal.modifier);
+    JUnitTestCase.assertNull(literal.constKeyword);
     JUnitTestCase.assertNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
     EngineTestCase.assertSize(1, literal.elements);
@@ -2473,7 +2470,7 @@
   }
   void test_parseListOrMapLiteral_list_type() {
     ListLiteral literal = ParserTestCase.parse("parseListOrMapLiteral", <Object> [null], "<int> [1]");
-    JUnitTestCase.assertNull(literal.modifier);
+    JUnitTestCase.assertNull(literal.constKeyword);
     JUnitTestCase.assertNotNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
     EngineTestCase.assertSize(1, literal.elements);
@@ -2481,7 +2478,7 @@
   }
   void test_parseListOrMapLiteral_map_noType() {
     MapLiteral literal = ParserTestCase.parse("parseListOrMapLiteral", <Object> [null], "{'1' : 1}");
-    JUnitTestCase.assertNull(literal.modifier);
+    JUnitTestCase.assertNull(literal.constKeyword);
     JUnitTestCase.assertNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
     EngineTestCase.assertSize(1, literal.entries);
@@ -2489,7 +2486,7 @@
   }
   void test_parseListOrMapLiteral_map_type() {
     MapLiteral literal = ParserTestCase.parse("parseListOrMapLiteral", <Object> [null], "<String, int> {'1' : 1}");
-    JUnitTestCase.assertNull(literal.modifier);
+    JUnitTestCase.assertNull(literal.constKeyword);
     JUnitTestCase.assertNotNull(literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
     EngineTestCase.assertSize(1, literal.entries);
@@ -2515,7 +2512,7 @@
         ASTFactory.typeName4("String", []),
         ASTFactory.typeName4("int", [])]);
     MapLiteral literal = ParserTestCase.parse("parseMapLiteral", <Object> [token, typeArguments], "{}");
-    JUnitTestCase.assertEquals(token, literal.modifier);
+    JUnitTestCase.assertEquals(token, literal.constKeyword);
     JUnitTestCase.assertEquals(typeArguments, literal.typeArguments);
     JUnitTestCase.assertNotNull(literal.leftBracket);
     EngineTestCase.assertSize(0, literal.entries);
@@ -3254,7 +3251,7 @@
     JUnitTestCase.assertNull(clause.stackTraceParameter);
     JUnitTestCase.assertNotNull(clause.body);
     JUnitTestCase.assertNull(statement.finallyKeyword);
-    JUnitTestCase.assertNull(statement.finallyClause);
+    JUnitTestCase.assertNull(statement.finallyBlock);
   }
   void test_parseTryStatement_catch_finally() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {} catch (e, s) {} finally {}", []);
@@ -3271,7 +3268,7 @@
     JUnitTestCase.assertNotNull(clause.stackTraceParameter);
     JUnitTestCase.assertNotNull(clause.body);
     JUnitTestCase.assertNotNull(statement.finallyKeyword);
-    JUnitTestCase.assertNotNull(statement.finallyClause);
+    JUnitTestCase.assertNotNull(statement.finallyBlock);
   }
   void test_parseTryStatement_finally() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {} finally {}", []);
@@ -3279,7 +3276,7 @@
     JUnitTestCase.assertNotNull(statement.body);
     EngineTestCase.assertSize(0, statement.catchClauses);
     JUnitTestCase.assertNotNull(statement.finallyKeyword);
-    JUnitTestCase.assertNotNull(statement.finallyClause);
+    JUnitTestCase.assertNotNull(statement.finallyBlock);
   }
   void test_parseTryStatement_multiple() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {} on NPE catch (e) {} on Error {} catch (e) {}", []);
@@ -3287,7 +3284,7 @@
     JUnitTestCase.assertNotNull(statement.body);
     EngineTestCase.assertSize(3, statement.catchClauses);
     JUnitTestCase.assertNull(statement.finallyKeyword);
-    JUnitTestCase.assertNull(statement.finallyClause);
+    JUnitTestCase.assertNull(statement.finallyBlock);
   }
   void test_parseTryStatement_on() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {} on Error {}", []);
@@ -3304,7 +3301,7 @@
     JUnitTestCase.assertNull(clause.stackTraceParameter);
     JUnitTestCase.assertNotNull(clause.body);
     JUnitTestCase.assertNull(statement.finallyKeyword);
-    JUnitTestCase.assertNull(statement.finallyClause);
+    JUnitTestCase.assertNull(statement.finallyBlock);
   }
   void test_parseTryStatement_on_catch() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {} on Error catch (e, s) {}", []);
@@ -3321,7 +3318,7 @@
     JUnitTestCase.assertNotNull(clause.stackTraceParameter);
     JUnitTestCase.assertNotNull(clause.body);
     JUnitTestCase.assertNull(statement.finallyKeyword);
-    JUnitTestCase.assertNull(statement.finallyClause);
+    JUnitTestCase.assertNull(statement.finallyBlock);
   }
   void test_parseTryStatement_on_catch_finally() {
     TryStatement statement = ParserTestCase.parse5("parseTryStatement", "try {} on Error catch (e, s) {} finally {}", []);
@@ -3338,7 +3335,7 @@
     JUnitTestCase.assertNotNull(clause.stackTraceParameter);
     JUnitTestCase.assertNotNull(clause.body);
     JUnitTestCase.assertNotNull(statement.finallyKeyword);
-    JUnitTestCase.assertNotNull(statement.finallyClause);
+    JUnitTestCase.assertNotNull(statement.finallyBlock);
   }
   void test_parseTypeAlias_class_implementsC() {
     ClassTypeAlias typeAlias = ParserTestCase.parse("parseTypeAlias", <Object> [emptyCommentAndMetadata()], "typedef A = Object with B implements C;");
@@ -9438,7 +9435,7 @@
   'peek_0': new MethodTrampoline(0, (Parser target) => target.peek()),
   'peek_1': new MethodTrampoline(1, (Parser target, arg0) => target.peek2(arg0)),
   'reportError_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.reportError(arg0, arg1, arg2)),
-  'reportError_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.reportError7(arg0, arg1)),
+  'reportError_2': new MethodTrampoline(2, (Parser target, arg0, arg1) => target.reportError8(arg0, arg1)),
   'skipFinalConstVarOrType_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipFinalConstVarOrType(arg0)),
   'skipFormalParameterList_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipFormalParameterList(arg0)),
   'skipPastMatchingToken_1': new MethodTrampoline(1, (Parser target, arg0) => target.skipPastMatchingToken(arg0)),
diff --git a/pkg/analyzer_experimental/test/generated/resolver_test.dart b/pkg/analyzer_experimental/test/generated/resolver_test.dart
index 99404c3..7cc689b 100644
--- a/pkg/analyzer_experimental/test/generated/resolver_test.dart
+++ b/pkg/analyzer_experimental/test/generated/resolver_test.dart
@@ -1,9 +1,7 @@
 // This code was auto-generated, is not intended to be edited, and is subject to
 // significant change. Please see the README file for more information.
 library engine.resolver_test;
-import 'dart:collection';
 import 'package:analyzer_experimental/src/generated/java_core.dart';
-import 'package:analyzer_experimental/src/generated/java_engine.dart';
 import 'package:analyzer_experimental/src/generated/java_junit.dart';
 import 'package:analyzer_experimental/src/generated/source_io.dart';
 import 'package:analyzer_experimental/src/generated/error.dart';
@@ -427,14 +425,13 @@
         "}"]));
     LibraryElement library = resolve(source);
     assertErrors([StaticTypeWarningCode.UNDEFINED_METHOD]);
-    verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
     FunctionDeclaration function = unit.declarations[2] as FunctionDeclaration;
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
     ReturnStatement statement = ((ifStatement.thenStatement as Block)).statements[0] as ReturnStatement;
     MethodInvocation invocation = statement.expression as MethodInvocation;
-    JUnitTestCase.assertNotNull(invocation.methodName.element);
+    JUnitTestCase.assertNotNull(invocation.methodName.propagatedElement);
   }
   void test_is_while() {
     Source source = addSource(EngineTestCase.createSource([
@@ -1155,6 +1152,21 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_constConstructorWithNonConstSuper_redirectingFactory() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A();",
+        "}",
+        "class B implements C {",
+        "  const B();",
+        "}",
+        "class C extends A {",
+        "  const factory C() = B;",
+        "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_constConstructorWithNonFinalField_finalInstanceVar() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x = 0;", "  const A();", "}"]));
     resolve(source);
@@ -1316,6 +1328,18 @@
     assertErrors([]);
     verify([source]);
   }
+  void test_defaultValueInFunctionTypedParameter_named() {
+    Source source = addSource(EngineTestCase.createSource(["f(g({p})) {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_defaultValueInFunctionTypedParameter_optional() {
+    Source source = addSource(EngineTestCase.createSource(["f(g([p])) {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_duplicateDefinition_emptyName() {
     Source source = addSource(EngineTestCase.createSource([
         "Map _globalMap = {",
@@ -1332,6 +1356,12 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_dynamicIdentifier() {
+    Source source = addSource(EngineTestCase.createSource(["main() {", "  var v = dynamic;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_exportOfNonLibrary_libraryDeclared() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
@@ -1418,7 +1448,7 @@
         "}",
         "class B extends A {",
         "  int x;",
-        "  A(this.x) : super();",
+        "  B(this.x) : super();",
         "}"]));
     resolve(source);
     assertNoErrors();
@@ -1543,19 +1573,6 @@
     assertNoErrors();
     verify([source]);
   }
-  void test_implicitThisReferenceInInitializer_staticField_superClass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static var f;",
-        "}",
-        "class B extends A {",
-        "  var v;",
-        "  B() : v = f;",
-        "}"]));
-    resolve(source);
-    assertNoErrors();
-    verify([source]);
-  }
   void test_implicitThisReferenceInInitializer_staticField_thisClass() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1666,12 +1683,122 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_inconsistentMethodInheritance_accessors_typeVariables_diamond() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class F<E> extends B<E> {}",
+        "class D<E> extends F<E> {",
+        "  external E get g;",
+        "}",
+        "abstract class C<E> {",
+        "  E get g;",
+        "}",
+        "abstract class B<E> implements C<E> {",
+        "  E get g { return null; }",
+        "}",
+        "class A<E> extends B<E> implements D<E> {",
+        "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_inconsistentMethodInheritance_accessors_typeVariables1() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class A<E> {",
+        "  E get x;",
+        "}",
+        "abstract class B<E> {",
+        "  E get x;",
+        "}",
+        "class C<E> implements A<E>, B<E> {",
+        "  E get x => 1;",
+        "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_inconsistentMethodInheritance_accessors_typeVariables2() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class A<E> {",
+        "  E get x {return 1;}",
+        "}",
+        "class B<E> {",
+        "  E get x {return 1;}",
+        "}",
+        "class C<E> extends A<E> implements B<E> {",
+        "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_inconsistentMethodInheritance_methods_typeVariables1() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A<E> {",
+        "  x(E e) {}",
+        "}",
+        "class B<E> {",
+        "  x(E e) {}",
+        "}",
+        "class C<E> implements A<E>, B<E> {",
+        "  x(E e) {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_inconsistentMethodInheritance_methods_typeVariables2() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A<E> {",
+        "  x(E e) {}",
+        "}",
+        "class B<E> {",
+        "  x(E e) {}",
+        "}",
+        "class C<E> extends A<E> implements B<E> {",
+        "  x(E e) {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_inconsistentMethodInheritance_simple() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class A {",
+        "  x();",
+        "}",
+        "abstract class B {",
+        "  x();",
+        "}",
+        "class C implements A, B {",
+        "  x() {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_initializingFormalForNonExistantField() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) {}", "}"]));
     resolve(source);
     assertNoErrors();
     verify([source]);
   }
+  void test_instanceAccessToStaticMember_fromComment() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static m() {}",
+        "}",
+        "/// [A.m]",
+        "main() {",
+        "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_instanceAccessToStaticMember_topLevel() {
+    Source source = addSource(EngineTestCase.createSource(["m() {}", "main() {", "  m();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_instanceMemberAccessFromStatic_fromComment() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -1734,6 +1861,18 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_invalidAssignment_defaultValue_named() {
+    Source source = addSource(EngineTestCase.createSource(["f({String x: '0'}) {", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_invalidAssignment_defaultValue_optional() {
+    Source source = addSource(EngineTestCase.createSource(["f([String x = '0']) {", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_invalidAssignment_toDynamic() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  var g;", "  g = () => 0;", "}"]));
     resolve(source);
@@ -1918,6 +2057,17 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_invalidTypeArgumentForKey() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m() {",
+        "    return const <int, int>{};",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_invalidTypeArgumentInConstList() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<E> {",
@@ -2170,18 +2320,6 @@
     assertNoErrors();
     verify([source]);
   }
-  void test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  m(p);",
-        "}",
-        "class B extends A {",
-        "  noSuchMethod(invocation) {}",
-        "}"]));
-    resolve(source);
-    assertNoErrors();
-    verify([source]);
-  }
   void test_nonBoolExpression_functionType() {
     Source source = addSource(EngineTestCase.createSource([
         "bool makeAssertion() => true;",
@@ -2234,6 +2372,19 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_nonConstantValueInInitializer_namedArgument() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  final a;",
+        "  const A({this.a});",
+        "}",
+        "class B extends A {",
+        "  const B({b}) : super(a: b);",
+        "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_nonConstCaseExpression() {
     Source source = addSource(EngineTestCase.createSource([
         "f(Type t) {",
@@ -2510,6 +2661,93 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_proxy_annotation_prefixed() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'meta.dart';",
+        "@proxy",
+        "class A {}",
+        "f(A a) {",
+        "  a.m();",
+        "  var x = a.g;",
+        "  a.s = 1;",
+        "  var y = a + a;",
+        "  a++;",
+        "  ++a;",
+        "}"]));
+    addSource2("/meta.dart", EngineTestCase.createSource([
+        "library meta;",
+        "const proxy = const _Proxy();",
+        "class _Proxy { const _Proxy(); }"]));
+    resolve(source);
+    assertNoErrors();
+  }
+  void test_proxy_annotation_prefixed2() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'meta.dart';",
+        "@proxy",
+        "class A {}",
+        "class B {",
+        "  f(A a) {",
+        "    a.m();",
+        "    var x = a.g;",
+        "    a.s = 1;",
+        "    var y = a + a;",
+        "    a++;",
+        "    ++a;",
+        "  }",
+        "}"]));
+    addSource2("/meta.dart", EngineTestCase.createSource([
+        "library meta;",
+        "const proxy = const _Proxy();",
+        "class _Proxy { const _Proxy(); }"]));
+    resolve(source);
+    assertNoErrors();
+  }
+  void test_proxy_annotation_prefixed3() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'meta.dart';",
+        "class B {",
+        "  f(A a) {",
+        "    a.m();",
+        "    var x = a.g;",
+        "    a.s = 1;",
+        "    var y = a + a;",
+        "    a++;",
+        "    ++a;",
+        "  }",
+        "}",
+        "@proxy",
+        "class A {}"]));
+    addSource2("/meta.dart", EngineTestCase.createSource([
+        "library meta;",
+        "const proxy = const _Proxy();",
+        "class _Proxy { const _Proxy(); }"]));
+    resolve(source);
+    assertNoErrors();
+  }
+  void test_proxy_annotation_simple() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'meta.dart';",
+        "@proxy",
+        "class B {",
+        "  m() {",
+        "    n();",
+        "    var x = g;",
+        "    s = 1;",
+        "    var y = this + this;",
+        "  }",
+        "}"]));
+    addSource2("/meta.dart", EngineTestCase.createSource([
+        "library meta;",
+        "const proxy = const _Proxy();",
+        "class _Proxy { const _Proxy(); }"]));
+    resolve(source);
+    assertNoErrors();
+  }
   void test_recursiveConstructorRedirect() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2935,6 +3173,13 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_undefinedSetter_importWithPrefix() {
+    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "set y(int value) {}"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as x;", "main() {", "  x.y = 0;", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_undefinedSuperMethod_field() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3108,6 +3353,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_conflictingStaticSetterAndInstanceMember_thisClass_method);
       });
+      _ut.test('test_constConstructorWithNonConstSuper_redirectingFactory', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_constConstructorWithNonConstSuper_redirectingFactory);
+      });
       _ut.test('test_constConstructorWithNonFinalField_finalInstanceVar', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_finalInstanceVar);
@@ -3160,6 +3409,14 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_defaultValueInFunctionTypeAlias);
       });
+      _ut.test('test_defaultValueInFunctionTypedParameter_named', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_defaultValueInFunctionTypedParameter_named);
+      });
+      _ut.test('test_defaultValueInFunctionTypedParameter_optional', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_defaultValueInFunctionTypedParameter_optional);
+      });
       _ut.test('test_duplicateDefinition_emptyName', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_duplicateDefinition_emptyName);
@@ -3168,6 +3425,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_duplicateDefinition_getter);
       });
+      _ut.test('test_dynamicIdentifier', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_dynamicIdentifier);
+      });
       _ut.test('test_exportOfNonLibrary_libraryDeclared', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_exportOfNonLibrary_libraryDeclared);
@@ -3268,10 +3529,6 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_qualifiedPropertyAccess);
       });
-      _ut.test('test_implicitThisReferenceInInitializer_staticField_superClass', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_staticField_superClass);
-      });
       _ut.test('test_implicitThisReferenceInInitializer_staticField_thisClass', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_implicitThisReferenceInInitializer_staticField_thisClass);
@@ -3316,10 +3573,42 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_inconsistentCaseExpressionTypes);
       });
+      _ut.test('test_inconsistentMethodInheritance_accessors_typeVariables1', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_inconsistentMethodInheritance_accessors_typeVariables1);
+      });
+      _ut.test('test_inconsistentMethodInheritance_accessors_typeVariables2', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_inconsistentMethodInheritance_accessors_typeVariables2);
+      });
+      _ut.test('test_inconsistentMethodInheritance_accessors_typeVariables_diamond', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_inconsistentMethodInheritance_accessors_typeVariables_diamond);
+      });
+      _ut.test('test_inconsistentMethodInheritance_methods_typeVariables1', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_inconsistentMethodInheritance_methods_typeVariables1);
+      });
+      _ut.test('test_inconsistentMethodInheritance_methods_typeVariables2', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_inconsistentMethodInheritance_methods_typeVariables2);
+      });
+      _ut.test('test_inconsistentMethodInheritance_simple', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_inconsistentMethodInheritance_simple);
+      });
       _ut.test('test_initializingFormalForNonExistantField', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_initializingFormalForNonExistantField);
       });
+      _ut.test('test_instanceAccessToStaticMember_fromComment', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_instanceAccessToStaticMember_fromComment);
+      });
+      _ut.test('test_instanceAccessToStaticMember_topLevel', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_instanceAccessToStaticMember_topLevel);
+      });
       _ut.test('test_instanceMemberAccessFromStatic_fromComment', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_instanceMemberAccessFromStatic_fromComment);
@@ -3344,6 +3633,14 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_invalidAssignment_compoundAssignment);
       });
+      _ut.test('test_invalidAssignment_defaultValue_named', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidAssignment_defaultValue_named);
+      });
+      _ut.test('test_invalidAssignment_defaultValue_optional', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidAssignment_defaultValue_optional);
+      });
       _ut.test('test_invalidAssignment_toDynamic', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_invalidAssignment_toDynamic);
@@ -3412,6 +3709,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_invalidReferenceToThis_instanceMethod);
       });
+      _ut.test('test_invalidTypeArgumentForKey', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_invalidTypeArgumentForKey);
+      });
       _ut.test('test_invalidTypeArgumentInConstList', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_invalidTypeArgumentInConstList);
@@ -3524,10 +3825,6 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_abstractOverridesConcrete_method);
       });
-      _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod);
-      });
       _ut.test('test_nonBoolExpression_functionType', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_nonBoolExpression_functionType);
@@ -3608,6 +3905,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_nonConstantDefaultValue_method_positional);
       });
+      _ut.test('test_nonConstantValueInInitializer_namedArgument', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonConstantValueInInitializer_namedArgument);
+      });
       _ut.test('test_nonGenerativeConstructor', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_nonGenerativeConstructor);
@@ -3660,6 +3961,22 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_prefixCollidesWithTopLevelMembers);
       });
+      _ut.test('test_proxy_annotation_prefixed', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_proxy_annotation_prefixed);
+      });
+      _ut.test('test_proxy_annotation_prefixed2', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_proxy_annotation_prefixed2);
+      });
+      _ut.test('test_proxy_annotation_prefixed3', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_proxy_annotation_prefixed3);
+      });
+      _ut.test('test_proxy_annotation_simple', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_proxy_annotation_simple);
+      });
       _ut.test('test_recursiveConstructorRedirect', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_recursiveConstructorRedirect);
@@ -3824,6 +4141,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedOperator_tilde);
       });
+      _ut.test('test_undefinedSetter_importWithPrefix', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_undefinedSetter_importWithPrefix);
+      });
       _ut.test('test_undefinedSuperMethod_field', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedSuperMethod_field);
@@ -3986,19 +4307,6 @@
     assertErrors([StaticTypeWarningCode.INACCESSIBLE_SETTER]);
     verify([source]);
   }
-  void fail_invocationOfNonFunction_staticInSuperclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static void a() {}",
-        "}",
-        "",
-        "class B extends A {",
-        "  void b() { a(); }",
-        "}"]));
-    resolve(source);
-    assertErrors([StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
-    verify([source]);
-  }
   void test_inconsistentMethodInheritance_paramCount() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -4039,6 +4347,66 @@
     assertErrors([StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
     verify([source]);
   }
+  void test_instanceAccessToStaticMember_method_invocation() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static m() {}",
+        "}",
+        "main(A a) {",
+        "  a.m();",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
+    verify([source]);
+  }
+  void test_instanceAccessToStaticMember_method_reference() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static m() {}",
+        "}",
+        "main(A a) {",
+        "  a.m;",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
+    verify([source]);
+  }
+  void test_instanceAccessToStaticMember_propertyAccess_field() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static var f;",
+        "}",
+        "main(A a) {",
+        "  a.f;",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
+    verify([source]);
+  }
+  void test_instanceAccessToStaticMember_propertyAccess_getter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static get f => 42;",
+        "}",
+        "main(A a) {",
+        "  a.f;",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
+    verify([source]);
+  }
+  void test_instanceAccessToStaticMember_propertyAccess_setter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static set f(x) {}",
+        "}",
+        "main(A a) {",
+        "  a.f = 42;",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
+    verify([source]);
+  }
   void test_invalidAssignment_compoundAssignment() {
     Source source = addSource(EngineTestCase.createSource([
         "class byte {",
@@ -4055,6 +4423,18 @@
     assertErrors([StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
+  void test_invalidAssignment_defaultValue_named() {
+    Source source = addSource(EngineTestCase.createSource(["f({String x: 0}) {", "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+  void test_invalidAssignment_defaultValue_optional() {
+    Source source = addSource(EngineTestCase.createSource(["f([String x = 0]) {", "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
   void test_invalidAssignment_instanceVariable() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -4147,6 +4527,12 @@
     assertErrors([StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
     verify([source]);
   }
+  void test_invocationOfNonFunctionExpression_literal() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  3(5);", "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION]);
+    verify([source]);
+  }
   void test_nonBoolCondition_conditional() {
     Source source = addSource(EngineTestCase.createSource(["f() { return 3 ? 2 : 1; }"]));
     resolve(source);
@@ -4450,11 +4836,6 @@
     assertErrors([StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
-  void test_undefinedFunction() {
-    Source source = addSource(EngineTestCase.createSource(["void f() {", "  g();", "}"]));
-    resolve(source);
-    assertErrors([StaticTypeWarningCode.UNDEFINED_FUNCTION]);
-  }
   void test_undefinedGetter() {
     Source source = addSource(EngineTestCase.createSource(["class T {}", "f(T e) { return e.m; }"]));
     resolve(source);
@@ -4488,7 +4869,9 @@
   void test_undefinedOperator_indexBoth() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a[0]++;", "}"]));
     resolve(source);
-    assertErrors([StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+    assertErrors([
+        StaticTypeWarningCode.UNDEFINED_OPERATOR,
+        StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
   void test_undefinedOperator_indexGetter() {
     Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a[0];", "}"]));
@@ -4524,6 +4907,48 @@
     resolve(source);
     assertErrors([StaticTypeWarningCode.UNDEFINED_SUPER_METHOD]);
   }
+  void test_unqualifiedReferenceToNonLocalStaticMember_getter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static int get a => 0;",
+        "}",
+        "class B extends A {",
+        "  int b() {",
+        "    return a;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER]);
+    verify([source]);
+  }
+  void test_unqualifiedReferenceToNonLocalStaticMember_method() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static void a() {}",
+        "}",
+        "class B extends A {",
+        "  void b() {",
+        "    a();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER]);
+    verify([source]);
+  }
+  void test_unqualifiedReferenceToNonLocalStaticMember_setter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static set a(x) {}",
+        "}",
+        "class B extends A {",
+        "  b(y) {",
+        "    a = y;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER]);
+    verify([source]);
+  }
   void test_wrongNumberOfTypeArguments_tooFew() {
     Source source = addSource(EngineTestCase.createSource(["class A<E, F> {}", "A<A> a = null;"]));
     resolve(source);
@@ -4572,10 +4997,38 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_inconsistentMethodInheritance_returnType);
       });
+      _ut.test('test_instanceAccessToStaticMember_method_invocation', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_instanceAccessToStaticMember_method_invocation);
+      });
+      _ut.test('test_instanceAccessToStaticMember_method_reference', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_instanceAccessToStaticMember_method_reference);
+      });
+      _ut.test('test_instanceAccessToStaticMember_propertyAccess_field', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_instanceAccessToStaticMember_propertyAccess_field);
+      });
+      _ut.test('test_instanceAccessToStaticMember_propertyAccess_getter', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_instanceAccessToStaticMember_propertyAccess_getter);
+      });
+      _ut.test('test_instanceAccessToStaticMember_propertyAccess_setter', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_instanceAccessToStaticMember_propertyAccess_setter);
+      });
       _ut.test('test_invalidAssignment_compoundAssignment', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidAssignment_compoundAssignment);
       });
+      _ut.test('test_invalidAssignment_defaultValue_named', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidAssignment_defaultValue_named);
+      });
+      _ut.test('test_invalidAssignment_defaultValue_optional', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidAssignment_defaultValue_optional);
+      });
       _ut.test('test_invalidAssignment_instanceVariable', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidAssignment_instanceVariable);
@@ -4596,6 +5049,10 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidAssignment_variableDeclaration);
       });
+      _ut.test('test_invocationOfNonFunctionExpression_literal', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_invocationOfNonFunctionExpression_literal);
+      });
       _ut.test('test_invocationOfNonFunction_class', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_invocationOfNonFunction_class);
@@ -4756,10 +5213,6 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_typeArgumentNotMatchingBounds_with);
       });
-      _ut.test('test_undefinedFunction', () {
-        final __test = new StaticTypeWarningCodeTest();
-        runJUnitTest(__test, __test.test_undefinedFunction);
-      });
       _ut.test('test_undefinedGetter', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedGetter);
@@ -4804,6 +5257,18 @@
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedSuperMethod);
       });
+      _ut.test('test_unqualifiedReferenceToNonLocalStaticMember_getter', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_unqualifiedReferenceToNonLocalStaticMember_getter);
+      });
+      _ut.test('test_unqualifiedReferenceToNonLocalStaticMember_method', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_unqualifiedReferenceToNonLocalStaticMember_method);
+      });
+      _ut.test('test_unqualifiedReferenceToNonLocalStaticMember_setter', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_unqualifiedReferenceToNonLocalStaticMember_setter);
+      });
       _ut.test('test_wrongNumberOfTypeArguments_tooFew', () {
         final __test = new StaticTypeWarningCodeTest();
         runJUnitTest(__test, __test.test_wrongNumberOfTypeArguments_tooFew);
@@ -5256,16 +5721,16 @@
   void test_visitCatchClause_exception() {
     CatchClause clause = ASTFactory.catchClause("e", []);
     SimpleIdentifier exceptionParameter = clause.exceptionParameter;
-    exceptionParameter.element = new LocalVariableElementImpl(exceptionParameter);
+    exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
     resolve(clause, _typeProvider.objectType, null, []);
     _listener.assertNoErrors();
   }
   void test_visitCatchClause_exception_stackTrace() {
     CatchClause clause = ASTFactory.catchClause2("e", "s", []);
     SimpleIdentifier exceptionParameter = clause.exceptionParameter;
-    exceptionParameter.element = new LocalVariableElementImpl(exceptionParameter);
+    exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
     SimpleIdentifier stackTraceParameter = clause.stackTraceParameter;
-    stackTraceParameter.element = new LocalVariableElementImpl(stackTraceParameter);
+    stackTraceParameter.staticElement = new LocalVariableElementImpl(stackTraceParameter);
     resolve(clause, _typeProvider.objectType, _typeProvider.stackTraceType, []);
     _listener.assertNoErrors();
   }
@@ -5274,19 +5739,19 @@
     TypeName exceptionType = ASTFactory.typeName(exceptionElement, []);
     CatchClause clause = ASTFactory.catchClause4(exceptionType, "e", []);
     SimpleIdentifier exceptionParameter = clause.exceptionParameter;
-    exceptionParameter.element = new LocalVariableElementImpl(exceptionParameter);
+    exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
     resolve(clause, exceptionElement.type, null, [exceptionElement]);
     _listener.assertNoErrors();
   }
   void test_visitCatchClause_on_exception_stackTrace() {
     ClassElement exceptionElement = ElementFactory.classElement2("E", []);
     TypeName exceptionType = ASTFactory.typeName(exceptionElement, []);
-    ((exceptionType.name as SimpleIdentifier)).element = exceptionElement;
+    ((exceptionType.name as SimpleIdentifier)).staticElement = exceptionElement;
     CatchClause clause = ASTFactory.catchClause5(exceptionType, "e", "s", []);
     SimpleIdentifier exceptionParameter = clause.exceptionParameter;
-    exceptionParameter.element = new LocalVariableElementImpl(exceptionParameter);
+    exceptionParameter.staticElement = new LocalVariableElementImpl(exceptionParameter);
     SimpleIdentifier stackTraceParameter = clause.stackTraceParameter;
-    stackTraceParameter.element = new LocalVariableElementImpl(stackTraceParameter);
+    stackTraceParameter.staticElement = new LocalVariableElementImpl(stackTraceParameter);
     resolve(clause, exceptionElement.type, _typeProvider.stackTraceType, [exceptionElement]);
     _listener.assertNoErrors();
   }
@@ -5299,7 +5764,7 @@
     WithClause withClause = ASTFactory.withClause([ASTFactory.typeName(elementC, [])]);
     ImplementsClause implementsClause = ASTFactory.implementsClause([ASTFactory.typeName(elementD, [])]);
     ClassDeclaration declaration = ASTFactory.classDeclaration(null, "A", null, extendsClause, withClause, implementsClause, []);
-    declaration.name.element = elementA;
+    declaration.name.staticElement = elementA;
     resolveNode(declaration, [elementA, elementB, elementC, elementD]);
     JUnitTestCase.assertSame(elementB.type, elementA.supertype);
     List<InterfaceType> mixins = elementA.mixins;
@@ -5318,7 +5783,7 @@
     WithClause withClause = ASTFactory.withClause([ASTFactory.typeName(elementC, [])]);
     ImplementsClause implementsClause = ASTFactory.implementsClause([ASTFactory.typeName(elementD, [])]);
     ClassTypeAlias alias = ASTFactory.classTypeAlias("A", null, null, ASTFactory.typeName(elementB, []), withClause, implementsClause);
-    alias.name.element = elementA;
+    alias.name.staticElement = elementA;
     resolveNode(alias, [elementA, elementB, elementC, elementD]);
     JUnitTestCase.assertSame(elementB.type, elementA.supertype);
     List<InterfaceType> mixins = elementA.mixins;
@@ -5334,10 +5799,10 @@
     TypeName intTypeName = ASTFactory.typeName4("int", []);
     String innerParameterName = "a";
     SimpleFormalParameter parameter = ASTFactory.simpleFormalParameter3(innerParameterName);
-    parameter.identifier.element = ElementFactory.requiredParameter(innerParameterName);
+    parameter.identifier.staticElement = ElementFactory.requiredParameter(innerParameterName);
     String outerParameterName = "p";
     FormalParameter node = ASTFactory.fieldFormalParameter2(null, intTypeName, outerParameterName, ASTFactory.formalParameterList([parameter]));
-    node.identifier.element = ElementFactory.requiredParameter(outerParameterName);
+    node.identifier.staticElement = ElementFactory.requiredParameter(outerParameterName);
     Type2 parameterType = resolve6(node, [intType.element]);
     EngineTestCase.assertInstanceOf(FunctionType, parameterType);
     FunctionType functionType = parameterType as FunctionType;
@@ -5348,7 +5813,7 @@
   void test_visitFieldFormalParameter_noType() {
     String parameterName = "p";
     FormalParameter node = ASTFactory.fieldFormalParameter(Keyword.VAR, null, parameterName);
-    node.identifier.element = ElementFactory.requiredParameter(parameterName);
+    node.identifier.staticElement = ElementFactory.requiredParameter(parameterName);
     JUnitTestCase.assertSame(_typeProvider.dynamicType, resolve6(node, []));
     _listener.assertNoErrors();
   }
@@ -5357,13 +5822,13 @@
     TypeName intTypeName = ASTFactory.typeName4("int", []);
     String parameterName = "p";
     FormalParameter node = ASTFactory.fieldFormalParameter(null, intTypeName, parameterName);
-    node.identifier.element = ElementFactory.requiredParameter(parameterName);
+    node.identifier.staticElement = ElementFactory.requiredParameter(parameterName);
     JUnitTestCase.assertSame(intType, resolve6(node, [intType.element]));
     _listener.assertNoErrors();
   }
   void test_visitSimpleFormalParameter_noType() {
     FormalParameter node = ASTFactory.simpleFormalParameter3("p");
-    node.identifier.element = new ParameterElementImpl.con1(ASTFactory.identifier3("p"));
+    node.identifier.staticElement = new ParameterElementImpl.con1(ASTFactory.identifier3("p"));
     JUnitTestCase.assertSame(_typeProvider.dynamicType, resolve6(node, []));
     _listener.assertNoErrors();
   }
@@ -5373,7 +5838,7 @@
     FormalParameter node = ASTFactory.simpleFormalParameter4(ASTFactory.typeName(intElement, []), "p");
     SimpleIdentifier identifier = node.identifier;
     ParameterElementImpl element = new ParameterElementImpl.con1(identifier);
-    identifier.element = element;
+    identifier.staticElement = element;
     JUnitTestCase.assertSame(intType, resolve6(node, [intElement]));
     _listener.assertNoErrors();
   }
@@ -5452,7 +5917,7 @@
    */
   Type2 resolve6(FormalParameter node, List<Element> definedElements) {
     resolveNode(node, definedElements);
-    return ((node.identifier.element as ParameterElement)).type;
+    return ((node.identifier.staticElement as ParameterElement)).type;
   }
 
   /**
@@ -5822,19 +6287,28 @@
    * The inheritance manager being tested.
    */
   InheritanceManager _inheritanceManager;
+
+  /**
+   * The number of members that Object implements (as determined by [TestTypeProvider]).
+   */
+  int _numOfMembersInObject = 0;
   void setUp() {
     _typeProvider = new TestTypeProvider();
     _inheritanceManager = createInheritanceManager();
+    InterfaceType objectType = _typeProvider.objectType;
+    _numOfMembersInObject = objectType.methods.length + objectType.accessors.length;
   }
   void test_getMapOfMembersInheritedFromClasses_accessor_extends() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
     PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement> [getterG];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.supertype = classA.type;
-    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
-    JUnitTestCase.assertSame(getterG, map[getterName]);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    Map<String, ExecutableElement> mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    Map<String, ExecutableElement> mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    EngineTestCase.assertSize2(_numOfMembersInObject, mapA);
+    EngineTestCase.assertSize2(_numOfMembersInObject + 1, mapB);
+    JUnitTestCase.assertSame(getterG, mapB[getterName]);
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
@@ -5845,8 +6319,11 @@
     classA.accessors = <PropertyAccessorElement> [getterG];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.interfaces = <InterfaceType> [classA.type];
-    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
-    JUnitTestCase.assertNull(map[getterName]);
+    Map<String, ExecutableElement> mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    Map<String, ExecutableElement> mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    EngineTestCase.assertSize2(_numOfMembersInObject, mapA);
+    EngineTestCase.assertSize2(_numOfMembersInObject, mapB);
+    JUnitTestCase.assertNull(mapB[getterName]);
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
@@ -5857,8 +6334,11 @@
     classA.accessors = <PropertyAccessorElement> [getterG];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.mixins = <InterfaceType> [classA.type];
-    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
-    JUnitTestCase.assertSame(getterG, map[getterName]);
+    Map<String, ExecutableElement> mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    Map<String, ExecutableElement> mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    EngineTestCase.assertSize2(_numOfMembersInObject, mapA);
+    EngineTestCase.assertSize2(_numOfMembersInObject + 1, mapB);
+    JUnitTestCase.assertSame(getterG, mapB[getterName]);
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
@@ -5869,8 +6349,11 @@
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.supertype = classA.type;
-    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
-    JUnitTestCase.assertSame(methodM, map[methodName]);
+    Map<String, ExecutableElement> mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    Map<String, ExecutableElement> mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    EngineTestCase.assertSize2(_numOfMembersInObject, mapA);
+    EngineTestCase.assertSize2(_numOfMembersInObject + 1, mapB);
+    JUnitTestCase.assertSame(methodM, mapB[methodName]);
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
@@ -5881,8 +6364,11 @@
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.interfaces = <InterfaceType> [classA.type];
-    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
-    JUnitTestCase.assertNull(map[methodName]);
+    Map<String, ExecutableElement> mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    Map<String, ExecutableElement> mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    EngineTestCase.assertSize2(_numOfMembersInObject, mapA);
+    EngineTestCase.assertSize2(_numOfMembersInObject, mapB);
+    JUnitTestCase.assertNull(mapB[methodName]);
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
@@ -5893,8 +6379,11 @@
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.mixins = <InterfaceType> [classA.type];
-    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
-    JUnitTestCase.assertSame(methodM, map[methodName]);
+    Map<String, ExecutableElement> mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    Map<String, ExecutableElement> mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    EngineTestCase.assertSize2(_numOfMembersInObject, mapA);
+    EngineTestCase.assertSize2(_numOfMembersInObject + 1, mapB);
+    JUnitTestCase.assertSame(methodM, mapB[methodName]);
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
@@ -5903,10 +6392,12 @@
     String getterName = "g";
     PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement> [getterG];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.supertype = classA.type;
-    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
-    JUnitTestCase.assertSame(getterG, map[getterName]);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    Map<String, ExecutableElement> mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    Map<String, ExecutableElement> mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    EngineTestCase.assertSize2(_numOfMembersInObject, mapA);
+    EngineTestCase.assertSize2(_numOfMembersInObject + 1, mapB);
+    JUnitTestCase.assertSame(getterG, mapB[getterName]);
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
@@ -5917,8 +6408,11 @@
     classA.accessors = <PropertyAccessorElement> [getterG];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.interfaces = <InterfaceType> [classA.type];
-    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
-    JUnitTestCase.assertSame(getterG, map[getterName]);
+    Map<String, ExecutableElement> mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    Map<String, ExecutableElement> mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    EngineTestCase.assertSize2(_numOfMembersInObject, mapA);
+    EngineTestCase.assertSize2(_numOfMembersInObject + 1, mapB);
+    JUnitTestCase.assertSame(getterG, mapB[getterName]);
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
@@ -5929,8 +6423,11 @@
     classA.accessors = <PropertyAccessorElement> [getterG];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.mixins = <InterfaceType> [classA.type];
-    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
-    JUnitTestCase.assertSame(getterG, map[getterName]);
+    Map<String, ExecutableElement> mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    Map<String, ExecutableElement> mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    EngineTestCase.assertSize2(_numOfMembersInObject, mapA);
+    EngineTestCase.assertSize2(_numOfMembersInObject + 1, mapB);
+    JUnitTestCase.assertSame(getterG, mapB[getterName]);
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
@@ -5939,10 +6436,12 @@
     String methodName = "m";
     MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
     classA.methods = <MethodElement> [methodM];
-    ClassElementImpl classB = ElementFactory.classElement2("B", []);
-    classB.supertype = classA.type;
-    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
-    JUnitTestCase.assertSame(methodM, map[methodName]);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    Map<String, ExecutableElement> mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    Map<String, ExecutableElement> mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    EngineTestCase.assertSize2(_numOfMembersInObject, mapA);
+    EngineTestCase.assertSize2(_numOfMembersInObject + 1, mapB);
+    JUnitTestCase.assertSame(methodM, mapB[methodName]);
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
@@ -5953,8 +6452,11 @@
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.interfaces = <InterfaceType> [classA.type];
-    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
-    JUnitTestCase.assertSame(methodM, map[methodName]);
+    Map<String, ExecutableElement> mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    Map<String, ExecutableElement> mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    EngineTestCase.assertSize2(_numOfMembersInObject, mapA);
+    EngineTestCase.assertSize2(_numOfMembersInObject + 1, mapB);
+    JUnitTestCase.assertSame(methodM, mapB[methodName]);
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
@@ -5965,8 +6467,11 @@
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.mixins = <InterfaceType> [classA.type];
-    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
-    JUnitTestCase.assertSame(methodM, map[methodName]);
+    Map<String, ExecutableElement> mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    Map<String, ExecutableElement> mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    EngineTestCase.assertSize2(_numOfMembersInObject, mapA);
+    EngineTestCase.assertSize2(_numOfMembersInObject + 1, mapB);
+    JUnitTestCase.assertSame(methodM, mapB[methodName]);
     assertNoErrors(classA);
     assertNoErrors(classB);
   }
@@ -6465,18 +6970,6 @@
     assertErrors([CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION]);
     verify([source]);
   }
-  void fail_extendsOrImplementsDisallowedClass_extends_null() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Null {}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-  void fail_extendsOrImplementsDisallowedClass_implements_null() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements Null {}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
   void fail_mixinDeclaresConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -6532,6 +7025,18 @@
     assertErrors([CompileTimeErrorCode.AMBIGUOUS_EXPORT]);
     verify([source]);
   }
+  void test_ambiguousImport_function() {
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'lib1.dart';",
+        "import 'lib2.dart';",
+        "g() { return f(); }"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f() {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f() {}"]));
+    resolve(source);
+    assertErrors([
+        StaticWarningCode.AMBIGUOUS_IMPORT,
+        CompileTimeErrorCode.UNDEFINED_FUNCTION]);
+  }
   void test_argumentDefinitionTestNonParameter() {
     Source source = addSource(EngineTestCase.createSource(["f() {", " var v = 0;", " return ?v;", "}"]));
     resolve(source);
@@ -6676,6 +7181,30 @@
     assertErrors([CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
     verify([source]);
   }
+  void test_constConstructorWithNonConstSuper_explicit() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A();",
+        "}",
+        "class B extends A {",
+        "  const B(): super();",
+        "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
+    verify([source]);
+  }
+  void test_constConstructorWithNonConstSuper_implicit() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A();",
+        "}",
+        "class B extends A {",
+        "  const B();",
+        "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
+    verify([source]);
+  }
   void test_constConstructorWithNonFinalField_mixin() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -6697,7 +7226,9 @@
         "  const B();",
         "}"]));
     resolve(source);
-    assertErrors([CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]);
+    assertErrors([
+        CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
+        CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
     verify([source]);
   }
   void test_constConstructorWithNonFinalField_this() {
@@ -6712,7 +7243,7 @@
     assertErrors([CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
     verify([source]);
   }
-  void test_constEval_propertyExtraction_methodInstance() {
+  void test_constEval_propertyExtraction_targetNotConst() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
         "  const A();",
@@ -6724,18 +7255,6 @@
     assertErrors([CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
     verify([source]);
   }
-  void test_constEval_propertyExtraction_methodStatic_targetInstance() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "  static m() {}",
-        "}",
-        "final a = const A();",
-        "const C = a.m;"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
-    verify([source]);
-  }
   void test_constEvalThrowsException_binaryMinus_null() {
     check_constEvalThrowsException_binary_null("null - 5", false);
     check_constEvalThrowsException_binary_null("5 - null", true);
@@ -7009,6 +7528,18 @@
     assertErrors([CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS]);
     verify([source]);
   }
+  void test_defaultValueInFunctionTypedParameter_named() {
+    Source source = addSource(EngineTestCase.createSource(["f(g({p: null})) {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER]);
+    verify([source]);
+  }
+  void test_defaultValueInFunctionTypedParameter_optional() {
+    Source source = addSource(EngineTestCase.createSource(["f(g([p = null])) {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER]);
+    verify([source]);
+  }
   void test_duplicateConstructorName_named() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A.a() {}", "  A.a() {}", "}"]));
     resolve(source);
@@ -7099,6 +7630,30 @@
         CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
+  void test_duplicateDefinitionInheritance_instanceGetter_staticGetter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int get x => 0;",
+        "}",
+        "class B extends A {",
+        "  static int get x => 0;",
+        "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
+  void test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class A {",
+        "  int get x;",
+        "}",
+        "class B extends A {",
+        "  static int get x => 0;",
+        "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
   void test_duplicateDefinitionInheritance_instanceMethod_staticMethod() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -7123,6 +7678,30 @@
     assertErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
     verify([source]);
   }
+  void test_duplicateDefinitionInheritance_instanceSetter_staticSetter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  set x(value) {}",
+        "}",
+        "class B extends A {",
+        "  static set x(value) {}",
+        "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
+  void test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class A {",
+        "  set x(value);",
+        "}",
+        "class B extends A {",
+        "  static set x(value) {}",
+        "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
   void test_duplicateNamedArgument() {
     Source source = addSource(EngineTestCase.createSource(["f({a, b}) {}", "main() {", "  f(a: 1, a: 2);", "}"]));
     resolve(source);
@@ -7142,6 +7721,54 @@
     assertErrors([CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY]);
     verify([source]);
   }
+  void test_extendsDisallowedClass_bool() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends bool {}"]));
+    resolve(source);
+    assertErrors([
+        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+  void test_extendsDisallowedClass_double() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends double {}"]));
+    resolve(source);
+    assertErrors([
+        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+  void test_extendsDisallowedClass_int() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends int {}"]));
+    resolve(source);
+    assertErrors([
+        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+  void test_extendsDisallowedClass_Null() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends Null {}"]));
+    resolve(source);
+    assertErrors([
+        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+  void test_extendsDisallowedClass_num() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends num {}"]));
+    resolve(source);
+    assertErrors([
+        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+  void test_extendsDisallowedClass_String() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends String {}"]));
+    resolve(source);
+    assertErrors([
+        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
   void test_extendsNonClass_class() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends A {}"]));
     resolve(source);
@@ -7154,76 +7781,6 @@
     assertErrors([CompileTimeErrorCode.EXTENDS_NON_CLASS]);
     verify([source]);
   }
-  void test_extendsOrImplementsDisallowedClass_extends_bool() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends bool {}"]));
-    resolve(source);
-    assertErrors([
-        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-  void test_extendsOrImplementsDisallowedClass_extends_double() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends double {}"]));
-    resolve(source);
-    assertErrors([
-        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-  void test_extendsOrImplementsDisallowedClass_extends_int() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends int {}"]));
-    resolve(source);
-    assertErrors([
-        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-  void test_extendsOrImplementsDisallowedClass_extends_num() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends num {}"]));
-    resolve(source);
-    assertErrors([
-        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-  void test_extendsOrImplementsDisallowedClass_extends_String() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends String {}"]));
-    resolve(source);
-    assertErrors([
-        CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
-        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
-    verify([source]);
-  }
-  void test_extendsOrImplementsDisallowedClass_implements_bool() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements bool {}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-  void test_extendsOrImplementsDisallowedClass_implements_double() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements double {}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-  void test_extendsOrImplementsDisallowedClass_implements_int() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements int {}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-  void test_extendsOrImplementsDisallowedClass_implements_num() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements num {}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
-  void test_extendsOrImplementsDisallowedClass_implements_String() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements String {}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
-    verify([source]);
-  }
   void test_extraPositionalArguments_const() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -7279,16 +7836,6 @@
         CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
     verify([source]);
   }
-  void test_fieldInitializedInInitializerAndDeclaration_final() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int x = 0;",
-        "  A() : x = 1 {}",
-        "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
-    verify([source]);
-  }
   void test_fieldInitializedInParameterAndInitializer() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) : x = 1 {}", "}"]));
     resolve(source);
@@ -7358,28 +7905,6 @@
     assertErrors([CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
     verify([source]);
   }
-
-  /**
-   * This test doesn't test the FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR code, but tests the
-   * FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION code instead. It is provided here to show
-   * coverage over all of the permutations of initializers in constructor declarations.
-   *
-   * Note: FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION covers a subset of
-   * FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, since it more specific, we use it instead of
-   * the broader code
-   */
-  void test_finalInitializedInDeclarationAndConstructor_initializers() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x = 0;", "  A() : x = 0 {}", "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
-    verify([source]);
-  }
-  void test_finalInitializedInDeclarationAndConstructor_initializingFormal() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x = 0;", "  A(this.x) {}", "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR]);
-    verify([source]);
-  }
   void test_finalInitializedMultipleTimes_initializers() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A() : x = 0, x = 0 {}", "}"]));
     resolve(source);
@@ -7415,6 +7940,42 @@
         CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME]);
     verify([source]);
   }
+  void test_implementsDisallowedClass_bool() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements bool {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+  void test_implementsDisallowedClass_double() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements double {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+  void test_implementsDisallowedClass_int() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements int {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+  void test_implementsDisallowedClass_Null() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements Null {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+  void test_implementsDisallowedClass_num() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements num {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+  void test_implementsDisallowedClass_String() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements String {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
   void test_implementsDynamic() {
     Source source = addSource(EngineTestCase.createSource(["class A implements dynamic {}"]));
     resolve(source);
@@ -7709,7 +8270,12 @@
     assertErrors([CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
-  void test_invalidConstructorName_notEnclosingClassName() {
+  void test_invalidConstructorName_notEnclosingClassName_defined() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  B() : super();", "}", "class B {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME]);
+  }
+  void test_invalidConstructorName_notEnclosingClassName_undefined() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  B() : super();", "}"]));
     resolve(source);
     assertErrors([CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME]);
@@ -7725,54 +8291,6 @@
     resolve(source);
     assertErrors([CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS]);
   }
-  void test_invalidOverrideNamed_fewerNamedParameters() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m({a, b}) {}",
-        "}",
-        "class B extends A {",
-        "  m({a}) {}",
-        "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.INVALID_OVERRIDE_NAMED]);
-    verify([source]);
-  }
-  void test_invalidOverrideNamed_missingNamedParameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m({a, b}) {}",
-        "}",
-        "class B extends A {",
-        "  m({a, c}) {}",
-        "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.INVALID_OVERRIDE_NAMED]);
-    verify([source]);
-  }
-  void test_invalidOverridePositional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m([a, b]) {}",
-        "}",
-        "class B extends A {",
-        "  m([a]) {}",
-        "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.INVALID_OVERRIDE_POSITIONAL]);
-    verify([source]);
-  }
-  void test_invalidOverrideRequired() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m(a) {}",
-        "}",
-        "class B extends A {",
-        "  m(a, b) {}",
-        "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.INVALID_OVERRIDE_REQUIRED]);
-    verify([source]);
-  }
   void test_invalidReferenceToThis_factoryConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() { return this; }", "}"]));
     resolve(source);
@@ -7803,6 +8321,18 @@
     assertErrors([CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
+  void test_invalidReferenceToThis_superInitializer() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  A(var x) {}",
+        "}",
+        "class B extends A {",
+        "  B() : super(this);",
+        "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
   void test_invalidReferenceToThis_topLevelFunction() {
     Source source = addSource("f() { return this; }");
     resolve(source);
@@ -7815,17 +8345,6 @@
     assertErrors([CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
-  void test_invalidTypeArgumentForKey() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {",
-        "    return const <int, int>{};",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_FOR_KEY]);
-    verify([source]);
-  }
   void test_invalidTypeArgumentInConstList() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<E> {",
@@ -7999,6 +8518,42 @@
     assertErrors([CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
     verify([source]);
   }
+  void test_mixinOfDisallowedClass_bool() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends Object with bool {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+  void test_mixinOfDisallowedClass_double() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends Object with double {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+  void test_mixinOfDisallowedClass_int() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends Object with int {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+  void test_mixinOfDisallowedClass_Null() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends Object with Null {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+  void test_mixinOfDisallowedClass_num() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends Object with num {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+  void test_mixinOfDisallowedClass_String() {
+    Source source = addSource(EngineTestCase.createSource(["class A extends Object with String {}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
   void test_mixinOfNonClass_class() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends Object with A {}"]));
     resolve(source);
@@ -8852,6 +9407,28 @@
     assertErrors([CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
     verify([source]);
   }
+  void test_undefinedFunction() {
+    Source source = addSource(EngineTestCase.createSource(["void f() {", "  g();", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.UNDEFINED_FUNCTION]);
+  }
+  void test_undefinedFunction_hasImportPrefix() {
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as f;", "main() { return f(); }"]));
+    addSource2("/lib.dart", "library lib;");
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.UNDEFINED_FUNCTION]);
+  }
+  void test_undefinedFunction_inCatch() {
+    Source source = addSource(EngineTestCase.createSource([
+        "void f() {",
+        "  try {",
+        "  } on Object {",
+        "    g();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.UNDEFINED_FUNCTION]);
+  }
   void test_undefinedNamedParameter() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -9033,6 +9610,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_ambiguousExport);
       });
+      _ut.test('test_ambiguousImport_function', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_function);
+      });
       _ut.test('test_argumentDefinitionTestNonParameter', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_argumentDefinitionTestNonParameter);
@@ -9093,6 +9674,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_conflictingGetterAndMethod_method_getter);
       });
+      _ut.test('test_constConstructorWithNonConstSuper_explicit', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constConstructorWithNonConstSuper_explicit);
+      });
+      _ut.test('test_constConstructorWithNonConstSuper_implicit', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constConstructorWithNonConstSuper_implicit);
+      });
       _ut.test('test_constConstructorWithNonFinalField_mixin', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_mixin);
@@ -9161,13 +9750,9 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_constEval_newInstance_constConstructor);
       });
-      _ut.test('test_constEval_propertyExtraction_methodInstance', () {
+      _ut.test('test_constEval_propertyExtraction_targetNotConst', () {
         final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEval_propertyExtraction_methodInstance);
-      });
-      _ut.test('test_constEval_propertyExtraction_methodStatic_targetInstance', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_constEval_propertyExtraction_methodStatic_targetInstance);
+        runJUnitTest(__test, __test.test_constEval_propertyExtraction_targetNotConst);
       });
       _ut.test('test_constFormalParameter_fieldFormalParameter', () {
         final __test = new CompileTimeErrorCodeTest();
@@ -9245,6 +9830,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_defaultValueInFunctionTypeAlias);
       });
+      _ut.test('test_defaultValueInFunctionTypedParameter_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_defaultValueInFunctionTypedParameter_named);
+      });
+      _ut.test('test_defaultValueInFunctionTypedParameter_optional', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_defaultValueInFunctionTypedParameter_optional);
+      });
       _ut.test('test_duplicateConstructorName_named', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_duplicateConstructorName_named);
@@ -9257,6 +9850,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_duplicateDefinition);
       });
+      _ut.test('test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter);
+      });
+      _ut.test('test_duplicateDefinitionInheritance_instanceGetter_staticGetter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceGetter_staticGetter);
+      });
       _ut.test('test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod);
@@ -9265,6 +9866,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceMethod_staticMethod);
       });
+      _ut.test('test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter);
+      });
+      _ut.test('test_duplicateDefinitionInheritance_instanceSetter_staticSetter', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_duplicateDefinitionInheritance_instanceSetter_staticSetter);
+      });
       _ut.test('test_duplicateDefinition_acrossLibraries', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_duplicateDefinition_acrossLibraries);
@@ -9305,6 +9914,30 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_exportOfNonLibrary);
       });
+      _ut.test('test_extendsDisallowedClass_Null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_Null);
+      });
+      _ut.test('test_extendsDisallowedClass_String', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_String);
+      });
+      _ut.test('test_extendsDisallowedClass_bool', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_bool);
+      });
+      _ut.test('test_extendsDisallowedClass_double', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_double);
+      });
+      _ut.test('test_extendsDisallowedClass_int', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_int);
+      });
+      _ut.test('test_extendsDisallowedClass_num', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsDisallowedClass_num);
+      });
       _ut.test('test_extendsNonClass_class', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_extendsNonClass_class);
@@ -9313,46 +9946,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_extendsNonClass_dynamic);
       });
-      _ut.test('test_extendsOrImplementsDisallowedClass_extends_String', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsOrImplementsDisallowedClass_extends_String);
-      });
-      _ut.test('test_extendsOrImplementsDisallowedClass_extends_bool', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsOrImplementsDisallowedClass_extends_bool);
-      });
-      _ut.test('test_extendsOrImplementsDisallowedClass_extends_double', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsOrImplementsDisallowedClass_extends_double);
-      });
-      _ut.test('test_extendsOrImplementsDisallowedClass_extends_int', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsOrImplementsDisallowedClass_extends_int);
-      });
-      _ut.test('test_extendsOrImplementsDisallowedClass_extends_num', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsOrImplementsDisallowedClass_extends_num);
-      });
-      _ut.test('test_extendsOrImplementsDisallowedClass_implements_String', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsOrImplementsDisallowedClass_implements_String);
-      });
-      _ut.test('test_extendsOrImplementsDisallowedClass_implements_bool', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsOrImplementsDisallowedClass_implements_bool);
-      });
-      _ut.test('test_extendsOrImplementsDisallowedClass_implements_double', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsOrImplementsDisallowedClass_implements_double);
-      });
-      _ut.test('test_extendsOrImplementsDisallowedClass_implements_int', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsOrImplementsDisallowedClass_implements_int);
-      });
-      _ut.test('test_extendsOrImplementsDisallowedClass_implements_num', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_extendsOrImplementsDisallowedClass_implements_num);
-      });
       _ut.test('test_extraPositionalArguments_const', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_extraPositionalArguments_const);
@@ -9373,10 +9966,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_fieldInitializedByMultipleInitializers_multipleNames);
       });
-      _ut.test('test_fieldInitializedInInitializerAndDeclaration_final', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_fieldInitializedInInitializerAndDeclaration_final);
-      });
       _ut.test('test_fieldInitializedInParameterAndInitializer', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_fieldInitializedInParameterAndInitializer);
@@ -9409,14 +9998,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_fieldInitializingFormalRedirectingConstructor);
       });
-      _ut.test('test_finalInitializedInDeclarationAndConstructor_initializers', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalInitializedInDeclarationAndConstructor_initializers);
-      });
-      _ut.test('test_finalInitializedInDeclarationAndConstructor_initializingFormal', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalInitializedInDeclarationAndConstructor_initializingFormal);
-      });
       _ut.test('test_finalInitializedMultipleTimes_initializers', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_finalInitializedMultipleTimes_initializers);
@@ -9433,6 +10014,30 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_getterAndMethodWithSameName);
       });
+      _ut.test('test_implementsDisallowedClass_Null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_Null);
+      });
+      _ut.test('test_implementsDisallowedClass_String', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_String);
+      });
+      _ut.test('test_implementsDisallowedClass_bool', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_bool);
+      });
+      _ut.test('test_implementsDisallowedClass_double', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_double);
+      });
+      _ut.test('test_implementsDisallowedClass_int', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_int);
+      });
+      _ut.test('test_implementsDisallowedClass_num', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsDisallowedClass_num);
+      });
       _ut.test('test_implementsDynamic', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_implementsDynamic);
@@ -9573,9 +10178,13 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidAnnotation_staticMethodReference);
       });
-      _ut.test('test_invalidConstructorName_notEnclosingClassName', () {
+      _ut.test('test_invalidConstructorName_notEnclosingClassName_defined', () {
         final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidConstructorName_notEnclosingClassName);
+        runJUnitTest(__test, __test.test_invalidConstructorName_notEnclosingClassName_defined);
+      });
+      _ut.test('test_invalidConstructorName_notEnclosingClassName_undefined', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidConstructorName_notEnclosingClassName_undefined);
       });
       _ut.test('test_invalidFactoryNameNotAClass_notClassName', () {
         final __test = new CompileTimeErrorCodeTest();
@@ -9585,22 +10194,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidFactoryNameNotAClass_notEnclosingClassName);
       });
-      _ut.test('test_invalidOverrideNamed_fewerNamedParameters', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidOverrideNamed_fewerNamedParameters);
-      });
-      _ut.test('test_invalidOverrideNamed_missingNamedParameter', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidOverrideNamed_missingNamedParameter);
-      });
-      _ut.test('test_invalidOverridePositional', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidOverridePositional);
-      });
-      _ut.test('test_invalidOverrideRequired', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidOverrideRequired);
-      });
       _ut.test('test_invalidReferenceToThis_factoryConstructor', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidReferenceToThis_factoryConstructor);
@@ -9621,6 +10214,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidReferenceToThis_staticVariableInitializer);
       });
+      _ut.test('test_invalidReferenceToThis_superInitializer', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_invalidReferenceToThis_superInitializer);
+      });
       _ut.test('test_invalidReferenceToThis_topLevelFunction', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidReferenceToThis_topLevelFunction);
@@ -9629,10 +10226,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidReferenceToThis_variableInitializer);
       });
-      _ut.test('test_invalidTypeArgumentForKey', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_invalidTypeArgumentForKey);
-      });
       _ut.test('test_invalidTypeArgumentInConstList', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidTypeArgumentInConstList);
@@ -9721,6 +10314,30 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_mixinInheritsFromNotObject_typedef_with);
       });
+      _ut.test('test_mixinOfDisallowedClass_Null', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_Null);
+      });
+      _ut.test('test_mixinOfDisallowedClass_String', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_String);
+      });
+      _ut.test('test_mixinOfDisallowedClass_bool', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_bool);
+      });
+      _ut.test('test_mixinOfDisallowedClass_double', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_double);
+      });
+      _ut.test('test_mixinOfDisallowedClass_int', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_int);
+      });
+      _ut.test('test_mixinOfDisallowedClass_num', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfDisallowedClass_num);
+      });
       _ut.test('test_mixinOfNonClass_class', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_mixinOfNonClass_class);
@@ -10113,6 +10730,18 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_implicit);
       });
+      _ut.test('test_undefinedFunction', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_undefinedFunction);
+      });
+      _ut.test('test_undefinedFunction_hasImportPrefix', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_undefinedFunction_hasImportPrefix);
+      });
+      _ut.test('test_undefinedFunction_inCatch', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_undefinedFunction_inCatch);
+      });
       _ut.test('test_undefinedNamedParameter', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_undefinedNamedParameter);
@@ -10328,7 +10957,7 @@
       return null;
     } else if (parent is ConstructorFieldInitializer && identical(node, ((parent as ConstructorFieldInitializer)).fieldName)) {
       return null;
-    } else if (node.element is PrefixElement) {
+    } else if (node.staticElement is PrefixElement) {
       return null;
     }
     return super.visitSimpleIdentifier(node);
@@ -10345,7 +10974,7 @@
     if (node != null) {
       ASTNode root = node.root;
       if (root is CompilationUnit) {
-        CompilationUnit rootCU = (root as CompilationUnit);
+        CompilationUnit rootCU = root as CompilationUnit;
         if (rootCU.element != null) {
           return rootCU.element.source.fullName;
         } else {
@@ -10667,7 +11296,7 @@
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = ASTFactory.constructorName(ASTFactory.typeName(classA, []), constructorName);
     resolveNode(name, []);
-    JUnitTestCase.assertSame(constructor, name.element);
+    JUnitTestCase.assertSame(constructor, name.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitConstructorName_unnamed() {
@@ -10677,7 +11306,7 @@
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = ASTFactory.constructorName(ASTFactory.typeName(classA, []), constructorName);
     resolveNode(name, []);
-    JUnitTestCase.assertSame(constructor, name.element);
+    JUnitTestCase.assertSame(constructor, name.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitContinueStatement_withLabel() {
@@ -10704,7 +11333,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.fields = <FieldElement> [ElementFactory.fieldElement(fieldName, false, false, false, intType)];
     FieldFormalParameter parameter = ASTFactory.fieldFormalParameter3(fieldName);
-    parameter.identifier.element = ElementFactory.fieldFormalParameter(parameter.identifier);
+    parameter.identifier.staticElement = ElementFactory.fieldFormalParameter(parameter.identifier);
     resolveInClass(parameter, classA);
     JUnitTestCase.assertSame(intType, parameter.element.type);
   }
@@ -10752,10 +11381,10 @@
     ConstructorElement constructor = ElementFactory.constructorElement(classA, constructorName);
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = ASTFactory.constructorName(ASTFactory.typeName(classA, []), constructorName);
-    name.element = constructor;
+    name.staticElement = constructor;
     InstanceCreationExpression creation = ASTFactory.instanceCreationExpression(Keyword.NEW, name, []);
     resolveNode(creation, []);
-    JUnitTestCase.assertSame(constructor, creation.element);
+    JUnitTestCase.assertSame(constructor, creation.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitInstanceCreationExpression_unnamed() {
@@ -10764,10 +11393,10 @@
     ConstructorElement constructor = ElementFactory.constructorElement(classA, constructorName);
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = ASTFactory.constructorName(ASTFactory.typeName(classA, []), constructorName);
-    name.element = constructor;
+    name.staticElement = constructor;
     InstanceCreationExpression creation = ASTFactory.instanceCreationExpression(Keyword.NEW, name, []);
     resolveNode(creation, []);
-    JUnitTestCase.assertSame(constructor, creation.element);
+    JUnitTestCase.assertSame(constructor, creation.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitInstanceCreationExpression_unnamed_namedParameter() {
@@ -10779,11 +11408,11 @@
     constructor.parameters = <ParameterElement> [parameter];
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = ASTFactory.constructorName(ASTFactory.typeName(classA, []), constructorName);
-    name.element = constructor;
+    name.staticElement = constructor;
     InstanceCreationExpression creation = ASTFactory.instanceCreationExpression(Keyword.NEW, name, [ASTFactory.namedExpression2(parameterName, ASTFactory.integer(0))]);
     resolveNode(creation, []);
-    JUnitTestCase.assertSame(constructor, creation.element);
-    JUnitTestCase.assertSame(parameter, ((creation.argumentList.arguments[0] as NamedExpression)).name.label.element);
+    JUnitTestCase.assertSame(constructor, creation.staticElement);
+    JUnitTestCase.assertSame(parameter, ((creation.argumentList.arguments[0] as NamedExpression)).name.label.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitMethodInvocation() {
@@ -10793,7 +11422,7 @@
     String methodName = "abs";
     MethodInvocation invocation = ASTFactory.methodInvocation(left, methodName, []);
     resolveNode(invocation, []);
-    JUnitTestCase.assertSame(getMethod(numType, methodName), invocation.methodName.element);
+    JUnitTestCase.assertSame(getMethod(numType, methodName), invocation.methodName.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitMethodInvocation_namedParameter() {
@@ -10808,8 +11437,8 @@
     left.staticType = classA.type;
     MethodInvocation invocation = ASTFactory.methodInvocation(left, methodName, [ASTFactory.namedExpression2(parameterName, ASTFactory.integer(0))]);
     resolveNode(invocation, []);
-    JUnitTestCase.assertSame(method, invocation.methodName.element);
-    JUnitTestCase.assertSame(parameter, ((invocation.argumentList.arguments[0] as NamedExpression)).name.label.element);
+    JUnitTestCase.assertSame(method, invocation.methodName.staticElement);
+    JUnitTestCase.assertSame(parameter, ((invocation.argumentList.arguments[0] as NamedExpression)).name.label.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitPostfixExpression() {
@@ -10826,12 +11455,12 @@
     SimpleIdentifier target = ASTFactory.identifier3("a");
     VariableElementImpl variable = ElementFactory.localVariableElement(target);
     variable.type = dynamicType;
-    target.element = variable;
+    target.staticElement = variable;
     target.staticType = dynamicType;
     PrefixedIdentifier identifier = ASTFactory.identifier(target, ASTFactory.identifier3("b"));
     resolveNode(identifier, []);
-    JUnitTestCase.assertNull(identifier.element);
-    JUnitTestCase.assertNull(identifier.identifier.element);
+    JUnitTestCase.assertNull(identifier.staticElement);
+    JUnitTestCase.assertNull(identifier.identifier.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitPrefixedIdentifier_nonDynamic() {
@@ -10842,12 +11471,12 @@
     SimpleIdentifier target = ASTFactory.identifier3("a");
     VariableElementImpl variable = ElementFactory.localVariableElement(target);
     variable.type = classA.type;
-    target.element = variable;
+    target.staticElement = variable;
     target.staticType = classA.type;
     PrefixedIdentifier identifier = ASTFactory.identifier(target, ASTFactory.identifier3(getterName));
     resolveNode(identifier, []);
-    JUnitTestCase.assertSame(getter, identifier.element);
-    JUnitTestCase.assertSame(getter, identifier.identifier.element);
+    JUnitTestCase.assertSame(getter, identifier.staticElement);
+    JUnitTestCase.assertSame(getter, identifier.identifier.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitPrefixExpression() {
@@ -10868,7 +11497,7 @@
     target.staticType = classA.type;
     PropertyAccess access = ASTFactory.propertyAccess2(target, getterName);
     resolveNode(access, []);
-    JUnitTestCase.assertSame(getter, access.propertyName.element);
+    JUnitTestCase.assertSame(getter, access.propertyName.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitPropertyAccess_getter_super() {
@@ -10881,7 +11510,7 @@
     PropertyAccess access = ASTFactory.propertyAccess2(target, getterName);
     ASTFactory.methodDeclaration2(null, null, null, null, ASTFactory.identifier3("m"), ASTFactory.formalParameterList([]), ASTFactory.expressionFunctionBody(access));
     resolveNode(access, []);
-    JUnitTestCase.assertSame(getter, access.propertyName.element);
+    JUnitTestCase.assertSame(getter, access.propertyName.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitPropertyAccess_setter_this() {
@@ -10894,7 +11523,7 @@
     PropertyAccess access = ASTFactory.propertyAccess2(target, setterName);
     ASTFactory.assignmentExpression(access, TokenType.EQ, ASTFactory.integer(0));
     resolveNode(access, []);
-    JUnitTestCase.assertSame(setter, access.propertyName.element);
+    JUnitTestCase.assertSame(setter, access.propertyName.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitSimpleIdentifier_classScope() {
@@ -10902,7 +11531,14 @@
     String fieldName = "NAN";
     SimpleIdentifier node = ASTFactory.identifier3(fieldName);
     resolveInClass(node, doubleType.element);
-    JUnitTestCase.assertEquals(getGetter(doubleType, fieldName), node.element);
+    JUnitTestCase.assertEquals(getGetter(doubleType, fieldName), node.staticElement);
+    _listener.assertNoErrors();
+  }
+  void test_visitSimpleIdentifier_dynamic() {
+    SimpleIdentifier node = ASTFactory.identifier3("dynamic");
+    resolve4(node, []);
+    JUnitTestCase.assertSame(_typeProvider.dynamicType.element, node.staticElement);
+    JUnitTestCase.assertSame(_typeProvider.typeType, node.staticType);
     _listener.assertNoErrors();
   }
   void test_visitSimpleIdentifier_lexicalScope() {
@@ -10921,7 +11557,7 @@
     SimpleIdentifier node = ASTFactory.identifier3(fieldName);
     ASTFactory.assignmentExpression(node, TokenType.EQ, ASTFactory.integer(0));
     resolveInClass(node, classA);
-    Element element = node.element;
+    Element element = node.staticElement;
     EngineTestCase.assertInstanceOf(PropertyAccessorElement, element);
     JUnitTestCase.assertTrue(((element as PropertyAccessorElement)).isSetter);
     _listener.assertNoErrors();
@@ -10951,7 +11587,7 @@
     SuperConstructorInvocation invocation = ASTFactory.superConstructorInvocation([ASTFactory.namedExpression2(parameterName, ASTFactory.integer(0))]);
     resolveInClass(invocation, subclass);
     JUnitTestCase.assertEquals(superConstructor, invocation.element);
-    JUnitTestCase.assertSame(parameter, ((invocation.argumentList.arguments[0] as NamedExpression)).name.label.element);
+    JUnitTestCase.assertSame(parameter, ((invocation.argumentList.arguments[0] as NamedExpression)).name.label.staticElement);
     _listener.assertNoErrors();
   }
 
@@ -10990,7 +11626,7 @@
    */
   Element resolve(BreakStatement statement, LabelElementImpl labelElement) {
     resolveStatement(statement, labelElement);
-    return statement.label.element;
+    return statement.label.staticElement;
   }
 
   /**
@@ -11003,7 +11639,7 @@
    */
   Element resolve3(ContinueStatement statement, LabelElementImpl labelElement) {
     resolveStatement(statement, labelElement);
-    return statement.label.element;
+    return statement.label.staticElement;
   }
 
   /**
@@ -11017,7 +11653,7 @@
    */
   Element resolve4(Identifier node, List<Element> definedElements) {
     resolveNode(node, definedElements);
-    return node.element;
+    return node.staticElement;
   }
 
   /**
@@ -11231,6 +11867,10 @@
         final __test = new ElementResolverTest();
         runJUnitTest(__test, __test.test_visitSimpleIdentifier_classScope);
       });
+      _ut.test('test_visitSimpleIdentifier_dynamic', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitSimpleIdentifier_dynamic);
+      });
       _ut.test('test_visitSimpleIdentifier_lexicalScope', () {
         final __test = new ElementResolverTest();
         runJUnitTest(__test, __test.test_visitSimpleIdentifier_lexicalScope);
@@ -11573,18 +12213,6 @@
         StaticWarningCode.AMBIGUOUS_IMPORT,
         CompileTimeErrorCode.EXTENDS_NON_CLASS]);
   }
-  void test_ambiguousImport_function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "g() { return f(); }"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f() {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f() {}"]));
-    resolve(source);
-    assertErrors([
-        StaticWarningCode.AMBIGUOUS_IMPORT,
-        StaticTypeWarningCode.UNDEFINED_FUNCTION]);
-  }
   void test_ambiguousImport_implements() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -11774,6 +12402,17 @@
     assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+  void test_argumentTypeNotAssignable_invocation_functionTypes_optional() {
+    Source source = addSource(EngineTestCase.createSource([
+        "void acceptFunNumOptBool(void funNumOptBool([bool b])) {}",
+        "void funNumBool(bool b) {}",
+        "main() {",
+        "  acceptFunNumOptBool(funNumBool);",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
   void test_argumentTypeNotAssignable_invocation_generic() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<T> {",
@@ -11870,8 +12509,7 @@
         "  static const v = 0;",
         "}",
         "f() {",
-        "  A a = new A();",
-        "  a.v = 1;",
+        "  A.v = 1;",
         "}"]));
     resolve(source);
     assertErrors([StaticWarningCode.ASSIGNMENT_TO_CONST]);
@@ -12155,6 +12793,16 @@
     assertErrors([StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS]);
     verify([source]);
   }
+  void test_fieldInitializedInInitializerAndDeclaration_final() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  final int x = 0;",
+        "  A() : x = 1 {}",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
+    verify([source]);
+  }
   void test_fieldInitializerNotAssignable() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A() : x = '';", "}"]));
     resolve(source);
@@ -12167,6 +12815,28 @@
     assertErrors([StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE]);
     verify([source]);
   }
+
+  /**
+   * This test doesn't test the FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR code, but tests the
+   * FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION code instead. It is provided here to show
+   * coverage over all of the permutations of initializers in constructor declarations.
+   *
+   * Note: FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION covers a subset of
+   * FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, since it more specific, we use it instead of
+   * the broader code
+   */
+  void test_finalInitializedInDeclarationAndConstructor_initializers() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x = 0;", "  A() : x = 0 {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
+    verify([source]);
+  }
+  void test_finalInitializedInDeclarationAndConstructor_initializingFormal() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x = 0;", "  A(this.x) {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR]);
+    verify([source]);
+  }
   void test_finalNotInitialized_inConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x;", "  A() {}", "}"]));
     resolve(source);
@@ -12509,6 +13179,54 @@
     assertErrors([StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL]);
     verify([source]);
   }
+  void test_invalidOverrideNamed_fewerNamedParameters() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m({a, b}) {}",
+        "}",
+        "class B extends A {",
+        "  m({a}) {}",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_OVERRIDE_NAMED]);
+    verify([source]);
+  }
+  void test_invalidOverrideNamed_missingNamedParameter() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m({a, b}) {}",
+        "}",
+        "class B extends A {",
+        "  m({a, c}) {}",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_OVERRIDE_NAMED]);
+    verify([source]);
+  }
+  void test_invalidOverridePositional() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m([a, b]) {}",
+        "}",
+        "class B extends A {",
+        "  m([a]) {}",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
+    verify([source]);
+  }
+  void test_invalidOverrideRequired() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m(a) {}",
+        "}",
+        "class B extends A {",
+        "  m(a, b) {}",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.INVALID_OVERRIDE_REQUIRED]);
+    verify([source]);
+  }
   void test_invalidSetterOverrideNormalParamType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -13041,6 +13759,41 @@
     assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER]);
     verify([source]);
   }
+  void test_undefinedIdentifier_hideInBlock_function() {
+    Source source = addSource(EngineTestCase.createSource([
+        "var v = 1;",
+        "main() {",
+        "  print(v);",
+        "  v() {}",
+        "}",
+        "print(x) {}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
+  void test_undefinedIdentifier_hideInBlock_local() {
+    Source source = addSource(EngineTestCase.createSource([
+        "var v = 1;",
+        "main() {",
+        "  print(v);",
+        "  var v = 2;",
+        "}",
+        "print(x) {}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
+  void test_undefinedIdentifier_hideInBlock_subBlock() {
+    Source source = addSource(EngineTestCase.createSource([
+        "var v = 1;",
+        "main() {",
+        "  {",
+        "    print(v);",
+        "  }",
+        "  var v = 2;",
+        "}",
+        "print(x) {}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
   void test_undefinedIdentifier_initializer() {
     Source source = addSource(EngineTestCase.createSource(["var a = b;"]));
     resolve(source);
@@ -13067,6 +13820,17 @@
     resolve(source);
     assertErrors([StaticWarningCode.UNDEFINED_NAMED_PARAMETER]);
   }
+  void test_undefinedSetter() {
+    Source source1 = addSource2("lib.dart", "");
+    Source source2 = addSource2("lib2.dart", EngineTestCase.createSource([
+        "import 'lib.dart' as lib;",
+        "void f() {",
+        "  lib.gg = null;",
+        "}"]));
+    resolve(source1);
+    resolve(source2);
+    assertErrors([StaticWarningCode.UNDEFINED_SETTER]);
+  }
   static dartSuite() {
     _ut.group('StaticWarningCodeTest', () {
       _ut.test('test_ambiguousImport_as', () {
@@ -13077,10 +13841,6 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_ambiguousImport_extends);
       });
-      _ut.test('test_ambiguousImport_function', () {
-        final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_ambiguousImport_function);
-      });
       _ut.test('test_ambiguousImport_implements', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_ambiguousImport_implements);
@@ -13145,6 +13905,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_functionParameter);
       });
+      _ut.test('test_argumentTypeNotAssignable_invocation_functionTypes_optional', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_functionTypes_optional);
+      });
       _ut.test('test_argumentTypeNotAssignable_invocation_generic', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_generic);
@@ -13305,6 +14069,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_extraPositionalArguments);
       });
+      _ut.test('test_fieldInitializedInInitializerAndDeclaration_final', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_fieldInitializedInInitializerAndDeclaration_final);
+      });
       _ut.test('test_fieldInitializerNotAssignable', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_fieldInitializerNotAssignable);
@@ -13313,6 +14081,14 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_fieldInitializingFormalNotAssignable);
       });
+      _ut.test('test_finalInitializedInDeclarationAndConstructor_initializers', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_finalInitializedInDeclarationAndConstructor_initializers);
+      });
+      _ut.test('test_finalInitializedInDeclarationAndConstructor_initializingFormal', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_finalInitializedInDeclarationAndConstructor_initializingFormal);
+      });
       _ut.test('test_finalNotInitialized_inConstructor', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_finalNotInitialized_inConstructor);
@@ -13437,6 +14213,22 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidOverrideDifferentDefaultValues_positional);
       });
+      _ut.test('test_invalidOverrideNamed_fewerNamedParameters', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidOverrideNamed_fewerNamedParameters);
+      });
+      _ut.test('test_invalidOverrideNamed_missingNamedParameter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidOverrideNamed_missingNamedParameter);
+      });
+      _ut.test('test_invalidOverridePositional', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidOverridePositional);
+      });
+      _ut.test('test_invalidOverrideRequired', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidOverrideRequired);
+      });
       _ut.test('test_invalidSetterOverrideNormalParamType', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidSetterOverrideNormalParamType);
@@ -13677,6 +14469,18 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedIdentifier_function_prefix);
       });
+      _ut.test('test_undefinedIdentifier_hideInBlock_function', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedIdentifier_hideInBlock_function);
+      });
+      _ut.test('test_undefinedIdentifier_hideInBlock_local', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedIdentifier_hideInBlock_local);
+      });
+      _ut.test('test_undefinedIdentifier_hideInBlock_subBlock', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedIdentifier_hideInBlock_subBlock);
+      });
       _ut.test('test_undefinedIdentifier_initializer', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedIdentifier_initializer);
@@ -13697,6 +14501,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedNamedParameter);
       });
+      _ut.test('test_undefinedSetter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedSetter);
+      });
     });
   }
 }
@@ -13801,6 +14609,11 @@
   InterfaceType _mapType;
 
   /**
+   * The type representing the built-in type 'Null'.
+   */
+  InterfaceType _nullType;
+
+  /**
    * The type representing the built-in type 'num'.
    */
   InterfaceType _numType;
@@ -13913,6 +14726,12 @@
     }
     return _mapType;
   }
+  InterfaceType get nullType {
+    if (_nullType == null) {
+      _nullType = ElementFactory.classElement2("Null", []).type;
+    }
+    return _nullType;
+  }
   InterfaceType get numType {
     if (_numType == null) {
       initializeNumericTypes();
@@ -13923,16 +14742,14 @@
     if (_objectType == null) {
       ClassElementImpl objectElement = ElementFactory.object;
       _objectType = objectElement.type;
-      if (objectElement.methods.length == 0) {
-        objectElement.constructors = <ConstructorElement> [ElementFactory.constructorElement(objectElement, null)];
-        objectElement.methods = <MethodElement> [
-            ElementFactory.methodElement("toString", stringType, []),
-            ElementFactory.methodElement("==", boolType, [_objectType]),
-            ElementFactory.methodElement("noSuchMethod", dynamicType, [dynamicType])];
-        objectElement.accessors = <PropertyAccessorElement> [
-            ElementFactory.getterElement("hashCode", false, intType),
-            ElementFactory.getterElement("runtimeType", false, typeType)];
-      }
+      objectElement.constructors = <ConstructorElement> [ElementFactory.constructorElement(objectElement, null)];
+      objectElement.methods = <MethodElement> [
+          ElementFactory.methodElement("toString", stringType, []),
+          ElementFactory.methodElement("==", boolType, [_objectType]),
+          ElementFactory.methodElement("noSuchMethod", dynamicType, [dynamicType])];
+      objectElement.accessors = <PropertyAccessorElement> [
+          ElementFactory.getterElement("hashCode", false, intType),
+          ElementFactory.getterElement("runtimeType", false, typeType)];
     }
     return _objectType;
   }
@@ -14102,6 +14919,7 @@
         provider.intType.element,
         provider.listType.element,
         provider.mapType.element,
+        provider.nullType.element,
         provider.numType.element,
         provider.objectType.element,
         provider.stackTraceType.element,
@@ -14368,7 +15186,7 @@
     if (prefix == null) {
       return null;
     }
-    return checkResolved2(prefix, prefix.element, PrefixElement);
+    return checkResolved2(prefix, prefix.staticElement, PrefixElement);
   }
   Object visitIndexExpression(IndexExpression node) {
     node.visitChildren(this);
@@ -14400,7 +15218,7 @@
     if (prefixType == null || prefixType.isDynamic) {
       return null;
     }
-    return checkResolved(node, node.element);
+    return checkResolved(node, node.staticElement);
   }
   Object visitPrefixExpression(PrefixExpression node) {
     node.visitChildren(this);
@@ -14428,7 +15246,7 @@
     }
     ASTNode parent = node.parent;
     if (parent is MethodInvocation) {
-      MethodInvocation invocation = (parent as MethodInvocation);
+      MethodInvocation invocation = parent as MethodInvocation;
       if (identical(invocation.methodName, node)) {
         Expression target = invocation.realTarget;
         Type2 targetType = target == null ? null : target.staticType;
@@ -14437,7 +15255,7 @@
         }
       }
     }
-    return checkResolved(node, node.element);
+    return checkResolved(node, node.staticElement);
   }
   Object checkResolved(ASTNode node, Element element) => checkResolved2(node, element, null);
   Object checkResolved2(ASTNode node, Element element, Type expectedClass) {
@@ -14456,7 +15274,7 @@
     if (node != null) {
       ASTNode root = node.root;
       if (root is CompilationUnit) {
-        CompilationUnit rootCU = (root as CompilationUnit);
+        CompilationUnit rootCU = root as CompilationUnit;
         if (rootCU.element != null) {
           return rootCU.element.source.fullName;
         } else {
@@ -14978,7 +15796,7 @@
     Type2 boolType = _typeProvider.boolType;
     PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
     PrefixedIdentifier node = ASTFactory.identifier5("a", "b");
-    node.identifier.element = getter;
+    node.identifier.staticElement = getter;
     JUnitTestCase.assertSame(boolType, analyze(node));
     _listener.assertNoErrors();
   }
@@ -14987,7 +15805,7 @@
     FieldElementImpl field = ElementFactory.fieldElement("b", false, false, false, boolType);
     PropertyAccessorElement setter = field.setter;
     PrefixedIdentifier node = ASTFactory.identifier5("a", "b");
-    node.identifier.element = setter;
+    node.identifier.staticElement = setter;
     JUnitTestCase.assertSame(boolType, analyze(node));
     _listener.assertNoErrors();
   }
@@ -14995,7 +15813,7 @@
     VariableElementImpl variable = ElementFactory.localVariableElement2("b");
     variable.type = _typeProvider.boolType;
     PrefixedIdentifier node = ASTFactory.identifier5("a", "b");
-    node.identifier.element = variable;
+    node.identifier.staticElement = variable;
     JUnitTestCase.assertSame(_typeProvider.boolType, analyze(node));
     _listener.assertNoErrors();
   }
@@ -15041,7 +15859,7 @@
     Type2 boolType = _typeProvider.boolType;
     PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
     PropertyAccess node = ASTFactory.propertyAccess2(ASTFactory.identifier3("a"), "b");
-    node.propertyName.element = getter;
+    node.propertyName.staticElement = getter;
     JUnitTestCase.assertSame(boolType, analyze(node));
     _listener.assertNoErrors();
   }
@@ -15050,7 +15868,7 @@
     FieldElementImpl field = ElementFactory.fieldElement("b", false, false, false, boolType);
     PropertyAccessorElement setter = field.setter;
     PropertyAccess node = ASTFactory.propertyAccess2(ASTFactory.identifier3("a"), "b");
-    node.propertyName.element = setter;
+    node.propertyName.staticElement = setter;
     JUnitTestCase.assertSame(boolType, analyze(node));
     _listener.assertNoErrors();
   }
@@ -15130,7 +15948,7 @@
    */
   Type2 analyze3(FormalParameter node) {
     node.accept(_analyzer);
-    return ((node.identifier.element as ParameterElement)).type;
+    return ((node.identifier.staticElement as ParameterElement)).type;
   }
 
   /**
@@ -15190,7 +16008,7 @@
   void assertType2(Type2 expectedType, Type2 actualType) {
     if (expectedType is InterfaceTypeImpl) {
       EngineTestCase.assertInstanceOf(InterfaceTypeImpl, actualType);
-      assertType((expectedType as InterfaceTypeImpl), (actualType as InterfaceTypeImpl));
+      assertType(expectedType as InterfaceTypeImpl, actualType as InterfaceTypeImpl);
     }
   }
 
@@ -15247,7 +16065,7 @@
       ParameterElementImpl element = new ParameterElementImpl.con1(parameter.identifier);
       element.parameterKind = parameter.kind;
       element.type = _typeProvider.dynamicType;
-      parameter.identifier.element = element;
+      parameter.identifier.staticElement = element;
       parameterElements.add(element);
     }
     FunctionExpression node = ASTFactory.functionExpression2(parameters2, body);
@@ -15293,7 +16111,7 @@
     SimpleIdentifier identifier = ASTFactory.identifier3(variableName);
     VariableElementImpl element = ElementFactory.localVariableElement(identifier);
     element.type = type2;
-    identifier.element = element;
+    identifier.staticElement = element;
     identifier.staticType = type2;
     return identifier;
   }
@@ -15306,10 +16124,10 @@
    */
   void setType(FormalParameter parameter, Type2 type2) {
     SimpleIdentifier identifier = parameter.identifier;
-    Element element = identifier.element;
+    Element element = identifier.staticElement;
     if (element is! ParameterElement) {
       element = new ParameterElementImpl.con1(identifier);
-      identifier.element = element;
+      identifier.staticElement = element;
     }
     ((element as ParameterElementImpl)).type = type2;
   }
@@ -15611,7 +16429,7 @@
     verify([source]);
   }
   void test_unusedImport_export_infiniteLoop() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two one;"]));
+    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two two;"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
     addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "export 'lib3.dart';", "class Two {}"]));
     addSource2("/lib3.dart", EngineTestCase.createSource(["library lib3;", "export 'lib2.dart';", "class Three {}"]));
@@ -15620,7 +16438,7 @@
     verify([source]);
   }
   void test_unusedImport_export2() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two one;"]));
+    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Three three;"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
     addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "export 'lib3.dart';", "class Two {}"]));
     addSource2("/lib3.dart", EngineTestCase.createSource(["library lib3;", "class Three {}"]));
@@ -15628,6 +16446,22 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_unusedImport_prefix_topLevelFunction() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart' hide topLevelFunction;",
+        "import 'lib1.dart' as one show topLevelFunction;",
+        "class A {",
+        "  static void x() {",
+        "    One o;",
+        "    one.topLevelFunction();",
+        "  }",
+        "}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class One {}", "topLevelFunction() {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   static dartSuite() {
     _ut.group('NonHintCodeTest', () {
       _ut.test('test_deadCode_deadCatch_onCatchSubtype', () {
@@ -15646,6 +16480,10 @@
         final __test = new NonHintCodeTest();
         runJUnitTest(__test, __test.test_unusedImport_export_infiniteLoop);
       });
+      _ut.test('test_unusedImport_prefix_topLevelFunction', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_prefix_topLevelFunction);
+      });
     });
   }
 }
@@ -16555,7 +17393,7 @@
     CompilationUnit unit = resolveCompilationUnit(source, library);
     JUnitTestCase.assertNotNull(unit);
     ClassDeclaration classDeclaration = unit.declarations[0] as ClassDeclaration;
-    MethodDeclaration methodDeclaration = (classDeclaration.members[0] as MethodDeclaration);
+    MethodDeclaration methodDeclaration = classDeclaration.members[0] as MethodDeclaration;
     Block block = ((methodDeclaration.body as BlockFunctionBody)).block;
     ExpressionStatement statement = block.statements[0] as ExpressionStatement;
     MethodInvocation invocation = statement.expression as MethodInvocation;
diff --git a/pkg/analyzer_experimental/test/generated/scanner_test.dart b/pkg/analyzer_experimental/test/generated/scanner_test.dart
index e3dbb64..6317f92 100644
--- a/pkg/analyzer_experimental/test/generated/scanner_test.dart
+++ b/pkg/analyzer_experimental/test/generated/scanner_test.dart
@@ -2147,7 +2147,7 @@
   }
   Token scan(String source, GatheringErrorListener listener);
   void assertComment(TokenType commentType, String source) {
-    Token token = scan2("${source}\n");
+    Token token = scan2(source);
     JUnitTestCase.assertNotNull(token);
     JUnitTestCase.assertEquals(TokenType.EOF, token.type);
     Token comment = token.precedingComments;
@@ -2156,6 +2156,15 @@
     JUnitTestCase.assertEquals(0, comment.offset);
     JUnitTestCase.assertEquals(source.length, comment.length);
     JUnitTestCase.assertEquals(source, comment.lexeme);
+    token = scan2("${source}\n");
+    JUnitTestCase.assertNotNull(token);
+    JUnitTestCase.assertEquals(TokenType.EOF, token.type);
+    comment = token.precedingComments;
+    JUnitTestCase.assertNotNull(comment);
+    JUnitTestCase.assertEquals(commentType, comment.type);
+    JUnitTestCase.assertEquals(0, comment.offset);
+    JUnitTestCase.assertEquals(source.length, comment.length);
+    JUnitTestCase.assertEquals(source, comment.lexeme);
   }
 
   /**
diff --git a/pkg/analyzer_experimental/test/generated/test_support.dart b/pkg/analyzer_experimental/test/generated/test_support.dart
index 8ec0c66..6d7ae8f 100644
--- a/pkg/analyzer_experimental/test/generated/test_support.dart
+++ b/pkg/analyzer_experimental/test/generated/test_support.dart
@@ -1,9 +1,7 @@
 // This code was auto-generated, is not intended to be edited, and is subject to
 // significant change. Please see the README file for more information.
 library engine.test_support;
-import 'dart:collection';
 import 'package:analyzer_experimental/src/generated/java_core.dart';
-import 'package:analyzer_experimental/src/generated/java_engine.dart';
 import 'package:analyzer_experimental/src/generated/java_junit.dart';
 import 'package:analyzer_experimental/src/generated/source.dart';
 import 'package:analyzer_experimental/src/generated/error.dart';
@@ -506,7 +504,7 @@
    * @param expectedElements the expected elements
    * @throws AssertionFailedError if the list is `null` or does not have the expected elements
    */
-  static void assertExactElements(List<Object> list, List<Object> expectedElements) {
+  static void assertExactElements(List list, List<Object> expectedElements) {
     int expectedSize = expectedElements.length;
     if (list == null) {
       JUnitTestCase.fail("Expected list of size ${expectedSize}; found null");
@@ -555,7 +553,7 @@
    * @param expectedElements the expected elements
    * @throws AssertionFailedError if the list is `null` or does not have the expected elements
    */
-  static void assertExactElements3(Set<Object> set, List<Object> expectedElements) {
+  static void assertExactElements3(Set set, List<Object> expectedElements) {
     int expectedSize = expectedElements.length;
     if (set == null) {
       JUnitTestCase.fail("Expected list of size ${expectedSize}; found null");
@@ -629,7 +627,7 @@
    * @throws AssertionFailedError if the list is `null` or does not have the expected number
    *           of elements
    */
-  static void assertSize(int expectedSize, List<Object> list) {
+  static void assertSize(int expectedSize, List list) {
     if (list == null) {
       JUnitTestCase.fail("Expected list of size ${expectedSize}; found null");
     } else if (list.length != expectedSize) {
@@ -645,7 +643,7 @@
    * @throws AssertionFailedError if the map is `null` or does not have the expected number of
    *           elements
    */
-  static void assertSize2(int expectedSize, Map<Object, Object> map) {
+  static void assertSize2(int expectedSize, Map map) {
     if (map == null) {
       JUnitTestCase.fail("Expected map of size ${expectedSize}; found null");
     } else if (map.length != expectedSize) {
@@ -661,7 +659,7 @@
    * @throws AssertionFailedError if the set is `null` or does not have the expected number of
    *           elements
    */
-  static void assertSize3(int expectedSize, Set<Object> set) {
+  static void assertSize3(int expectedSize, Set set) {
     if (set == null) {
       JUnitTestCase.fail("Expected set of size ${expectedSize}; found null");
     } else if (set.length != expectedSize) {
diff --git a/pkg/analyzer_experimental/test/options_test.dart b/pkg/analyzer_experimental/test/options_test.dart
index e885cda..67b8467 100644
--- a/pkg/analyzer_experimental/test/options_test.dart
+++ b/pkg/analyzer_experimental/test/options_test.dart
@@ -5,7 +5,7 @@
 library options_test;
 
 import 'package:unittest/unittest.dart';
-import 'package:analyzer_experimental/options.dart';
+//import 'package:analyzer_experimental/options.dart';
 
 main() {
 
diff --git a/pkg/barback/lib/src/phase.dart b/pkg/barback/lib/src/phase.dart
index a73ee00..48fd46f 100644
--- a/pkg/barback/lib/src/phase.dart
+++ b/pkg/barback/lib/src/phase.dart
@@ -165,7 +165,7 @@
   }
 
   /// Remove all phases after this one.
-  Phase removeFollowing() {
+  void removeFollowing() {
     if (_next == null) return;
     _next.remove();
     _next = null;
diff --git a/pkg/barback/lib/src/phase_input.dart b/pkg/barback/lib/src/phase_input.dart
index 7ba6c20..840b564 100644
--- a/pkg/barback/lib/src/phase_input.dart
+++ b/pkg/barback/lib/src/phase_input.dart
@@ -11,6 +11,7 @@
 import 'asset_forwarder.dart';
 import 'asset_node.dart';
 import 'errors.dart';
+import 'phase.dart';
 import 'stream_pool.dart';
 import 'transform_node.dart';
 import 'transformer.dart';
diff --git a/pkg/barback/lib/src/phase_output.dart b/pkg/barback/lib/src/phase_output.dart
index 8082e54..1bfb8d4 100644
--- a/pkg/barback/lib/src/phase_output.dart
+++ b/pkg/barback/lib/src/phase_output.dart
@@ -8,12 +8,9 @@
 import 'dart:collection';
 
 import 'asset_cascade.dart';
-import 'asset_id.dart';
 import 'asset_node.dart';
 import 'errors.dart';
-import 'phase_input.dart';
-import 'stream_pool.dart';
-import 'transformer.dart';
+import 'phase.dart';
 import 'utils.dart';
 
 /// A class that handles a single output of a phase.
@@ -113,7 +110,7 @@
         _outputController.setAvailable(newOutput.asset);
       } else {
         assert(newOutput.isDirty);
-        if (!output.isDirty) _outputController.setDirty();
+        if (!output.state.isDirty) _outputController.setDirty();
       }
     }
 
diff --git a/pkg/barback/lib/src/transform.dart b/pkg/barback/lib/src/transform.dart
index d5d7176..304618f 100644
--- a/pkg/barback/lib/src/transform.dart
+++ b/pkg/barback/lib/src/transform.dart
@@ -5,6 +5,7 @@
 library barback.transform;
 
 import 'dart:async';
+import 'dart:convert';
 
 import 'asset.dart';
 import 'asset_id.dart';
@@ -13,6 +14,7 @@
 import 'errors.dart';
 import 'transform_logger.dart';
 import 'transform_node.dart';
+import 'utils.dart';
 
 /// Creates a [Transform] by forwarding to the private constructor.
 ///
@@ -34,7 +36,10 @@
 
   final AssetSet _outputs;
 
-  /// Gets the ID of the primary input for this transformation.
+  /// A logger so that the [Transformer] can report build details.
+  TransformLogger get logger => _logger;
+
+  /// Gets the primary input asset.
   ///
   /// While a transformation can use multiple input assets, one must be a
   /// special "primary" asset. This will be the "entrypoint" or "main" input
@@ -43,13 +48,19 @@
   /// For example, with a dart2js transform, the primary input would be the
   /// entrypoint Dart file. All of the other Dart files that that imports
   /// would be secondary inputs.
-  AssetId get primaryId => _node.primary.id;
+  ///
+  /// This method may fail at runtime if called asynchronously after the
+  /// transform begins running. The primary input may become unavailable while
+  /// this transformer is running due to asset changes earlier in the graph.
+  /// You can ignore the error if this happens: the transformer will be re-run
+  /// automatically for you.
+  Asset get primaryInput {
+    if (_node.primary.state != AssetState.AVAILABLE) {
+      throw new AssetNotFoundException(_node.primary.id);
+    }
 
-  /// A logger so that the [Transformer] can report build details.
-  TransformLogger get logger => _logger;
-
-  /// Gets the asset for the primary input.
-  Future<Asset> get primaryInput => getInput(primaryId);
+    return _node.primary.asset;
+  }
 
   Transform._(this._node, this._outputs);
 
@@ -59,6 +70,26 @@
   /// [AssetNotFoundException].
   Future<Asset> getInput(AssetId id) => _node.getInput(id);
 
+  /// A convenience method to the contents of the input with [id] as a string.
+  ///
+  /// This is equivalent to calling `getInput()` followed by `readAsString()`.
+  ///
+  /// If the asset was created from a [String] the original string is always
+  /// returned and [encoding] is ignored. Otherwise, the binary data of the
+  /// asset is decoded using [encoding], which defaults to [UTF8].
+  Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
+    if (encoding == null) encoding = UTF8;
+    return getInput(id).then((input) => input.readAsString(encoding: encoding));
+  }
+
+  /// A convenience method to the contents of the input with [id].
+  ///
+  /// This is equivalent to calling `getInput()` followed by `read()`.
+  ///
+  /// If the asset was created from a [String], this returns its UTF-8 encoding.
+  Stream<List<int>> readInput(AssetId id) =>
+      futureStream(getInput(id).then((input) => input.read()));
+
   /// Stores [output] as the output created by this transformation.
   ///
   /// A transformation can output as many assets as it wants.
diff --git a/pkg/barback/lib/src/utils.dart b/pkg/barback/lib/src/utils.dart
index 0a41c8e..37816bc 100644
--- a/pkg/barback/lib/src/utils.dart
+++ b/pkg/barback/lib/src/utils.dart
@@ -179,3 +179,20 @@
 /// Like [new Future], but avoids issue 11911 by using [new Future.value] under
 /// the covers.
 Future newFuture(callback()) => new Future.value().then((_) => callback());
+
+/// Returns a buffered stream that will emit the same values as the stream
+/// returned by [future] once [future] completes. If [future] completes to an
+/// error, the return value will emit that error and then close.
+Stream futureStream(Future<Stream> future) {
+  var controller = new StreamController(sync: true);
+  future.then((stream) {
+    stream.listen(
+        controller.add,
+        onError: (error) => controller.addError(error),
+        onDone: controller.close);
+  }).catchError((e) {
+    controller.addError(e);
+    controller.close();
+  });
+  return controller.stream;
+}
diff --git a/pkg/barback/test/package_graph/transform_test.dart b/pkg/barback/test/package_graph/transform_test.dart
index 8c108b3..af8df48 100644
--- a/pkg/barback/test/package_graph/transform_test.dart
+++ b/pkg/barback/test/package_graph/transform_test.dart
@@ -1095,5 +1095,38 @@
       expectAsset("pkg1|a.out", "b");
       buildShouldSucceed();
     });
+
+    test("re-runs if the primary input is invalidated before accessing", () {
+      var transformer1 = new RewriteTransformer("txt", "mid");
+      var transformer2 = new RewriteTransformer("mid", "out");
+
+      initGraph([
+        "app|foo.txt"
+      ], {"app": [
+        [transformer1],
+        [transformer2]
+      ]});
+
+      transformer2.pausePrimaryInput();
+      updateSources(["app|foo.txt"]);
+
+      // Wait long enough to ensure that transformer1 has completed and
+      // transformer2 has started.
+      schedule(pumpEventQueue);
+
+      // Update the source again so that transformer1 invalidates the primary
+      // input of transformer2.
+      transformer1.pauseApply();
+      updateSources(["app|foo.txt"]);
+
+      transformer2.resumePrimaryInput();
+      transformer1.resumeApply();
+
+      expectAsset("app|foo.out", "foo.mid.out");
+      buildShouldSucceed();
+
+      expect(transformer1.numRuns, completion(equals(2)));
+      expect(transformer2.numRuns, completion(equals(2)));
+    });
   });
 }
diff --git a/pkg/barback/test/transformer/many_to_one.dart b/pkg/barback/test/transformer/many_to_one.dart
index 59a190c..ab56202 100644
--- a/pkg/barback/test/transformer/many_to_one.dart
+++ b/pkg/barback/test/transformer/many_to_one.dart
@@ -36,12 +36,12 @@
         if (path.contains("|")) {
           id = new AssetId.parse(path);
         } else {
-          id = new AssetId(transform.primaryId.package, path);
+          id = new AssetId(transform.primaryInput.id.package, path);
         }
         return getInput(transform, id).then((input) => input.readAsString());
       }));
     }).then((outputs) {
-      var id = transform.primaryId.changeExtension(".out");
+      var id = transform.primaryInput.id.changeExtension(".out");
       transform.addOutput(new Asset.fromString(id, outputs.join()));
     });
   }
diff --git a/pkg/barback/test/transformer/mock.dart b/pkg/barback/test/transformer/mock.dart
index 0887002..57d3f07 100644
--- a/pkg/barback/test/transformer/mock.dart
+++ b/pkg/barback/test/transformer/mock.dart
@@ -30,17 +30,20 @@
   /// The number of currently running transforms.
   int _runningTransforms = 0;
 
-  // A completer for pausing the transformer before it finishes running [apply].
+  /// A completer for pausing the transformer before it finishes running [apply].
   Completer _apply;
 
-  // Completers for pausing the transformer before it finishes running
-  // [isPrimary].
+  /// Completers for pausing the transformer before it finishes running
+  /// [isPrimary].
   final _isPrimary = new Map<AssetId, Completer>();
 
-  // Completers for pausing the transformer before it finishes getting inputs
-  // the [Transform].
+  /// Completers for pausing the transformer before it finishes getting inputs
+  /// the [Transform].
   final _getInput = new Map<AssetId, Completer>();
 
+  /// Completer for pausing the transformer before it accesses [primaryInput].
+  Completer _primaryInput;
+
   /// A completer that completes once this transformer begins running.
   ///
   /// Once this transformer finishes running, this is reset to a new completer,
@@ -99,8 +102,8 @@
     }, "resume isPrimary($name) for $this");
   }
 
-  /// Causes the transformer to pause while loading the input with the given
-  /// [name]. This can be the primary input or a secondary input.
+  /// Causes the transformer to pause while loading the secondary input with
+  /// the given [name].
   ///
   /// This can be resumed by calling [resumeGetInput]. This operation is
   /// scheduled.
@@ -120,6 +123,27 @@
     }, "resume getInput($name) for $this");
   }
 
+  /// Causes the transformer to pause before accessing [primaryInput].
+  ///
+  /// This can be resumed by calling [resumeGetPrimary]. This operation is
+  /// scheduled.
+  void pausePrimaryInput() {
+    schedule(() {
+      _primaryInput = new Completer();
+    }, "pause primaryInput for $this");
+  }
+
+  /// Resumes the transformer's invocation of [primaryInput] after
+  /// [pauseGetPrimary] was called.
+  ///
+  /// This operation is scheduled.
+  void resumePrimaryInput() {
+    schedule(() {
+      _primaryInput.complete();
+      _primaryInput = null;
+    }, "resume getPrimary() for $this");
+  }
+
   /// Like [Transform.getInput], but respects [pauseGetInput].
   ///
   /// This is intended for use by subclasses of [MockTransformer].
@@ -129,11 +153,14 @@
     }).then((_) => transform.getInput(id));
   }
 
-  /// Like [Transform.primaryInput], but respects [pauseGetInput].
+  /// Like [Transform.primaryInput], but respects [pauseGetPrimary].
   ///
   /// This is intended for use by subclasses of [MockTransformer].
-  Future<Asset> getPrimary(Transform transform) =>
-      getInput(transform, transform.primaryId);
+  Future<Asset> getPrimary(Transform transform) {
+    return newFuture(() {
+      if (_primaryInput != null) return _primaryInput.future;
+    }).then((_) => transform.primaryInput);
+  }
 
   Future<bool> isPrimary(Asset asset) {
     return newFuture(() => doIsPrimary(asset)).then((result) {
diff --git a/pkg/barback/test/transformer/one_to_many.dart b/pkg/barback/test/transformer/one_to_many.dart
index e9d301d..b3b2f5e 100644
--- a/pkg/barback/test/transformer/one_to_many.dart
+++ b/pkg/barback/test/transformer/one_to_many.dart
@@ -29,7 +29,7 @@
         .then((input) => input.readAsString())
         .then((lines) {
       for (var line in lines.split(",")) {
-        var id = new AssetId(transform.primaryId.package, line);
+        var id = new AssetId(transform.primaryInput.id.package, line);
         transform.addOutput(new Asset.fromString(id, "spread $extension"));
       }
     });
diff --git a/pkg/barback/test/transformer/rewrite.dart b/pkg/barback/test/transformer/rewrite.dart
index 4d3faa88..6525b07 100644
--- a/pkg/barback/test/transformer/rewrite.dart
+++ b/pkg/barback/test/transformer/rewrite.dart
@@ -31,7 +31,7 @@
   Future doApply(Transform transform) {
     return getPrimary(transform).then((input) {
       return Future.wait(to.split(" ").map((extension) {
-        var id = transform.primaryId.changeExtension(".$extension");
+        var id = input.id.changeExtension(".$extension");
         return input.readAsString().then((content) {
           transform.addOutput(new Asset.fromString(id, "$content.$extension"));
         });
diff --git a/pkg/barback/test/utils.dart b/pkg/barback/test/utils.dart
index 798b958..7fb1a23 100644
--- a/pkg/barback/test/utils.dart
+++ b/pkg/barback/test/utils.dart
@@ -7,7 +7,6 @@
 import 'dart:async';
 import 'dart:collection';
 import 'dart:convert' show Encoding;
-import 'dart:io';
 
 import 'package:barback/barback.dart';
 import 'package:barback/src/cancelable_future.dart';
diff --git a/pkg/custom_element/lib/custom_element.dart b/pkg/custom_element/lib/custom_element.dart
index db0c3b8..202a0ee 100644
--- a/pkg/custom_element/lib/custom_element.dart
+++ b/pkg/custom_element/lib/custom_element.dart
@@ -471,17 +471,6 @@
 
   int get scrollWidth => host.scrollWidth;
 
-  String $dom_getAttribute(String name) =>
-      host.$dom_getAttribute(name);
-
-  String $dom_getAttributeNS(String namespaceUri, String localName) =>
-      host.$dom_getAttributeNS(namespaceUri, localName);
-
-  String $dom_setAttributeNS(
-      String namespaceUri, String localName, String value) {
-    host.$dom_setAttributeNS(namespaceUri, localName, value);
-  }
-
   Rect getBoundingClientRect() => host.getBoundingClientRect();
 
   List<Rect> getClientRects() => host.getClientRects();
@@ -489,11 +478,6 @@
   List<Node> getElementsByClassName(String name) =>
       host.getElementsByClassName(name);
 
-  void $dom_setAttribute(String name, String value) =>
-      host.$dom_setAttribute(name, value);
-
-  List<Node> get $dom_childNodes => host.$dom_childNodes;
-
   Node get firstChild => host.firstChild;
 
   Node get lastChild => host.lastChild;
diff --git a/pkg/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
index 6faca3f5..13f83af 100644
--- a/pkg/docgen/lib/docgen.dart
+++ b/pkg/docgen/lib/docgen.dart
@@ -15,8 +15,8 @@
  */
 library docgen;
 
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json';
 import 'dart:async';
 
 import 'package:logging/logging.dart';
@@ -253,7 +253,8 @@
     if (!docsDir.contains('docs/library_list.json')) {
       throw new StateError('No library_list.json');
     }
-    libraryMap = parse(new File('docs/library_list.json').readAsStringSync());
+    libraryMap =
+        JSON.decode(new File('docs/library_list.json').readAsStringSync());
     libraryMap['libraries'].addAll(filteredEntities
         .where((e) => e is Library)
         .map((e) => e.previewMap));
@@ -277,7 +278,7 @@
       'filetype' : outputToYaml ? 'yaml' : 'json'
     };
   }
-  _writeToFile(stringify(libraryMap), 'library_list.json');
+  _writeToFile(JSON.encode(libraryMap), 'library_list.json');
   // Output libraries and classes to file after all information is generated.
   filteredEntities.where((e) => e is Class || e is Library).forEach((output) {
     _writeIndexableToFile(output, outputToYaml);
@@ -303,7 +304,7 @@
   if (outputToYaml) {
     _writeToFile(getYamlString(result.toMap()), '${result.qualifiedName}.yaml');
   } else {
-    _writeToFile(stringify(result.toMap()), '${result.qualifiedName}.json');
+    _writeToFile(JSON.encode(result.toMap()), '${result.qualifiedName}.json');
   }
 }
 
@@ -399,7 +400,7 @@
     // Reading in MDN related json file. 
     var mdnDir = path.join(path.dirname(path.dirname(path.dirname(path.dirname(
         path.absolute(new Options().script))))), 'utils', 'apidoc', 'mdn');
-    _mdn = parse(new File(path.join(mdnDir, 'database.json'))
+    _mdn = JSON.decode(new File(path.join(mdnDir, 'database.json'))
         .readAsStringSync());
   }
   if (item.comment.isNotEmpty) return;
diff --git a/pkg/fixnum/lib/src/int64.dart b/pkg/fixnum/lib/src/int64.dart
index 036a06b..f5a0810 100644
--- a/pkg/fixnum/lib/src/int64.dart
+++ b/pkg/fixnum/lib/src/int64.dart
@@ -794,7 +794,7 @@
       r = d0 - q * fatRadix;
       d0 = q;
 
-      assert(chunk2 == "");
+      assert(chunk3 == "");
       chunk3 = chunk2;
       chunk2 = chunk1;
       // Adding [fatRadix] Forces an extra digit which we discard to get a fixed
diff --git a/pkg/fixnum/test/int_64_test.dart b/pkg/fixnum/test/int_64_test.dart
index 20f2822..d781984 100644
--- a/pkg/fixnum/test/int_64_test.dart
+++ b/pkg/fixnum/test/int_64_test.dart
@@ -562,6 +562,13 @@
       // Overflow during parsing.
       check("9223372036854775808", 10, "-9223372036854775808");
     });
+
+    test("parseRadixN", () {
+      check(String s, int r) {
+        expect(Int64.parseRadix(s, r).toRadixString(r), s);
+      }
+      check("2ppp111222333", 33);  // This value & radix requires three chunks.
+    });
   });
 
   group("string representation", () {
diff --git a/pkg/http/lib/testing.dart b/pkg/http/lib/testing.dart
index 9fe7b06..45d2c61 100644
--- a/pkg/http/lib/testing.dart
+++ b/pkg/http/lib/testing.dart
@@ -8,14 +8,14 @@
 /// allows test code to set up a local request handler in order to fake a server
 /// that responds to HTTP requests:
 ///
-///     import 'dart:json' as json;
+///     import 'dart:convert';
 ///     import 'package:http/testing.dart';
 ///
 ///     var client = new MockClient((request) {
 ///       if (request.url.path != "/data.json") {
 ///         return new Response("", 404);
 ///       }
-///       return new Response(json.stringify({
+///       return new Response(JSON.encode({
 ///         'numbers': [1, 4, 15, 19, 214]
 ///       }, 200, headers: {
 ///         'content-type': 'application/json'
diff --git a/pkg/http/test/mock_client_test.dart b/pkg/http/test/mock_client_test.dart
index 997f0bb..07066ec 100644
--- a/pkg/http/test/mock_client_test.dart
+++ b/pkg/http/test/mock_client_test.dart
@@ -5,7 +5,7 @@
 library mock_client_test;
 
 import 'dart:async';
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:http/http.dart' as http;
 import 'package:http/src/utils.dart';
@@ -18,7 +18,7 @@
   test('handles a request', () {
     var client = new MockClient((request) {
       return new Future.value(new http.Response(
-          json.stringify(request.bodyFields), 200,
+          JSON.encode(request.bodyFields), 200,
           request: request, headers: {'content-type': 'application/json'}));
     });
 
diff --git a/pkg/http/test/utils.dart b/pkg/http/test/utils.dart
index 7b42bec..f9a7381 100644
--- a/pkg/http/test/utils.dart
+++ b/pkg/http/test/utils.dart
@@ -7,7 +7,6 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 
 import 'package:http/src/byte_stream.dart';
 import 'package:http/src/utils.dart';
@@ -96,7 +95,7 @@
           content['headers'][name] = values;
         });
 
-        var body = json.stringify(content);
+        var body = JSON.encode(content);
         response.contentLength = body.length;
         response.write(body);
         response.close();
@@ -154,7 +153,7 @@
 
     var parsed;
     try {
-      parsed = json.parse(item);
+      parsed = JSON.decode(item);
     } catch (e) {
       return false;
     }
diff --git a/pkg/http_server/lib/http_server.dart b/pkg/http_server/lib/http_server.dart
index 7176330..aad6401 100644
--- a/pkg/http_server/lib/http_server.dart
+++ b/pkg/http_server/lib/http_server.dart
@@ -7,7 +7,6 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as JSON;
 
 import 'package:mime/mime.dart';
 import "package:path/path.dart";
diff --git a/pkg/http_server/lib/src/http_body_impl.dart b/pkg/http_server/lib/src/http_body_impl.dart
index c48db03..b1186405 100644
--- a/pkg/http_server/lib/src/http_body_impl.dart
+++ b/pkg/http_server/lib/src/http_body_impl.dart
@@ -115,7 +115,7 @@
             return asText(UTF8)
                 .then((body) => new _HttpBody(contentType,
                                               "json",
-                                              JSON.parse(body.body)));
+                                              JSON.decode(body.body)));
 
           case "x-www-form-urlencoded":
             return asText(ASCII)
diff --git a/pkg/intl/lib/date_format.dart b/pkg/intl/lib/date_format.dart
index 202ae1b..17aca41 100644
--- a/pkg/intl/lib/date_format.dart
+++ b/pkg/intl/lib/date_format.dart
@@ -252,7 +252,8 @@
 
   /**
    * Given user input, attempt to parse the [inputString] into the anticipated
-   * format, treating it as being in the local timezone.
+   * format, treating it as being in the local timezone. If [inputString] does
+   * not match our format, throws a [FormatException].
    */
   DateTime parse(String inputString, [utc = false]) {
     // TODO(alanknight): The Closure code refers to special parsing of numeric
diff --git a/pkg/intl/lib/generate_localized.dart b/pkg/intl/lib/generate_localized.dart
index 5f9639f..285e05e 100644
--- a/pkg/intl/lib/generate_localized.dart
+++ b/pkg/intl/lib/generate_localized.dart
@@ -159,19 +159,22 @@
   for (var locale in allLocales) {
     var baseFile = '${generatedFilePrefix}messages_$locale.dart';
     var file = importForGeneratedFile(baseFile);
-    output.write("@${_deferredName(locale)}\n");
+    // TODO(alanknight): Restore this once deferred loading works in dartj2s.
+    // Issue 12824
+    //    output.write("@${_deferredName(locale)}\n");
     output.write("import '$file' as ${_libraryName(locale)};\n");
   }
   output.write("\n");
-  for (var locale in allLocales) {
-    output.write("const ${_deferredName(locale)} = const DeferredLibrary");
-    output.write("('${_libraryName(locale)}');\n");
-  }
-  output.write("\nconst deferredLibraries = const {\n");
-  for (var locale in allLocales) {
-    output.write("  '$locale' : ${_deferredName(locale)},\n");
-  }
-  output.write("};\n");
+  // Issue 12824
+  //for (var locale in allLocales) {
+  //  output.write("const ${_deferredName(locale)} = const DeferredLibrary");
+  //  output.write("('${_libraryName(locale)}');\n");
+  //}
+  //output.write("\nconst deferredLibraries = const {\n");
+  //for (var locale in allLocales) {
+  //  output.write("  '$locale' : ${_deferredName(locale)},\n");
+  //}
+  //output.write("};\n");
   output.write(
     "\nMessageLookupByLibrary _findExact(localeName) {\n"
     "  switch (localeName) {\n");
@@ -215,8 +218,10 @@
 Future initializeMessages(String localeName) {
   initializeInternalMessageLookup(() => new CompositeMessageLookup());
   messageLookup.addLocale(localeName, _findGeneratedMessagesFor);
-  var lib = deferredLibraries[localeName];                                                           
-  return lib == null ? new Future.value(false) : lib.load();     
+  // TODO(alanknight): Restore once Issue 12824 is fixed.
+  // var lib = deferredLibraries[localeName];
+  // return lib == null ? new Future.value(false) : lib.load();
+  return new Future.value(true);
 }
 
 MessageLookupByLibrary _findGeneratedMessagesFor(locale) {
diff --git a/pkg/intl/lib/src/lazy_locale_data.dart b/pkg/intl/lib/src/lazy_locale_data.dart
index 90ff3a1..ecef1ab 100644
--- a/pkg/intl/lib/src/lazy_locale_data.dart
+++ b/pkg/intl/lib/src/lazy_locale_data.dart
@@ -10,8 +10,8 @@
 
 library lazy_locale_data;
 import 'dart:async';
+import 'dart:convert';
 import 'intl_helpers.dart';
-import 'dart:json' as json;
 
 /**
  * This implements the very basic map-type operations which are used
@@ -108,6 +108,6 @@
    * return another future that parses the JSON into a usable format.
    */
   Future jsonData(Future input) {
-    return input.then( (response) => json.parse(response));
+    return input.then( (response) => JSON.decode(response));
   }
 }
diff --git a/pkg/intl/test/message_extraction/extract_to_json.dart b/pkg/intl/test/message_extraction/extract_to_json.dart
index 9720506..ea7695e 100644
--- a/pkg/intl/test/message_extraction/extract_to_json.dart
+++ b/pkg/intl/test/message_extraction/extract_to_json.dart
@@ -20,9 +20,9 @@
  */
 library extract_to_json;
 
+import 'dart:convert';
 import 'dart:io';
 import 'package:intl/extract_messages.dart';
-import 'dart:json' as json;
 import 'package:path/path.dart' as path;
 import 'package:intl/src/intl_message.dart';
 import 'package:args/args.dart';
@@ -50,7 +50,7 @@
     messages.forEach((k, v) => allMessages.add(toJson(v)));
   }
   var file = new File(path.join(targetDir, 'intl_messages.json'));
-  file.writeAsStringSync(json.stringify(allMessages));
+  file.writeAsStringSync(JSON.encode(allMessages));
   if (hasWarnings && warningsAreErrors) {
     exit(1);
   }
diff --git a/pkg/intl/test/message_extraction/foo_messages_all.dart b/pkg/intl/test/message_extraction/foo_messages_all.dart
new file mode 100644
index 0000000..829df89
--- /dev/null
+++ b/pkg/intl/test/message_extraction/foo_messages_all.dart
@@ -0,0 +1,40 @@
+/**
+ * DO NOT EDIT. This is code generated via pkg/intl/generate_localized.dart
+ * This is a library that looks up messages for specific locales by
+ * delegating to the appropriate library.
+ */
+
+library messages_all;
+
+import 'dart:async';
+import 'package:intl/message_lookup_by_library.dart';
+import 'package:intl/src/intl_helpers.dart';
+import 'package:intl/intl.dart';
+
+import 'foo_messages_fr.dart' as fr;
+import 'foo_messages_de_DE.dart' as de_DE;
+
+
+MessageLookupByLibrary _findExact(localeName) {
+  switch (localeName) {
+    case 'fr' : return fr.messages;
+    case 'de_DE' : return de_DE.messages;
+    default: return null;
+  }
+}
+
+/** User programs should call this before using [localeName] for messages.*/
+Future initializeMessages(String localeName) {
+  initializeInternalMessageLookup(() => new CompositeMessageLookup());
+  messageLookup.addLocale(localeName, _findGeneratedMessagesFor);
+  // TODO(alanknight): Restore once Issue 12824 is fixed.
+  // var lib = deferredLibraries[localeName];
+  // return lib == null ? new Future.value(false) : lib.load();
+  return new Future.value(true);
+}
+
+MessageLookupByLibrary _findGeneratedMessagesFor(locale) {
+  var actualLocale = Intl.verifiedLocale(locale, (x) => _findExact(x) != null);
+  if (actualLocale == null) return null;
+  return _findExact(actualLocale);
+}
diff --git a/pkg/intl/test/message_extraction/foo_messages_de_DE.dart b/pkg/intl/test/message_extraction/foo_messages_de_DE.dart
new file mode 100644
index 0000000..18f321c
--- /dev/null
+++ b/pkg/intl/test/message_extraction/foo_messages_de_DE.dart
@@ -0,0 +1,83 @@
+/**
+ * DO NOT EDIT. This is code generated via pkg/intl/generate_localized.dart
+ * This is a library that provides messages for a de_DE locale. All the
+ * messages from the main program should be duplicated here with the same
+ * function name.
+ */
+
+library messages_de_DE;
+import 'package:intl/intl.dart';
+import 'package:intl/message_lookup_by_library.dart';
+
+final messages = new MessageLookup();
+
+class MessageLookup extends MessageLookupByLibrary {
+
+  get localeName => 'de_DE';
+  static alwaysTranslated() => "Diese Zeichenkette wird immer übersetzt";
+
+  static escapable() => "Escapes: \n\r\f\b\t\v.";
+
+  static leadingQuotes() => "\"Sogenannt\"";
+
+  static message1() => "Dies ist eine Nachricht";
+
+  static message2(x) => "Eine weitere Meldung mit dem Parameter $x";
+
+  static message3(a, b, c) => "Zeichen, die Flucht benötigen, zB Schrägstriche \\ Dollar \${ (geschweiften Klammern sind ok) und xml reservierte Zeichen <& und Zitate \" Parameter $a, $b und $c";
+
+  static method() => "Dies ergibt sich aus einer Methode";
+
+  static multiLine() => "Dieser String erstreckt sich über mehrere Zeilen erstrecken.";
+
+  static nestedMessage(names, number, combinedGender, place) => "${Intl.gender(combinedGender, female: '${Intl.plural(number, one: '$names ging in dem $place', other: '$names gingen zum $place')}', other: '${Intl.plural(number, zero: 'Niemand ging zu $place', one: '${names} ging zum $place', other: '${names} gingen zum $place')}')}";
+
+  static nestedOuter(number, gen) => "${Intl.plural(number, other: '${Intl.gender(gen, male: '$number Mann', other: '$number andere')}')}";
+
+  static nestedSelect(currency, amount) => "${Intl.select(currency, {'CDN': '${Intl.plural(amount, one: '$amount Kanadischer dollar', other: '$amount Kanadischen dollar')}', 'other': 'whatever', })}";
+
+  static nonLambda() => "Diese Methode ist nicht eine Lambda";
+
+  static originalNotInBMP() => "Antike griechische Galgenmännchen Zeichen: 𐅆𐅇";
+
+  static outerGender(g) => "${Intl.gender(g, female: 'Frau', male: 'Mann', other: 'andere')}";
+
+  static outerPlural(n) => "${Intl.plural(n, zero: 'Null', one: 'ein', other: 'einige')}";
+
+  static outerSelect(currency, amount) => "${Intl.select(currency, {'CDN': '$amount Kanadischen dollar', 'other': '$amount einige Währung oder anderen.', })}";
+
+  static plurals(num) => "${Intl.plural(num, zero: 'Ist Null Plural?', one: 'Dies ist einmalig', other: 'Dies ist Plural ($num).')}";
+
+  static staticMessage() => "Dies ergibt sich aus einer statischen Methode";
+
+  static trickyInterpolation(s) => "Interpolation ist schwierig, wenn es einen Satz wie dieser endet ${s}.";
+
+  static types(a, b, c) => "$a, $b, $c";
+
+  static whereTheyWentMessage(name, gender, place) => "${Intl.gender(gender, female: '${name} ging zu ihrem ${place}', male: '${name} ging zu seinem ${place}', other: '${name} ging zu seinem ${place}')}";
+
+
+  final messages = const {
+    "alwaysTranslated" : alwaysTranslated,
+    "escapable" : escapable,
+    "leadingQuotes" : leadingQuotes,
+    "message1" : message1,
+    "message2" : message2,
+    "message3" : message3,
+    "method" : method,
+    "multiLine" : multiLine,
+    "nestedMessage" : nestedMessage,
+    "nestedOuter" : nestedOuter,
+    "nestedSelect" : nestedSelect,
+    "nonLambda" : nonLambda,
+    "originalNotInBMP" : originalNotInBMP,
+    "outerGender" : outerGender,
+    "outerPlural" : outerPlural,
+    "outerSelect" : outerSelect,
+    "plurals" : plurals,
+    "staticMessage" : staticMessage,
+    "trickyInterpolation" : trickyInterpolation,
+    "types" : types,
+    "whereTheyWentMessage" : whereTheyWentMessage
+  };
+}
\ No newline at end of file
diff --git a/pkg/intl/test/message_extraction/foo_messages_fr.dart b/pkg/intl/test/message_extraction/foo_messages_fr.dart
new file mode 100644
index 0000000..723d362
--- /dev/null
+++ b/pkg/intl/test/message_extraction/foo_messages_fr.dart
@@ -0,0 +1,86 @@
+/**
+ * DO NOT EDIT. This is code generated via pkg/intl/generate_localized.dart
+ * This is a library that provides messages for a fr locale. All the
+ * messages from the main program should be duplicated here with the same
+ * function name.
+ */
+
+library messages_fr;
+import 'package:intl/intl.dart';
+import 'package:intl/message_lookup_by_library.dart';
+
+final messages = new MessageLookup();
+
+class MessageLookup extends MessageLookupByLibrary {
+
+  get localeName => 'fr';
+  static alwaysTranslated() => "Cette chaîne est toujours traduit";
+
+  static escapable() => "Escapes: \n\r\f\b\t\v.";
+
+  static leadingQuotes() => "\"Soi-disant\"";
+
+  static message1() => "Il s\'agit d\'un message";
+
+  static message2(x) => "Un autre message avec un seul paramètre $x";
+
+  static message3(a, b, c) => "Caractères qui doivent être échapper, par exemple barres \\ dollars \${ (les accolades sont ok), et xml/html réservés <& et des citations \" avec quelques paramètres ainsi $a, $b, et $c";
+
+  static method() => "Cela vient d\'une méthode";
+
+  static multiLine() => "Cette message prend plusiers lignes.";
+
+  static nestedMessage(names, number, combinedGender, place) => "${Intl.gender(combinedGender, female: '${Intl.plural(number, one: '$names était allée à la $place', other: '$names étaient allées à la $place')}', other: '${Intl.plural(number, zero: 'Personne n\'avait allé à la $place', one: '${names} était allé à la $place', other: '${names} étaient allés à la $place')}')}";
+
+  static nestedOuter(number, gen) => "${Intl.plural(number, other: '${Intl.gender(gen, male: '$number homme', other: '$number autre')}')}";
+
+  static nestedSelect(currency, amount) => "${Intl.select(currency, {'CDN': '${Intl.plural(amount, one: '$amount dollar Canadien', other: '$amount dollars Canadiens')}', 'other': 'Nimporte quoi', })}";
+
+  static nonLambda() => "Cette méthode n\'est pas un lambda";
+
+  static notAlwaysTranslated() => "Ce manque certaines traductions";
+
+  static originalNotInBMP() => "Anciens caractères grecs jeux du pendu: 𐅆𐅇.";
+
+  static outerGender(g) => "${Intl.gender(g, female: 'femme', male: 'homme', other: 'autre')}";
+
+  static outerPlural(n) => "${Intl.plural(n, zero: 'rien', one: 'un', other: 'quelques-uns')}";
+
+  static outerSelect(currency, amount) => "${Intl.select(currency, {'CDN': '$amount dollars Canadiens', 'other': '$amount certaine devise ou autre.', })}";
+
+  static plurals(num) => "${Intl.plural(num, zero: 'Est-ce que nulle est pluriel?', one: 'C\'est singulier', other: 'C\'est pluriel ($num).')}";
+
+  static staticMessage() => "Cela vient d\'une méthode statique";
+
+  static trickyInterpolation(s) => "L\'interpolation est délicate quand elle se termine une phrase comme ${s}.";
+
+  static types(a, b, c) => "$a, $b, $c";
+
+  static whereTheyWentMessage(name, gender, place) => "${Intl.gender(gender, female: '${name} est allée à sa ${place}', male: '${name} est allé à sa ${place}', other: '${name} est allé à sa ${place}')}";
+
+
+  final messages = const {
+    "alwaysTranslated" : alwaysTranslated,
+    "escapable" : escapable,
+    "leadingQuotes" : leadingQuotes,
+    "message1" : message1,
+    "message2" : message2,
+    "message3" : message3,
+    "method" : method,
+    "multiLine" : multiLine,
+    "nestedMessage" : nestedMessage,
+    "nestedOuter" : nestedOuter,
+    "nestedSelect" : nestedSelect,
+    "nonLambda" : nonLambda,
+    "notAlwaysTranslated" : notAlwaysTranslated,
+    "originalNotInBMP" : originalNotInBMP,
+    "outerGender" : outerGender,
+    "outerPlural" : outerPlural,
+    "outerSelect" : outerSelect,
+    "plurals" : plurals,
+    "staticMessage" : staticMessage,
+    "trickyInterpolation" : trickyInterpolation,
+    "types" : types,
+    "whereTheyWentMessage" : whereTheyWentMessage
+  };
+}
\ No newline at end of file
diff --git a/pkg/intl/test/message_extraction/generate_from_json.dart b/pkg/intl/test/message_extraction/generate_from_json.dart
index ef79fb6..9ca99b2 100644
--- a/pkg/intl/test/message_extraction/generate_from_json.dart
+++ b/pkg/intl/test/message_extraction/generate_from_json.dart
@@ -15,11 +15,11 @@
  */
 library generate_from_json;
 
+import 'dart:convert';
 import 'dart:io';
 import 'package:intl/extract_messages.dart';
 import 'package:intl/src/intl_message.dart';
 import 'package:intl/generate_localized.dart';
-import 'dart:json' as json;
 import 'package:path/path.dart' as path;
 import 'package:args/args.dart';
 import 'package:serialization/serialization.dart';
@@ -91,7 +91,7 @@
  */
 void generateLocaleFile(File file, String targetDir) {
   var src = file.readAsStringSync();
-  var data = json.parse(src);
+  var data = JSON.decode(src);
   data.forEach((k, v) => data[k] = recreateIntlObjects(k, v));
   var locale = data["_locale"].string;
   allLocales.add(locale);
diff --git a/pkg/intl/test/message_extraction/generated_messages_js_test.dart b/pkg/intl/test/message_extraction/generated_messages_js_test.dart
new file mode 100644
index 0000000..a036d7f
--- /dev/null
+++ b/pkg/intl/test/message_extraction/generated_messages_js_test.dart
@@ -0,0 +1,21 @@
+// 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.
+
+// This test is intended to be run when compiled to Javascript, though it will
+// also work if run from the VM, it just won't test anything different from
+// message_extraction_test. It runs the generated code without going through
+// the message extraction or translation, which can't be done in JS. This tells
+// us if the generated code works in JS.
+
+library generated_messages_js_test.dart;
+
+import 'package:unittest/unittest.dart';
+import 'sample_with_messages.dart' as sample;
+import 'print_to_list.dart';
+import 'verify_messages.dart';
+
+main() {
+  test("Test generated code running in JS", () =>
+    sample.main().then((_) => verifyResult(lines)));
+}
diff --git a/pkg/intl/test/message_extraction/make_hardcoded_translation.dart b/pkg/intl/test/message_extraction/make_hardcoded_translation.dart
index 9da9dce..9b3e03d 100644
--- a/pkg/intl/test/message_extraction/make_hardcoded_translation.dart
+++ b/pkg/intl/test/message_extraction/make_hardcoded_translation.dart
@@ -10,8 +10,8 @@
  * German and French locales.
  */
 
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 import 'package:path/path.dart' as path;
 import 'package:args/args.dart';
 import 'package:intl/src/intl_message.dart';
@@ -220,7 +220,7 @@
     translated[name] = translations[name];
   }
   var file = new File(path.join(targetDir, 'translation_$locale.json'));
-  file.writeAsStringSync(json.stringify(translated));
+  file.writeAsStringSync(JSON.encode(translated));
 }
 
 main() {
@@ -237,7 +237,7 @@
 
   var fileArgs = args.where((x) => x.contains('.json'));
 
-  var messages = json.parse(new File(fileArgs.first).readAsStringSync());
+  var messages = JSON.decode(new File(fileArgs.first).readAsStringSync());
   translate(messages, "fr", french);
   translate(messages, "de_DE", german);
 }
diff --git a/pkg/intl/test/message_extraction/message_extraction_test.dart b/pkg/intl/test/message_extraction/message_extraction_test.dart
index e472cda..f64153d 100644
--- a/pkg/intl/test/message_extraction/message_extraction_test.dart
+++ b/pkg/intl/test/message_extraction/message_extraction_test.dart
@@ -10,6 +10,8 @@
 import 'dart:convert';
 import 'package:path/path.dart' as path;
 import '../data_directory.dart';
+import 'verify_messages.dart';
+import 'sample_with_messages.dart' as sample;
 
 final dart = Platform.executable;
 
@@ -36,17 +38,15 @@
       return generateTranslationFiles(result);
     }).then((result) {
       return generateCodeFromTranslation(result);
-    }).then((result) {
-      return runGeneratedCode(result);
-    }).then(verifyResult)
+    }).then((_) => sample.main())
+    .then(verifyResult)
     .whenComplete(deleteGeneratedFiles);
   });
 }
 
 void deleteGeneratedFiles() {
   var files = [dir('intl_messages.json'), dir('translation_fr.json'),
-      dir('foo_messages_fr.dart'), dir('foo_messages_de_DE.dart'),
-      dir('translation_de_DE.json'), dir('foo_messages_all.dart')];
+      dir('translation_de_DE.json')];
   files.map((name) => new File(name)).forEach((x) {
     if (x.existsSync()) x.deleteSync();});
 }
@@ -98,154 +98,3 @@
              'part_of_sample_with_messages.dart', 'translation_fr.json',
              'translation_de_DE.json' ]);
 
-Future<ProcessResult> runGeneratedCode(ProcessResult previousResult) =>
-    run(previousResult, ['sample_with_messages.dart']);
-
-verifyResult(results) {
-  var lineIterator;
-  verify(String s) {
-    lineIterator.moveNext();
-    var value = lineIterator.current;
-    expect(value, s);
-  }
-
-  var output = results.stdout;
-  var lines = output.split("\n");
-  // If it looks like these are CRLF delimited, then use that.
-  if (lines.first.endsWith("\r")) {
-    lines = output.split("\r\n");
-  }
-  lineIterator = lines.iterator..moveNext();
-  verify("Printing messages for en_US");
-  verify("This is a message");
-  verify("Another message with parameter hello");
-  verify("Characters that need escaping, e.g slashes \\ dollars \${ "
-      "(curly braces are ok) and xml reserved characters <& and "
-      "quotes \" parameters 1, 2, and 3");
-  verify("This string extends across multiple lines.");
-  verify("1, b, [c, d]");
-  verify('"So-called"');
-  verify("Cette chaîne est toujours traduit");
-  verify("Interpolation is tricky when it ends a sentence like this.");
-  verify("This comes from a method");
-  verify("This method is not a lambda");
-  verify("This comes from a static method");
-  verify("This is missing some translations");
-  verify("Ancient Greek hangman characters: 𐅆𐅇.");
-  verify("Escapable characters here: ");
-
-  verify('Is zero plural?');
-  verify('This is singular.');
-  verify('This is plural (2).');
-  verify('Alice went to her house');
-  verify('Bob went to his house');
-  verify('cat went to its litter box');
-  verify('Alice, Bob sont allés au magasin');
-  verify('Alice est allée au magasin');
-  verify('Personne n\'est allé au magasin');
-  verify('Bob, Bob sont allés au magasin');
-  verify('Alice, Alice sont allées au magasin');
-  verify('none');
-  verify('one');
-  verify('m');
-  verify('f');
-  verify('7 male');
-  verify('7 Canadian dollars');
-  verify('5 some currency or other.');
-  verify('1 Canadian dollar');
-  verify('2 Canadian dollars');
-
-  var fr_lines = lines.skip(1).skipWhile(
-      (line) => !line.contains('----')).toList();
-  lineIterator = fr_lines.iterator..moveNext();
-  verify("Printing messages for fr");
-  verify("Il s'agit d'un message");
-  verify("Un autre message avec un seul paramètre hello");
-  verify(
-      "Caractères qui doivent être échapper, par exemple barres \\ "
-      "dollars \${ (les accolades sont ok), et xml/html réservés <& et "
-      "des citations \" "
-      "avec quelques paramètres ainsi 1, 2, et 3");
-  verify("Cette message prend plusiers lignes.");
-  verify("1, b, [c, d]");
-  verify('"Soi-disant"');
-  verify("Cette chaîne est toujours traduit");
-  verify(
-      "L'interpolation est délicate quand elle se termine une "
-          "phrase comme this.");
-  verify("Cela vient d'une méthode");
-  verify("Cette méthode n'est pas un lambda");
-  verify("Cela vient d'une méthode statique");
-  verify("Ce manque certaines traductions");
-  verify("Anciens caractères grecs jeux du pendu: 𐅆𐅇.");
-  verify("Escapes: ");
-  verify("\r\f\b\t\v.");
-
-  verify('Est-ce que nulle est pluriel?');
-  verify('C\'est singulier');
-  verify('C\'est pluriel (2).');
-  verify('Alice est allée à sa house');
-  verify('Bob est allé à sa house');
-  verify('cat est allé à sa litter box');
-  verify('Alice, Bob étaient allés à la magasin');
-  verify('Alice était allée à la magasin');
-  verify('Personne n\'avait allé à la magasin');
-  verify('Bob, Bob étaient allés à la magasin');
-  verify('Alice, Alice étaient allées à la magasin');
-  verify('rien');
-  verify('un');
-  verify('homme');
-  verify('femme');
-  verify('7 homme');
-  verify('7 dollars Canadiens');
-  verify('5 certaine devise ou autre.');
-  verify('1 dollar Canadien');
-  verify('2 dollars Canadiens');
-
-  var de_lines = fr_lines.skip(1).skipWhile(
-      (line) => !line.contains('----')).toList();
-  lineIterator = de_lines.iterator..moveNext();
-  verify("Printing messages for de_DE");
-  verify("Dies ist eine Nachricht");
-  verify("Eine weitere Meldung mit dem Parameter hello");
-  verify(
-      "Zeichen, die Flucht benötigen, zB Schrägstriche \\ Dollar "
-      "\${ (geschweiften Klammern sind ok) und xml reservierte Zeichen <& und "
-      "Zitate \" Parameter 1, 2 und 3");
-  verify("Dieser String erstreckt sich über mehrere "
-      "Zeilen erstrecken.");
-  verify("1, b, [c, d]");
-  verify('"Sogenannt"');
-  // This is correct, the message is forced to French, even in a German locale.
-  verify("Cette chaîne est toujours traduit");
-  verify(
-      "Interpolation ist schwierig, wenn es einen Satz wie dieser endet this.");
-  verify("Dies ergibt sich aus einer Methode");
-  verify("Diese Methode ist nicht eine Lambda");
-  verify("Dies ergibt sich aus einer statischen Methode");
-  verify("This is missing some translations");
-  verify("Antike griechische Galgenmännchen Zeichen: 𐅆𐅇");
-  verify("Escapes: ");
-  verify("\r\f\b\t\v.");
-
-  verify('Ist Null Plural?');
-  verify('Dies ist einmalig');
-  verify('Dies ist Plural (2).');
-  verify('Alice ging zu ihrem house');
-  verify('Bob ging zu seinem house');
-  verify('cat ging zu seinem litter box');
-  verify('Alice, Bob gingen zum magasin');
-  verify('Alice ging in dem magasin');
-  verify('Niemand ging zu magasin');
-  verify('Bob, Bob gingen zum magasin');
-  verify('Alice, Alice gingen zum magasin');
-  verify('Null');
-  verify('ein');
-  verify('Mann');
-  verify('Frau');
-  verify('7 Mann');
-  verify('7 Kanadischen dollar');
-  verify('5 einige Währung oder anderen.');
-  verify('1 Kanadischer dollar');
-  verify('2 Kanadischen dollar');
-}
diff --git a/pkg/intl/test/message_extraction/print_to_list.dart b/pkg/intl/test/message_extraction/print_to_list.dart
new file mode 100644
index 0000000..e718fc4
--- /dev/null
+++ b/pkg/intl/test/message_extraction/print_to_list.dart
@@ -0,0 +1,10 @@
+/// This provides a way for a test to print to an internal list so the
+/// results can be verified rather than writing to and reading a file.
+
+library print_to_list.dart;
+
+List<String> lines = [];
+
+void printOut(String s) {
+  lines.add(s);
+}
\ No newline at end of file
diff --git a/pkg/intl/test/message_extraction/sample_with_messages.dart b/pkg/intl/test/message_extraction/sample_with_messages.dart
index 753f39c..8fc65c7 100644
--- a/pkg/intl/test/message_extraction/sample_with_messages.dart
+++ b/pkg/intl/test/message_extraction/sample_with_messages.dart
@@ -11,6 +11,8 @@
 
 import "package:intl/intl.dart";
 import "foo_messages_all.dart";
+import "print_to_list.dart";
+import "dart:async";
 
 part 'part_of_sample_with_messages.dart';
 
@@ -125,50 +127,50 @@
       args: [a, b, c]);
   var messageVariable = message3;
 
-  print("-------------------------------------------");
-  print("Printing messages for ${locale.locale}");
+  printOut("-------------------------------------------");
+  printOut("Printing messages for ${locale.locale}");
   Intl.withLocale(locale.locale, () {
-    print(message1());
-    print(message2("hello"));
-    print(messageVariable(1,2,3));
-    print(multiLine());
-    print(types(1, "b", ["c", "d"]));
-    print(leadingQuotes());
-    print(alwaysTranslated());
-    print(trickyInterpolation("this"));
+    printOut(message1());
+    printOut(message2("hello"));
+    printOut(messageVariable(1,2,3));
+    printOut(multiLine());
+    printOut(types(1, "b", ["c", "d"]));
+    printOut(leadingQuotes());
+    printOut(alwaysTranslated());
+    printOut(trickyInterpolation("this"));
     var thing = new YouveGotMessages();
-    print(thing.method());
-    print(thing.nonLambda());
+    printOut(thing.method());
+    printOut(thing.nonLambda());
     var x = YouveGotMessages.staticMessage();
-    print(YouveGotMessages.staticMessage());
-    print(notAlwaysTranslated());
-    print(originalNotInBMP());
-    print(escapable());
+    printOut(YouveGotMessages.staticMessage());
+    printOut(notAlwaysTranslated());
+    printOut(originalNotInBMP());
+    printOut(escapable());
 
-    print(thing.plurals(0));
-    print(thing.plurals(1));
-    print(thing.plurals(2));
+    printOut(thing.plurals(0));
+    printOut(thing.plurals(1));
+    printOut(thing.plurals(2));
     var alice = new Person("Alice", "female");
     var bob = new Person("Bob", "male");
     var cat = new Person("cat", null);
-    print(thing.whereTheyWent(alice, "house"));
-    print(thing.whereTheyWent(bob, "house"));
-    print(thing.whereTheyWent(cat, "litter box"));
-    print(thing.nested([alice, bob], "magasin"));
-    print(thing.nested([alice], "magasin"));
-    print(thing.nested([], "magasin"));
-    print(thing.nested([bob, bob], "magasin"));
-    print(thing.nested([alice, alice], "magasin"));
+    printOut(thing.whereTheyWent(alice, "house"));
+    printOut(thing.whereTheyWent(bob, "house"));
+    printOut(thing.whereTheyWent(cat, "litter box"));
+    printOut(thing.nested([alice, bob], "magasin"));
+    printOut(thing.nested([alice], "magasin"));
+    printOut(thing.nested([], "magasin"));
+    printOut(thing.nested([bob, bob], "magasin"));
+    printOut(thing.nested([alice, alice], "magasin"));
 
-    print(outerPlural(0));
-    print(outerPlural(1));
-    print(outerGender("male"));
-    print(outerGender("female"));
-    print(nestedOuter(7, "male"));
-    print(outerSelect("CDN", 7));
-    print(outerSelect("EUR", 5));
-    print(nestedSelect("CDN", 1));
-    print(nestedSelect("CDN", 2));
+    printOut(outerPlural(0));
+    printOut(outerPlural(1));
+    printOut(outerGender("male"));
+    printOut(outerGender("female"));
+    printOut(nestedOuter(7, "male"));
+    printOut(outerSelect("CDN", 7));
+    printOut(outerSelect("EUR", 5));
+    printOut(nestedSelect("CDN", 1));
+    printOut(nestedSelect("CDN", 2));
   });
 }
 
@@ -180,7 +182,8 @@
   var de = new Intl("de_DE");
   // Throw in an initialize of a null locale to make sure it doesn't throw.
   initializeMessages(null);
-  initializeMessages(fr.locale).then((_) => printStuff(fr));
-  initializeMessages(de.locale).then((_) => printStuff(de));
+  var f1 = initializeMessages(fr.locale).then((_) => printStuff(fr));
+  var f2 = initializeMessages(de.locale).then((_) => printStuff(de));
   printStuff(english);
+  return Future.wait([f1, f2]);
 }
\ No newline at end of file
diff --git a/pkg/intl/test/message_extraction/verify_messages.dart b/pkg/intl/test/message_extraction/verify_messages.dart
new file mode 100644
index 0000000..2203be6
--- /dev/null
+++ b/pkg/intl/test/message_extraction/verify_messages.dart
@@ -0,0 +1,148 @@
+library verify_messages;
+
+import "print_to_list.dart";
+import "package:unittest/unittest.dart";
+
+verifyResult(ignored) {
+  var lineIterator;
+  verify(String s) {
+    lineIterator.moveNext();
+    var value = lineIterator.current;
+    expect(value, s);
+  }
+
+  var expanded = lines.expand((line) => line.split("\n")).toList();
+  lineIterator = expanded.iterator..moveNext();
+  verify("Printing messages for en_US");
+  verify("This is a message");
+  verify("Another message with parameter hello");
+  verify("Characters that need escaping, e.g slashes \\ dollars \${ "
+      "(curly braces are ok) and xml reserved characters <& and "
+      "quotes \" parameters 1, 2, and 3");
+  verify("This string extends across multiple lines.");
+  verify("1, b, [c, d]");
+  verify('"So-called"');
+  verify("Cette chaîne est toujours traduit");
+  verify("Interpolation is tricky when it ends a sentence like this.");
+  verify("This comes from a method");
+  verify("This method is not a lambda");
+  verify("This comes from a static method");
+  verify("This is missing some translations");
+  verify("Ancient Greek hangman characters: 𐅆𐅇.");
+  verify("Escapable characters here: ");
+
+  verify('Is zero plural?');
+  verify('This is singular.');
+  verify('This is plural (2).');
+  verify('Alice went to her house');
+  verify('Bob went to his house');
+  verify('cat went to its litter box');
+  verify('Alice, Bob sont allés au magasin');
+  verify('Alice est allée au magasin');
+  verify('Personne n\'est allé au magasin');
+  verify('Bob, Bob sont allés au magasin');
+  verify('Alice, Alice sont allées au magasin');
+  verify('none');
+  verify('one');
+  verify('m');
+  verify('f');
+  verify('7 male');
+  verify('7 Canadian dollars');
+  verify('5 some currency or other.');
+  verify('1 Canadian dollar');
+  verify('2 Canadian dollars');
+
+  var fr_lines = expanded.skip(1).skipWhile(
+      (line) => !line.contains('----')).toList();
+  lineIterator = fr_lines.iterator..moveNext();
+  verify("Printing messages for fr");
+  verify("Il s'agit d'un message");
+  verify("Un autre message avec un seul paramètre hello");
+  verify(
+      "Caractères qui doivent être échapper, par exemple barres \\ "
+      "dollars \${ (les accolades sont ok), et xml/html réservés <& et "
+      "des citations \" "
+      "avec quelques paramètres ainsi 1, 2, et 3");
+  verify("Cette message prend plusiers lignes.");
+  verify("1, b, [c, d]");
+  verify('"Soi-disant"');
+  verify("Cette chaîne est toujours traduit");
+  verify(
+      "L'interpolation est délicate quand elle se termine une "
+          "phrase comme this.");
+  verify("Cela vient d'une méthode");
+  verify("Cette méthode n'est pas un lambda");
+  verify("Cela vient d'une méthode statique");
+  verify("Ce manque certaines traductions");
+  verify("Anciens caractères grecs jeux du pendu: 𐅆𐅇.");
+  verify("Escapes: ");
+  verify("\r\f\b\t\v.");
+
+  verify('Est-ce que nulle est pluriel?');
+  verify('C\'est singulier');
+  verify('C\'est pluriel (2).');
+  verify('Alice est allée à sa house');
+  verify('Bob est allé à sa house');
+  verify('cat est allé à sa litter box');
+  verify('Alice, Bob étaient allés à la magasin');
+  verify('Alice était allée à la magasin');
+  verify('Personne n\'avait allé à la magasin');
+  verify('Bob, Bob étaient allés à la magasin');
+  verify('Alice, Alice étaient allées à la magasin');
+  verify('rien');
+  verify('un');
+  verify('homme');
+  verify('femme');
+  verify('7 homme');
+  verify('7 dollars Canadiens');
+  verify('5 certaine devise ou autre.');
+  verify('1 dollar Canadien');
+  verify('2 dollars Canadiens');
+
+  var de_lines = fr_lines.skip(1).skipWhile(
+      (line) => !line.contains('----')).toList();
+  lineIterator = de_lines.iterator..moveNext();
+  verify("Printing messages for de_DE");
+  verify("Dies ist eine Nachricht");
+  verify("Eine weitere Meldung mit dem Parameter hello");
+  verify(
+      "Zeichen, die Flucht benötigen, zB Schrägstriche \\ Dollar "
+      "\${ (geschweiften Klammern sind ok) und xml reservierte Zeichen <& und "
+      "Zitate \" Parameter 1, 2 und 3");
+  verify("Dieser String erstreckt sich über mehrere "
+      "Zeilen erstrecken.");
+  verify("1, b, [c, d]");
+  verify('"Sogenannt"');
+  // This is correct, the message is forced to French, even in a German locale.
+  verify("Cette chaîne est toujours traduit");
+  verify(
+      "Interpolation ist schwierig, wenn es einen Satz wie dieser endet this.");
+  verify("Dies ergibt sich aus einer Methode");
+  verify("Diese Methode ist nicht eine Lambda");
+  verify("Dies ergibt sich aus einer statischen Methode");
+  verify("This is missing some translations");
+  verify("Antike griechische Galgenmännchen Zeichen: 𐅆𐅇");
+  verify("Escapes: ");
+  verify("\r\f\b\t\v.");
+
+  verify('Ist Null Plural?');
+  verify('Dies ist einmalig');
+  verify('Dies ist Plural (2).');
+  verify('Alice ging zu ihrem house');
+  verify('Bob ging zu seinem house');
+  verify('cat ging zu seinem litter box');
+  verify('Alice, Bob gingen zum magasin');
+  verify('Alice ging in dem magasin');
+  verify('Niemand ging zu magasin');
+  verify('Bob, Bob gingen zum magasin');
+  verify('Alice, Alice gingen zum magasin');
+  verify('Null');
+  verify('ein');
+  verify('Mann');
+  verify('Frau');
+  verify('7 Mann');
+  verify('7 Kanadischen dollar');
+  verify('5 einige Währung oder anderen.');
+  verify('1 Kanadischer dollar');
+  verify('2 Kanadischen dollar');
+}
\ No newline at end of file
diff --git a/pkg/intl/tool/generate_locale_data_files.dart b/pkg/intl/tool/generate_locale_data_files.dart
index b1ffb3f..4934d66 100644
--- a/pkg/intl/tool/generate_locale_data_files.dart
+++ b/pkg/intl/tool/generate_locale_data_files.dart
@@ -15,8 +15,8 @@
 import '../lib/date_symbol_data_local.dart';
 import '../lib/date_time_patterns.dart';
 import '../lib/intl.dart';
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 import '../test/data_directory.dart';
 import 'package:path/path.dart' as path;
 
@@ -70,10 +70,10 @@
 void writePatterns(locale, patterns) {
   var file = new File(path.join(dataDirectory, 'patterns', '${locale}.json'));
   var output = file.openWrite();
-  output.write(json.stringify(patterns));
+  output.write(JSON.encode(patterns));
   output.close();
 }
 
 void writeToJSON(dynamic data, IOSink out) {
-  out.write(json.stringify(data.serializeToMap()));
+  out.write(JSON.encode(data.serializeToMap()));
 }
diff --git a/pkg/oauth2/lib/src/credentials.dart b/pkg/oauth2/lib/src/credentials.dart
index 5bbec16..13d3320 100644
--- a/pkg/oauth2/lib/src/credentials.dart
+++ b/pkg/oauth2/lib/src/credentials.dart
@@ -5,7 +5,7 @@
 library credentials;
 
 import 'dart:async';
-import 'dart:json' as JSON;
+import 'dart:convert';
 
 import 'package:http/http.dart' as http;
 
@@ -80,7 +80,7 @@
 
     var parsed;
     try {
-      parsed = JSON.parse(json);
+      parsed = JSON.decode(json);
     } on FormatException catch (e) {
       validate(false, 'invalid JSON');
     }
@@ -125,7 +125,7 @@
   /// Serializes a set of credentials to JSON. Nothing is guaranteed about the
   /// output except that it's valid JSON and compatible with
   /// [Credentials.toJson].
-  String toJson() => JSON.stringify({
+  String toJson() => JSON.encode({
     'accessToken': accessToken,
     'refreshToken': refreshToken,
     'tokenEndpoint': tokenEndpoint == null ? null : tokenEndpoint.toString(),
diff --git a/pkg/oauth2/lib/src/handle_access_token_response.dart b/pkg/oauth2/lib/src/handle_access_token_response.dart
index c14b8d1e..129f259 100644
--- a/pkg/oauth2/lib/src/handle_access_token_response.dart
+++ b/pkg/oauth2/lib/src/handle_access_token_response.dart
@@ -5,7 +5,7 @@
 library handle_access_token_response;
 
 import 'dart:io';
-import 'dart:json' as JSON;
+import 'dart:convert';
 
 import 'package:http/http.dart' as http;
 
@@ -39,7 +39,7 @@
 
   var parameters;
   try {
-    parameters = JSON.parse(response.body);
+    parameters = JSON.decode(response.body);
   } on FormatException catch (e) {
     validate(false, 'invalid JSON');
   }
@@ -108,7 +108,7 @@
 
   var parameters;
   try {
-    parameters = JSON.parse(response.body);
+    parameters = JSON.decode(response.body);
   } on FormatException catch (e) {
     validate(false, 'invalid JSON');
   }
diff --git a/pkg/oauth2/test/authorization_code_grant_test.dart b/pkg/oauth2/test/authorization_code_grant_test.dart
index 473fee1..85c54e7 100644
--- a/pkg/oauth2/test/authorization_code_grant_test.dart
+++ b/pkg/oauth2/test/authorization_code_grant_test.dart
@@ -5,7 +5,7 @@
 library authorization_code_grant_test;
 
 import 'dart:async';
-import 'dart:json' as JSON;
+import 'dart:convert';
 
 import 'package:unittest/unittest.dart';
 import 'package:http/http.dart' as http;
@@ -151,7 +151,7 @@
           'client_secret': 'secret'
         }));
 
-        return new Future.value(new http.Response(JSON.stringify({
+        return new Future.value(new http.Response(JSON.encode({
           'access_token': 'access token',
           'token_type': 'bearer',
         }), 200, headers: {'content-type': 'application/json'}));
@@ -195,7 +195,7 @@
           'client_secret': 'secret'
         }));
 
-        return new Future.value(new http.Response(JSON.stringify({
+        return new Future.value(new http.Response(JSON.encode({
           'access_token': 'access token',
           'token_type': 'bearer',
         }), 200, headers: {'content-type': 'application/json'}));
diff --git a/pkg/oauth2/test/client_test.dart b/pkg/oauth2/test/client_test.dart
index 922302d..56dd789 100644
--- a/pkg/oauth2/test/client_test.dart
+++ b/pkg/oauth2/test/client_test.dart
@@ -5,7 +5,7 @@
 library client_test;
 
 import 'dart:async';
-import 'dart:json' as JSON;
+import 'dart:convert';
 
 import 'package:http/http.dart' as http;
 import 'package:oauth2/oauth2.dart' as oauth2;
@@ -49,7 +49,7 @@
       httpClient.expectRequest((request) {
         expect(request.method, equals('POST'));
         expect(request.url.toString(), equals(tokenEndpoint.toString()));
-        return new Future.value(new http.Response(JSON.stringify({
+        return new Future.value(new http.Response(JSON.encode({
           'access_token': 'new access token',
           'token_type': 'bearer'
         }), 200, headers: {'content-type': 'application/json'}));
@@ -99,7 +99,7 @@
       httpClient.expectRequest((request) {
         expect(request.method, equals('POST'));
         expect(request.url.toString(), equals(tokenEndpoint.toString()));
-        return new Future.value(new http.Response(JSON.stringify({
+        return new Future.value(new http.Response(JSON.encode({
           'access_token': 'new access token',
           'token_type': 'bearer'
         }), 200, headers: {'content-type': 'application/json'}));
diff --git a/pkg/oauth2/test/credentials_test.dart b/pkg/oauth2/test/credentials_test.dart
index 6a873f2..f3e303b 100644
--- a/pkg/oauth2/test/credentials_test.dart
+++ b/pkg/oauth2/test/credentials_test.dart
@@ -5,7 +5,7 @@
 library credentials_test;
 
 import 'dart:async';
-import 'dart:json' as JSON;
+import 'dart:convert';
 
 import 'package:http/http.dart' as http;
 import 'package:oauth2/oauth2.dart' as oauth2;
@@ -74,7 +74,7 @@
         "client_secret": "secret"
       }));
 
-      return new Future.value(new http.Response(JSON.stringify({
+      return new Future.value(new http.Response(JSON.encode({
         'access_token': 'new access token',
         'token_type': 'bearer',
         'refresh_token': 'new refresh token'
@@ -104,7 +104,7 @@
         "client_secret": "secret"
       }));
 
-      return new Future.value(new http.Response(JSON.stringify({
+      return new Future.value(new http.Response(JSON.encode({
         'access_token': 'new access token',
         'token_type': 'bearer'
       }), 200, headers: {'content-type': 'application/json'}));
@@ -120,7 +120,7 @@
 
   group("fromJson", () {
     oauth2.Credentials fromMap(Map map) =>
-      new oauth2.Credentials.fromJson(JSON.stringify(map));
+      new oauth2.Credentials.fromJson(JSON.encode(map));
 
     test("should load the same credentials from toJson", () {
       var expiration = new DateTime.now().subtract(new Duration(hours: 1));
diff --git a/pkg/oauth2/test/handle_access_token_response_test.dart b/pkg/oauth2/test/handle_access_token_response_test.dart
index 10e6f75..a99d8ea 100644
--- a/pkg/oauth2/test/handle_access_token_response_test.dart
+++ b/pkg/oauth2/test/handle_access_token_response_test.dart
@@ -4,7 +4,7 @@
 
 library handle_access_token_response_test;
 
-import 'dart:json' as JSON;
+import 'dart:convert';
 
 import 'package:http/http.dart' as http;
 import 'package:oauth2/oauth2.dart' as oauth2;
@@ -70,28 +70,28 @@
     });
 
     test('with a non-string error_description causes a FormatException', () {
-      expect(() => handleError(body: JSON.stringify({
+      expect(() => handleError(body: JSON.encode({
         "error": "invalid_request",
         "error_description": 12
       })), throwsFormatException);
     });
 
     test('with a non-string error_uri causes a FormatException', () {
-      expect(() => handleError(body: JSON.stringify({
+      expect(() => handleError(body: JSON.encode({
         "error": "invalid_request",
         "error_uri": 12
       })), throwsFormatException);
     });
 
     test('with a string error_description causes a AuthorizationException', () {
-      expect(() => handleError(body: JSON.stringify({
+      expect(() => handleError(body: JSON.encode({
         "error": "invalid_request",
         "error_description": "description"
       })), throwsAuthorizationException);
     });
 
     test('with a string error_uri causes a AuthorizationException', () {
-      expect(() => handleError(body: JSON.stringify({
+      expect(() => handleError(body: JSON.encode({
         "error": "invalid_request",
         "error_uri": "http://example.com/error"
       })), throwsAuthorizationException);
@@ -106,7 +106,7 @@
          expiresIn,
          refreshToken,
          scope}) {
-      return handle(new http.Response(JSON.stringify({
+      return handle(new http.Response(JSON.encode({
         'access_token': accessToken,
         'token_type': tokenType,
         'expires_in': expiresIn,
diff --git a/pkg/polymer/lib/observe_html.dart b/pkg/observe/lib/html.dart
similarity index 96%
rename from pkg/polymer/lib/observe_html.dart
rename to pkg/observe/lib/html.dart
index 7280b0e..4cae31c 100644
--- a/pkg/polymer/lib/observe_html.dart
+++ b/pkg/observe/lib/html.dart
@@ -7,10 +7,11 @@
 // getter and convert this into an Observable.
 
 /** Helpers for exposing dart:html as observable data. */
-library polymer.observe_html;
+library observe.html;
 
 import 'dart:html';
-import 'package:observe/observe.dart';
+
+import 'observe.dart';
 
 /** An observable version of [window.location.hash]. */
 final ObservableLocationHash windowLocation = new ObservableLocationHash._();
diff --git a/pkg/observe/lib/observe.dart b/pkg/observe/lib/observe.dart
index f2f8283..c1a2f80 100644
--- a/pkg/observe/lib/observe.dart
+++ b/pkg/observe/lib/observe.dart
@@ -80,9 +80,11 @@
 // above.
 import 'src/dirty_check.dart';
 
+part 'src/bind_property.dart';
 part 'src/change_notifier.dart';
 part 'src/change_record.dart';
 part 'src/compound_binding.dart';
+part 'src/list_path_observer.dart';
 part 'src/observable.dart';
 part 'src/observable_box.dart';
 part 'src/observable_list.dart';
diff --git a/pkg/observe/lib/src/bind_property.dart b/pkg/observe/lib/src/bind_property.dart
new file mode 100644
index 0000000..c8524e7
--- /dev/null
+++ b/pkg/observe/lib/src/bind_property.dart
@@ -0,0 +1,35 @@
+// 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.
+
+part of observe;
+
+/**
+ * Forwards an observable property from one object to another. For example:
+ *
+ *     class MyModel extends ObservableBase {
+ *       StreamSubscription _sub;
+ *       MyOtherModel _otherModel;
+ *
+ *       MyModel() {
+ *         ...
+ *         _sub = bindProperty(_otherModel, const Symbol('value'),
+ *             () => notifyProperty(this, const Symbol('prop'));
+ *       }
+ *
+ *       String get prop => _otherModel.value;
+ *       set prop(String value) { _otherModel.value = value; }
+ *     }
+ *
+ * See also [notifyProperty].
+ */
+StreamSubscription bindProperty(Observable source, Symbol sourceName,
+    void callback()) {
+  return source.changes.listen((records) {
+    for (var record in records) {
+      if (record.changes(sourceName)) {
+        callback();
+      }
+    }
+  });
+}
diff --git a/pkg/polymer/lib/observe.dart b/pkg/observe/lib/src/list_path_observer.dart
similarity index 63%
rename from pkg/polymer/lib/observe.dart
rename to pkg/observe/lib/src/list_path_observer.dart
index 0a02a90..5b83a25 100644
--- a/pkg/polymer/lib/observe.dart
+++ b/pkg/observe/lib/src/list_path_observer.dart
@@ -2,57 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Helpers for observable objects.
- * Intended for use with `package:observe`.
- */
-library polymer.observe;
-
-import 'dart:async';
-import 'package:observe/observe.dart';
+part of observe;
 
 const _VALUE = const Symbol('value');
 
-/**
- * Forwards an observable property from one object to another. For example:
- *
- *     class MyModel extends ObservableBase {
- *       StreamSubscription _sub;
- *       MyOtherModel _otherModel;
- *
- *       MyModel() {
- *         ...
- *         _sub = bindProperty(_otherModel, const Symbol('value'),
- *             () => notifyProperty(this, const Symbol('prop'));
- *       }
- *
- *       String get prop => _otherModel.value;
- *       set prop(String value) { _otherModel.value = value; }
- *     }
- *
- * See also [notifyProperty].
- */
-StreamSubscription bindProperty(Observable source, Symbol sourceName,
-    void callback()) {
-  return source.changes.listen((records) {
-    for (var record in records) {
-      if (record.changes(sourceName)) {
-        callback();
-      }
-    }
-  });
-}
-
-/**
- * Notify the property change. Shorthand for:
- *
- *     target.notifyChange(new PropertyChangeRecord(targetName));
- */
-void notifyProperty(Observable target, Symbol targetName) {
-  target.notifyChange(new PropertyChangeRecord(targetName));
-}
-
-
 // Inspired by ArrayReduction at:
 // https://raw.github.com/rafaelw/ChangeSummary/master/util/array_reduction.js
 // The main difference is we support anything on the rich Dart Iterable API.
diff --git a/pkg/observe/lib/src/microtask.dart b/pkg/observe/lib/src/microtask.dart
index e56fb62..6689a8c 100644
--- a/pkg/observe/lib/src/microtask.dart
+++ b/pkg/observe/lib/src/microtask.dart
@@ -11,6 +11,7 @@
 library observe.src.microtask;
 
 import 'dart:async' show Completer, runZonedExperimental;
+import 'dart:collection';
 import 'package:observe/observe.dart' show Observable;
 
 // TODO(jmesserly): remove "microtask" from these names and instead import
@@ -24,14 +25,17 @@
  * performing [Observable.dirtyCheck], until there are no more pending events.
  * It will always dirty check at least once.
  */
+// TODO(jmesserly): do we want to support nested microtasks similar to nested
+// zones? Instead of a single pending list we'd need one per wrapMicrotask,
+// and [performMicrotaskCheckpoint] would only run pending callbacks
+// corresponding to the innermost wrapMicrotask body.
 void performMicrotaskCheckpoint() {
   Observable.dirtyCheck();
 
-  while (_pending.length > 0) {
-    var pending = _pending;
-    _pending = [];
+  while (_pending.isNotEmpty) {
 
-    for (var callback in pending) {
+    for (int len = _pending.length; len > 0 && _pending.isNotEmpty; len--) {
+      final callback = _pending.removeFirst();
       try {
         callback();
       } catch (e, s) {
@@ -43,20 +47,23 @@
   }
 }
 
-List<Function> _pending = [];
+final Queue<Function> _pending = new Queue<Function>();
 
 /**
- * Wraps the [testCase] in a zone that supports [performMicrotaskCheckpoint],
- * and returns the test case.
+ * Wraps the [body] in a zone that supports [performMicrotaskCheckpoint],
+ * and returns the body.
  */
-wrapMicrotask(void testCase()) {
-  return () {
-    runZonedExperimental(() {
-      try {
-        testCase();
-      } finally {
-        performMicrotaskCheckpoint();
-      }
-    }, onRunAsync: (callback) => _pending.add(callback));
-  };
-}
+// TODO(jmesserly): deprecate? this doesn't add much over runMicrotask.
+wrapMicrotask(body()) => () => runMicrotask(body);
+
+/**
+ * Runs the [body] in a zone that supports [performMicrotaskCheckpoint],
+ * and returns the result.
+ */
+runMicrotask(body()) => runZonedExperimental(() {
+  try {
+    return body();
+  } finally {
+    performMicrotaskCheckpoint();
+  }
+}, onRunAsync: (callback) => _pending.add(callback));
diff --git a/pkg/observe/lib/src/observable.dart b/pkg/observe/lib/src/observable.dart
index 7610a0f..0127d6e 100644
--- a/pkg/observe/lib/src/observable.dart
+++ b/pkg/observe/lib/src/observable.dart
@@ -192,6 +192,15 @@
   }
 }
 
+/**
+ * Notify the property change. Shorthand for:
+ *
+ *     target.notifyChange(new PropertyChangeRecord(targetName));
+ */
+void notifyProperty(Observable target, Symbol targetName) {
+  target.notifyChange(new PropertyChangeRecord(targetName));
+}
+
 // TODO(jmesserly): remove the instance method and make this top-level method
 // public instead?
 _notifyPropertyChange(Observable obj, Symbol field, Object oldValue,
diff --git a/pkg/observe/lib/src/path_observer.dart b/pkg/observe/lib/src/path_observer.dart
index 6e31b55..931ee04 100644
--- a/pkg/observe/lib/src/path_observer.dart
+++ b/pkg/observe/lib/src/path_observer.dart
@@ -171,6 +171,10 @@
 }
 
 _getObjectProperty(object, property) {
+  if (object == null) {
+    return null;
+  }
+
   if (object is List && property is int) {
     if (property >= 0 && property < object.length) {
       return object[property];
diff --git a/pkg/observe/lib/transform.dart b/pkg/observe/lib/transform.dart
index 99cb13b..029a017 100644
--- a/pkg/observe/lib/transform.dart
+++ b/pkg/observe/lib/transform.dart
@@ -9,7 +9,7 @@
 library observe.transform;
 
 import 'dart:async';
-import 'package:path/path.dart' as path;
+
 import 'package:analyzer_experimental/src/generated/ast.dart';
 import 'package:analyzer_experimental/src/generated/error.dart';
 import 'package:analyzer_experimental/src/generated/parser.dart';
@@ -20,7 +20,7 @@
 
 /**
  * A [Transformer] that replaces observables based on dirty-checking with an
- * implementation based on change notifications. 
+ * implementation based on change notifications.
  *
  * The transformation adds hooks for field setters and notifies the observation
  * system of the change.
@@ -38,9 +38,8 @@
   }
 
   Future apply(Transform transform) {
-    return transform.primaryInput
-        .then((input) => input.readAsString().then((content) {
-      var id = transform.primaryId;
+    return transform.primaryInput.readAsString().then((content) {
+      var id = transform.primaryInput.id;
       // TODO(sigmund): improve how we compute this url
       var url = id.path.startsWith('lib/')
             ? 'package:${id.package}/${id.path.substring(4)}' : id.path;
@@ -48,7 +47,7 @@
       var transaction = _transformCompilationUnit(
           content, sourceFile, transform.logger);
       if (!transaction.hasEdits) {
-        transform.addOutput(input);
+        transform.addOutput(transform.primaryInput);
         return;
       }
       var printer = transaction.commit();
@@ -56,22 +55,14 @@
       // dartbug.com/12340)
       printer.build(url);
       transform.addOutput(new Asset.fromString(id, printer.text));
-    }));
+    });
   }
 }
 
 TextEditTransaction _transformCompilationUnit(
     String inputCode, SourceFile sourceFile, TransformLogger logger) {
   var unit = _parseCompilationUnit(inputCode);
-  return transformObservables(unit, sourceFile, inputCode, logger);
-}
-
-// TODO(sigmund): make this private. This is currently public so it can be used
-// by the polymer.dart package which is not yet entirely migrated to use
-// pub-serve and pub-deploy.
-TextEditTransaction transformObservables(CompilationUnit unit,
-    SourceFile sourceFile, String content, TransformLogger logger) {
-  var code = new TextEditTransaction(content, sourceFile);
+  var code = new TextEditTransaction(inputCode, sourceFile);
   for (var directive in unit.directives) {
     if (directive is LibraryDirective && _hasObservable(directive)) {
       logger.warning('@observable on a library no longer has any effect. '
@@ -182,8 +173,7 @@
 
   for (var member in cls.members) {
     if (member is FieldDeclaration) {
-      bool isStatic = _hasKeyword(member.keyword, Keyword.STATIC);
-      if (isStatic) {
+      if (member.isStatic) {
         if (_hasObservable(member)){
           logger.warning('Static fields can no longer be observable. '
               'Observable fields should be put in an observable objects.',
diff --git a/pkg/observe/test/observe_test.dart b/pkg/observe/test/observe_test.dart
index 8b07d4b..b181ccb 100644
--- a/pkg/observe/test/observe_test.dart
+++ b/pkg/observe/test/observe_test.dart
@@ -14,7 +14,7 @@
 
 const _VALUE = const Symbol('value');
 
-main() {
+void main() {
   // Note: to test the basic Observable system, we use ObservableBox due to its
   // simplicity. We also test a variant that is based on dirty-checking.
 
@@ -22,9 +22,9 @@
     expect(dirty_check.allObservablesCount, 0);
   });
 
-  group('WatcherModel', () { observeTests(watch: true); });
+  group('WatcherModel', () { _observeTests(watch: true); });
 
-  group('ObservableBox', () { observeTests(); });
+  group('ObservableBox', () { _observeTests(); });
 
   group('dirtyCheck loops can be debugged', () {
     var messages;
@@ -60,8 +60,7 @@
   });
 }
 
-observeTests({bool watch: false}) {
-
+void _observeTests({bool watch: false}) {
   final createModel = watch ? (x) => new WatcherModel(x)
       : (x) => new ObservableBox(x);
 
@@ -84,6 +83,11 @@
         reason: 'Observable object leaked');
   });
 
+  observeTest('handle future result', () {
+    var callback = expectAsync0((){});
+    return new Future(callback);
+  });
+
   observeTest('no observers', () {
     var t = createModel(123);
     expect(t.value, 123);
diff --git a/pkg/observe/test/path_observer_test.dart b/pkg/observe/test/path_observer_test.dart
index 581b684..9ed8945 100644
--- a/pkg/observe/test/path_observer_test.dart
+++ b/pkg/observe/test/path_observer_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
 import 'package:observe/observe.dart';
 import 'package:unittest/unittest.dart';
 import 'observe_test_utils.dart';
diff --git a/pkg/observe/test/transform_test.dart b/pkg/observe/test/transform_test.dart
index 13b67cd..9a64fac 100644
--- a/pkg/observe/test/transform_test.dart
+++ b/pkg/observe/test/transform_test.dart
@@ -46,6 +46,18 @@
     _testInitializers('this.a, [this.b]', '(a, [b]) : __\$a = a, __\$b = b');
     _testInitializers('this.a, {this.b}', '(a, {b}) : __\$a = a, __\$b = b');
   });
+
+  group('test full text', () {
+    test('with changes', () {
+      return _transform(_sampleObservable('A', 'foo'))
+        .then((output) => expect(output, _sampleObservableOutput('A', 'foo')));
+    });
+
+    test('no changes', () {
+      var input = 'class A {/*@observable annotation to trigger transform */;}';
+      return _transform(input).then((output) => expect(output, input));
+    });
+  });
 }
 
 _testClause(String clauses, String expected) {
@@ -105,13 +117,12 @@
 class _MockTransform implements Transform {
   List<Asset> outs = [];
   Asset _asset;
-  AssetId get primaryId => _asset.id;
   TransformLogger logger = new TransformLogger(false);
-  Future<Asset> get primaryInput => new Future.value(_asset);
+  Asset get primaryInput => _asset;
 
   _MockTransform(this._asset);
   Future<Asset> getInput(Asset id) {
-    if (id == primaryId) return primaryInput;
+    if (id == primaryInput.id) return new Future.value(primaryInput);
     fail();
   }
 
@@ -119,3 +130,28 @@
     outs.add(output);
   }
 }
+
+String _sampleObservable(String className, String fieldName) => '''
+library ${className}_$fieldName;
+import 'package:observe/observe.dart';
+
+class $className extends ObservableBase {
+  @observable int $fieldName;
+  $className(this.$fieldName);
+}
+''';
+
+String _sampleObservableOutput(String className, String fieldName) => '''
+library ${className}_$fieldName;
+import 'package:observe/observe.dart';
+
+class $className extends ChangeNotifierBase {
+  int __\$$fieldName;
+  int get $fieldName => __\$$fieldName;
+  set $fieldName(int value) {
+    __\$$fieldName = notifyPropertyChange(const Symbol('$fieldName'), __\$$fieldName, value);
+  }
+  
+  $className($fieldName) : __\$$fieldName = $fieldName;
+}
+''';
diff --git a/pkg/pkg.status b/pkg/pkg.status
index f70e05a..af24990 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -20,6 +20,9 @@
 
 # Skip test not runnable via test.dart
 third_party/html5lib/test/dom_compat_test: Skip
+third_party/html5lib/test/browser/browser_test: Skip
+
+polymer_expressions/test/syntax_test: Skip # Issue 12954
 
 [ $compiler == dart2js && $runtime == d8 ]
 unmodifiable_collection/test/unmodifiable_collection_test: Pass, Fail # Issue 12429
@@ -56,6 +59,7 @@
 [ $runtime == ie9 ]
 intl/test/date_time_format_http_request_test: Fail # Issue 8983
 mime/test/mime_multipart_transformer_test: Skip # No typed_data on IE9.
+sequence_zip/test/stream_test: Pass, Fail # Flaky, issue 12873
 
 [ $runtime == safari ]
 fixnum/test/int_64_test: Pass, Fail # Bug in JSC.
@@ -111,7 +115,7 @@
 analyzer_experimental/test/error_test: Fail, OK # Uses dart:io.
 analyzer_experimental/test/generated/element_test: Fail, OK # Uses dart:io.
 analyzer_experimental/test/generated/resolver_test: Fail, OK # Uses dart:io.
-analyzer_experimental/test/options_test: Fail, OK # Uses dart:io.
+analyzer_experimental/test/options_test: Fail, OK, Pass # Uses dart:io.
 analyzer_experimental/test/services/formatter_test: Fail, OK # Uses dart:io.
 analyzer_experimental/test/parse_compilation_unit_test: Fail, OK # Uses dart:io.
 barback/test/*: Fail, OK # Uses dart:io.
@@ -203,3 +207,13 @@
 
 [ $runtime == safari || $runtime == chrome || $runtime == ie9 || $runtime == ff || $runtime == dartium || $runtime == drt ]
 docgen/test/single_library_test: Skip # Uses dart:io
+
+[ $browser || $runtime == vm ]
+unittest/test/missing_tick_test: Fail, OK # This test should fail, not time out.
+
+# Issue http://dartbug.com/12930
+[ $runtime == vm ]
+intl/test/message_extraction/message_extraction_test: Pass, Fail # Issue 12930
+
+[ $compiler == none && $runtime == drt && $arch == ia32 ]
+custom_element/test/custom_element_test: Fail, Pass # http://dartbug.com/12964
diff --git a/pkg/polymer/bin/dwc.dart b/pkg/polymer/bin/dwc.dart
deleted file mode 100755
index 3d3a0a2..0000000
--- a/pkg/polymer/bin/dwc.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env dart
-// 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
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:polymer/dwc.dart' as dwc;
-
-void main() => dwc.main();
diff --git a/pkg/polymer/build.dart b/pkg/polymer/build.dart
index 5e863b8..4599716 100755
--- a/pkg/polymer/build.dart
+++ b/pkg/polymer/build.dart
@@ -9,9 +9,7 @@
 import 'dart:io';
 
 void main() {
-  var args = new Options().arguments.toList()..addAll(['--', '--deploy']);
-  build(args, [
+  build(new Options().arguments, [
     'example/component/news/web/index.html',
-    'example/scoped_style/index.html',
-    '../../samples/third_party/todomvc/web/index.html']);
+    'example/scoped_style/index.html']);
 }
diff --git a/pkg/polymer/example/component/news/test/expected/news_index_test.html.txt b/pkg/polymer/example/component/news/test/expected/news_index_test.html.txt
index 8a45ae6..0850734 100644
--- a/pkg/polymer/example/component/news/test/expected/news_index_test.html.txt
+++ b/pkg/polymer/example/component/news/test/expected/news_index_test.html.txt
@@ -1,8 +1,8 @@
 Content-Type: text/plain
-<html><head><style shadowcssshim="">template { display: none; }</style>
+<html><head>
   <title>Simple Web Components Example</title>
   
-  <script src="../../packages/polymer/testing/testing.js"></script>
+  <script src="packages/polymer/testing/testing.js"></script>
 <style>template,
 thead[template],
 tbody[template],
@@ -16,7 +16,9 @@
 option[template] {
   display: none;
 }</style></head>
-<body><polymer-element name="x-news" extends="ul">
+<body><script src="packages/shadow_dom/shadow_dom.min.js"></script>
+<script src="packages/browser/interop.js"></script>
+<polymer-element name="x-news" extends="ul">
     <template>
         <style scoped="">
             div.breaking {
@@ -44,20 +46,9 @@
     </template>
     
 </polymer-element>
-
 <h1>Simple Web Components Example</h1>
 <ul is="x-news"><shadow-root>
-        <style scoped="">
-            div.breaking {
-                color: Red;
-                font-size: 20px;
-                border: 1px dashed Purple;
-            }
-            div.other {
-                padding: 2px 0 0 0;
-                border: 1px solid Cyan;
-            }
-        </style>
+        <style scoped="">/* style hidden by testing.js */</style>
         <div class="breaking">
             <h2>Breaking Stories</h2>
             <ul>
@@ -81,6 +72,4 @@
 
 
 
-<script type="text/javascript" src="packages/shadow_dom/shadow_dom.debug.js"></script>
-<script type="text/javascript" src="packages/browser/interop.js"></script>
 <script type="application/dart" src="news_index_test.html_bootstrap.dart"></script></body></html>
diff --git a/pkg/polymer/example/component/news/web/news-component.html b/pkg/polymer/example/component/news/web/news-component.html
index 8e604d2..7f63f54 100644
--- a/pkg/polymer/example/component/news/web/news-component.html
+++ b/pkg/polymer/example/component/news/web/news-component.html
@@ -1,49 +1,37 @@
-<!DOCTYPE html>
-<!--
-This example is from
-https://github.com/dglazkov/Web-Components-Polyfill/blob/master/samples/news
--->
-<html>
-<head>
-    <title>News Component</title>
-</head>
-<body>
 <polymer-element name="x-news" extends="ul">
-    <template>
-        <style scoped>
-            div.breaking {
-                color: Red;
-                font-size: 20px;
-                border: 1px dashed Purple;
-            }
-            div.other {
-                padding: 2px 0 0 0;
-                border: 1px solid Cyan;
-            }
-        </style>
-        <div class="breaking">
-            <h2>Breaking Stories</h2>
-            <ul>
-                <content select=".breaking"></content>
-            </ul>
-        </div>
-        <div class="other">
-            <h2>Other News</h2>
-            <ul>
-                <content></content>
-            </ul>
-        </div>
-    </template>
-    <script type="application/dart">
-      import 'package:polymer/polymer.dart';
-
-      class XNews extends PolymerElement {}
-
-      @initMethod
-      _init() {
-        registerPolymerElement('x-news', () => new XNews());
+  <template>
+    <style scoped>
+      div.breaking {
+          color: Red;
+          font-size: 20px;
+          border: 1px dashed Purple;
       }
-    </script>
+      div.other {
+          padding: 2px 0 0 0;
+          border: 1px solid Cyan;
+      }
+    </style>
+    <div class="breaking">
+      <h2>Breaking Stories</h2>
+      <ul>
+          <content select=".breaking"></content>
+      </ul>
+    </div>
+    <div class="other">
+      <h2>Other News</h2>
+      <ul>
+          <content></content>
+      </ul>
+    </div>
+  </template>
+  <script type="application/dart">
+    import 'package:polymer/polymer.dart';
+
+    class XNews extends PolymerElement {}
+
+    @initMethod
+    _init() {
+      registerPolymerElement('x-news', () => new XNews());
+    }
+  </script>
 </polymer-element>
-</body>
-</html>
diff --git a/pkg/polymer/example/scoped_style/my_test.html b/pkg/polymer/example/scoped_style/my_test.html
index 2713a3f..c759c66 100644
--- a/pkg/polymer/example/scoped_style/my_test.html
+++ b/pkg/polymer/example/scoped_style/my_test.html
@@ -1,9 +1,3 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Test Compopnent</title>
-</head>
-<body>
 <polymer-element name="my-test">
   <template>
     <style>
@@ -18,5 +12,3 @@
     class MyTest extends PolymerElement {}
   </script>
 </polymer-element>
-</body>
-</html>
diff --git a/pkg/polymer/lib/boot.js b/pkg/polymer/lib/boot.js
index 84bb489..0a3fe62 100644
--- a/pkg/polymer/lib/boot.js
+++ b/pkg/polymer/lib/boot.js
@@ -82,7 +82,11 @@
     if (!seen) seen = {};
     var links = content.querySelectorAll('link[rel="import"]');
     for (var i = 0; i < links.length; i++) {
-      var link = links[i].import;
+      var link = links[i];
+      // TODO(jmesserly): figure out why ".import" fails in content_shell but
+      // works in Dartium.
+      if (link.import && link.import.href) link = link.import;
+
       if (seen[link.href]) continue;
       seen[link.href] = link;
       inlinePolymerElements(link.content, ref, seen);
diff --git a/pkg/polymer/lib/component_build.dart b/pkg/polymer/lib/component_build.dart
index 316124e..7184787 100644
--- a/pkg/polymer/lib/component_build.dart
+++ b/pkg/polymer/lib/component_build.dart
@@ -19,8 +19,8 @@
 library build_utils;
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 import 'package:args/args.dart';
 
 import 'dwc.dart' as dwc;
@@ -32,8 +32,7 @@
  * [entryPoints] listed. On clean commands, the directory where [entryPoints]
  * live will be scanned for generated files to delete them.
  */
-// TODO(jmesserly): we need a better way to automatically detect input files
-Future<List<dwc.CompilerResult>> build(List<String> arguments,
+Future<List<dwc.AnalysisResults>> build(List<String> arguments,
     List<String> entryPoints,
     {bool printTime: true, bool shouldPrint: true}) {
   bool useColors = stdioType(stdout) == StdioType.TERMINAL;
@@ -54,29 +53,11 @@
 
     var options = CompilerOptions.parse(args.rest, checkUsage: false);
 
-    // [outputOnlyDirs] contains directories known to only have output files.
-    // When outputDir is not specified, we create a new directory which only
-    // contains output files. If options.outputDir is specified, we don't know
-    // if the output directory may also have input files. In which case,
-    // [_handleCleanCommand] and [_isInputFile] are more conservative.
-    //
-    // TODO(sigmund): get rid of this. Instead, use the compiler to understand
-    // which files are input or output files.
-    var outputOnlyDirs = options.outputDir == null ? []
-        : entryPoints.map((e) => _outDir(e)).toList();
-
-    if (cleanBuild) {
-      _handleCleanCommand(outputOnlyDirs);
-    } else if (fullBuild
-        || changedFiles.any((f) => _isInputFile(f, outputOnlyDirs))
-        || removedFiles.any((f) => _isInputFile(f, outputOnlyDirs))) {
+    if (fullBuild || !changedFiles.isEmpty || !removedFiles.isEmpty) {
       for (var file in entryPoints) {
         var dwcArgs = new List.from(args.rest);
         if (machineFormat) dwcArgs.add('--json_format');
         if (!useColors) dwcArgs.add('--no-colors');
-        // We'll set 'out/' as the out folder, unless an output directory was
-        // already specified in the command line.
-        if (options.outputDir == null) dwcArgs.addAll(['-o', _outDir(file)]);
         dwcArgs.add(file);
         // Chain tasks to that we run one at a time.
         lastTask = lastTask.then((_) => dwc.run(dwcArgs, printTime: printTime,
@@ -84,20 +65,10 @@
         if (machineFormat) {
           lastTask = lastTask.then((res) {
             appendMessage(Map jsonMessage) {
-              var message = json.stringify([jsonMessage]);
+              var message = JSON.encode([jsonMessage]);
               if (shouldPrint) print(message);
               res.messages.add(message);
             }
-            // Print for the Editor messages about mappings and generated files
-            res.outputs.forEach((out, input) {
-              if (out.endsWith(".html") && input != null) {
-                appendMessage({
-                  "method": "mapping",
-                  "params": {"from": input, "to": out},
-                });
-              }
-              appendMessage({"method": "generated", "params": {"file": out}});
-            });
             return res;
           });
         }
@@ -108,38 +79,6 @@
   }, printTime: printTime, useColors: useColors);
 }
 
-String _outDir(String file) => path.join(path.dirname(file), 'out');
-
-/** Tell whether [filePath] is a generated file. */
-bool _isGeneratedFile(String filePath, List<String> outputOnlyDirs) {
-  var dirPrefix = path.dirname(filePath);
-  for (var outDir in outputOnlyDirs) {
-    if (dirPrefix.startsWith(outDir)) return true;
-  }
-  return path.basename(filePath).startsWith('_');
-}
-
-/** Tell whether [filePath] is an input file. */
-bool _isInputFile(String filePath, List<String> outputOnlyDirs) {
-  var ext = path.extension(filePath);
-  return (ext == '.dart' || ext == '.html') &&
-      !_isGeneratedFile(filePath, outputOnlyDirs);
-}
-
-/**
- * Delete all generated files. Currently we only delete files under directories
- * that are known to contain only generated code.
- */
-void _handleCleanCommand(List<String> outputOnlyDirs) {
-  for (var dirPath in outputOnlyDirs) {
-    var dir = new Directory(dirPath);
-    if (!dir.existsSync()) continue;
-    for (var f in dir.listSync(recursive: false)) {
-      if (f is File && _isGeneratedFile(f.path, outputOnlyDirs)) f.deleteSync();
-    }
-  }
-}
-
 /** Process the command-line arguments. */
 ArgResults _processArgs(List<String> arguments) {
   var parser = new ArgParser()
@@ -147,7 +86,8 @@
         allowMultiple: true)
     ..addOption("removed", help: "the file was removed since the last build",
         allowMultiple: true)
-    ..addFlag("clean", negatable: false, help: "remove any build artifacts")
+    ..addFlag("clean", negatable: false, help: "currently a noop, may be used "
+        "in the future to remove any build artifacts")
     ..addFlag("full", negatable: false, help: "perform a full build")
     ..addFlag("machine", negatable: false,
         help: "produce warnings in a machine parseable format")
diff --git a/pkg/polymer/lib/deploy.dart b/pkg/polymer/lib/deploy.dart
index 86f157b..73051c4 100644
--- a/pkg/polymer/lib/deploy.dart
+++ b/pkg/polymer/lib/deploy.dart
@@ -15,8 +15,8 @@
 library polymer.deploy;
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
@@ -26,17 +26,43 @@
 import 'package:args/args.dart';
 
 main() {
-  var args = _parseArgs();
+  var args = _parseArgs(new Options().arguments);
   if (args == null) return;
   print('polymer/deploy.dart: creating a deploy target for "$_currentPackage"');
+  var outDir = args['out'];
+  _run(args['webdir'], outDir).then(
+      (_) => print('Done! All files written to "$outDir"'));
+}
+
+/**
+ * API exposed for testing purposes. Runs this deploy command but prentend that
+ * the sources under [webDir] belong to package 'test'.
+ */
+Future runForTest(String webDir, String outDir) {
+  _currentPackage = 'test';
+
+  // associate package dirs with their location in the repo:
+  _packageDirs = {'test' : '.'};
+  addPackages(String dir) {
+    for (var packageDir in new Directory(dir).listSync().map((d) => d.path)) {
+      _packageDirs[path.basename(packageDir)] = packageDir;
+    }
+  }
+  addPackages('..');
+  addPackages('../third_party');
+  addPackages('../../third_party/pkg');
+  return _run(webDir, outDir);
+}
+
+Future _run(String webDir, String outDir) {
   var barback = new Barback(new _PolymerDeployProvider());
-  _initializeBarback(barback);
+  _initializeBarback(barback, webDir);
   _attachListeners(barback);
-  _emitAllFiles(barback, args['out']);
+  return _emitAllFiles(barback, webDir, outDir);
 }
 
 /** Tell barback which transformers to use and which assets to process. */
-void _initializeBarback(Barback barback) {
+void _initializeBarback(Barback barback, String webDir) {
   var assets = [];
   for (var package in _packageDirs.keys) {
     // Do not process packages like 'polymer' where there is nothing to do.
@@ -54,7 +80,7 @@
   }
 
   // In case of the current package, include also 'web'.
-  for (var filepath in _listDir(_currentPackage, 'web')) {
+  for (var filepath in _listDir(_currentPackage, webDir)) {
     assets.add(new AssetId(_currentPackage, filepath));
   }
   barback.updateSources(assets);
@@ -100,17 +126,17 @@
  * Emits all outputs of [barback] and copies files that we didn't process (like
  * polymer's libraries).
  */
-Future _emitAllFiles(Barback barback, String outDir) {
+Future _emitAllFiles(Barback barback, String webDir, String outDir) {
   return barback.getAllAssets().then((assets) {
     // Copy all the assets we transformed
     var futures = [];
     for (var asset in assets) {
       var id = asset.id;
       var filepath;
-      if (id.package == _currentPackage && id.path.startsWith('web/')) {
+      if (id.package == _currentPackage && id.path.startsWith('$webDir/')) {
         filepath = path.join(outDir, id.path);
       } else if (id.path.startsWith('lib/')) {
-        filepath = path.join(outDir, 'web', 'packages', id.package,
+        filepath = path.join(outDir, webDir, 'packages', id.package,
             id.path.substring(4));
       } else {
         // TODO(sigmund): do something about other assets?
@@ -128,7 +154,7 @@
     for (var package in _ignoredPackages) {
       for (var relpath in _listDir(package, 'lib')) {
         var inpath = path.join(_packageDirs[package], relpath);
-        var outpath = path.join(outDir, 'web', 'packages', package,
+        var outpath = path.join(outDir, webDir, 'packages', package,
             relpath.substring(4));
         _ensureDir(path.dirname(outpath));
 
@@ -137,8 +163,7 @@
           .then((_) => writer.close()));
       }
     }
-    return Future.wait(futures)
-      .then((_) => print('Done! All files written to "$outDir"'));
+    return Future.wait(futures);
   });
 }
 
@@ -182,7 +207,7 @@
     print(result.stderr);
     exit(result.exitCode);
   }
-  var map = json.parse(result.stdout)["packages"];
+  var map = JSON.decode(result.stdout)["packages"];
   map.forEach((k, v) { map[k] = path.dirname(v); });
   map[_currentPackage] = '.';
   return map;
@@ -194,7 +219,7 @@
  */
 // TODO(sigmund): consider computing this list by recursively parsing
 // pubspec.yaml files in the [_packageDirs].
-Set<String> _ignoredPackages =
+final Set<String> _ignoredPackages =
     (const [ 'analyzer_experimental', 'args', 'barback', 'browser', 'csslib',
              'custom_element', 'fancy_syntax', 'html5lib', 'html_import', 'js',
              'logging', 'mdv', 'meta', 'mutation_observer', 'observe', 'path',
@@ -203,14 +228,16 @@
              'unmodifiable_collection', 'yaml'
            ]).toSet();
 
-ArgResults _parseArgs() {
+ArgResults _parseArgs(arguments) {
   var parser = new ArgParser()
       ..addFlag('help', abbr: 'h', help: 'Displays this help message',
           defaultsTo: false, negatable: false)
+      ..addOption('webdir', help: 'Directory containing the application',
+          defaultsTo: 'web')
       ..addOption('out', abbr: 'o', help: 'Directory where to generated files',
           defaultsTo: 'out');
   try {
-    var results = parser.parse(new Options().arguments);
+    var results = parser.parse(arguments);
     if (results['help']) {
       _showUsage(parser);
       return null;
diff --git a/pkg/polymer/lib/dwc.dart b/pkg/polymer/lib/dwc.dart
old mode 100755
new mode 100644
index b70f29b..b0cc4db
--- a/pkg/polymer/lib/dwc.dart
+++ b/pkg/polymer/lib/dwc.dart
@@ -10,15 +10,11 @@
 import 'package:logging/logging.dart' show Level;
 
 import 'src/compiler.dart';
-import 'src/file_system.dart';
 import 'src/file_system/console.dart';
-import 'src/files.dart';
 import 'src/messages.dart';
 import 'src/compiler_options.dart';
 import 'src/utils.dart';
 
-FileSystem _fileSystem;
-
 void main() {
   run(new Options().arguments).then((result) {
     exit(result.success ? 0 : 1);
@@ -26,173 +22,37 @@
 }
 
 /** Contains the result of a compiler run. */
-class CompilerResult {
+class AnalysisResults {
+
+  /** False when errors were found by our polymer analyzer. */
   final bool success;
 
-  /** Map of output path to source, if there is one */
-  final Map<String, String> outputs;
-
-  /** List of files read during compilation */
-  final List<String> inputs;
-
+  /** Error and warning messages collected by the analyzer. */
   final List<String> messages;
-  String bootstrapFile;
 
-  CompilerResult([this.success = true,
-                  this.outputs,
-                  this.inputs,
-                  this.messages = const [],
-                  this.bootstrapFile]);
-
-  factory CompilerResult._(bool success,
-      List<String> messages, List<OutputFile> outputs, List<SourceFile> files) {
-    var file;
-    var outs = new Map<String, String>();
-    for (var out in outputs) {
-      if (path.basename(out.path).endsWith('_bootstrap.dart')) {
-        file = out.path;
-      }
-      outs[out.path] = out.source;
-    }
-    var inputs = files.map((f) => f.path).toList();
-    return new CompilerResult(success, outs, inputs, messages, file);
-  }
+  AnalysisResults(this.success, this.messages);
 }
 
 /**
- * Runs the web components compiler with the command-line options in [args].
+ * Runs the polymer analyzer with the command-line options in [args].
  * See [CompilerOptions] for the definition of valid arguments.
  */
-// TODO(jmesserly): fix this to return a proper exit code
-// TODO(justinfagnani): return messages in the result
-Future<CompilerResult> run(List<String> args, {bool printTime,
+// TODO(sigmund): rename to analyze? and rename file as analyzer.dart
+Future<AnalysisResults> run(List<String> args, {bool printTime,
     bool shouldPrint: true}) {
   var options = CompilerOptions.parse(args);
-  if (options == null) return new Future.value(new CompilerResult());
+  if (options == null) return new Future.value(new AnalysisResults(true, []));
   if (printTime == null) printTime = options.verbose;
 
-  _fileSystem = new ConsoleFileSystem();
-  var messages = new Messages(options: options, shouldPrint: shouldPrint);
-
   return asyncTime('Total time spent on ${options.inputFile}', () {
-    var compiler = new Compiler(_fileSystem, options, messages);
-    var res;
-    return compiler.run()
-      .then((_) {
-        var success = messages.messages.every((m) => m.level != Level.SEVERE);
-        var msgs = options.jsonFormat
-            ? messages.messages.map((m) => m.toJson())
-            : messages.messages.map((m) => m.toString());
-        res = new CompilerResult._(success, msgs.toList(),
-            compiler.output, compiler.files);
-      })
-      .then((_) => _symlinkPubPackages(res, options, messages))
-      .then((_) => _emitFiles(compiler.output, options.clean))
-      .then((_) => res);
+    var messages = new Messages(options: options, shouldPrint: shouldPrint);
+    var compiler = new Compiler(new ConsoleFileSystem(), options, messages);
+    return compiler.run().then((_) {
+      var success = messages.messages.every((m) => m.level != Level.SEVERE);
+      var msgs = options.jsonFormat
+          ? messages.messages.map((m) => m.toJson())
+          : messages.messages.map((m) => m.toString());
+      return new AnalysisResults(success, msgs.toList());
+    });
   }, printTime: printTime, useColors: options.useColors);
 }
-
-Future _emitFiles(List<OutputFile> outputs, bool clean) {
-  outputs.forEach((f) => _writeFile(f.path, f.contents, clean));
-  return _fileSystem.flush();
-}
-
-void _writeFile(String filePath, String contents, bool clean) {
-  if (clean) {
-    File fileOut = new File(filePath);
-    if (fileOut.existsSync()) {
-      fileOut.deleteSync();
-    }
-  } else {
-    _createIfNeeded(path.dirname(filePath));
-    _fileSystem.writeString(filePath, contents);
-  }
-}
-
-void _createIfNeeded(String outdir) {
-  if (outdir.isEmpty) return;
-  var outDirectory = new Directory(outdir);
-  if (!outDirectory.existsSync()) {
-    _createIfNeeded(path.dirname(outdir));
-    outDirectory.createSync();
-  }
-}
-
-/**
- * Creates a symlink to the pub packages directory in the output location. The
- * returned future completes when the symlink was created (or immediately if it
- * already exists).
- */
-Future _symlinkPubPackages(CompilerResult result, CompilerOptions options,
-    Messages messages) {
-  if (options.outputDir == null || result.bootstrapFile == null
-      || options.packageRoot != null) {
-    // We don't need to copy the packages directory if the output was generated
-    // in-place where the input lives, if the compiler was called without an
-    // entry-point file, or if the compiler was called with a package-root
-    // option.
-    return new Future.value(null);
-  }
-
-  var linkDir = path.dirname(result.bootstrapFile);
-  _createIfNeeded(linkDir);
-  var linkPath = path.join(linkDir, 'packages');
-  // A resolved symlink works like a directory
-  // TODO(sigmund): replace this with something smarter once we have good
-  // symlink support in dart:io
-  if (new Directory(linkPath).existsSync()) {
-    // Packages directory already exists.
-    return new Future.value(null);
-  }
-
-  // A broken symlink works like a file
-  var toFile = new File(linkPath);
-  if (toFile.existsSync()) {
-    toFile.deleteSync();
-  }
-
-  var targetPath = path.join(path.dirname(options.inputFile), 'packages');
-  // [fullPathSync] will canonicalize the path, resolving any symlinks.
-  // TODO(sigmund): once it's possible in dart:io, we just want to use a full
-  // path, but not necessarily resolve symlinks.
-  var target = new File(targetPath).fullPathSync().toString();
-  return createSymlink(target, linkPath, messages: messages);
-}
-
-
-// TODO(jmesserly): this code was taken from Pub's io library.
-// Added error handling and don't return the file result, to match the code
-// we had previously. Also "target" and "link" only accept strings. And inlined
-// the relevant parts of runProcess. Note that it uses "cmd" to get the path
-// on Windows.
-/**
- * Creates a new symlink that creates an alias of [target] at [link], both of
- * which can be a [String], [File], or [Directory]. Returns a [Future] which
- * completes to the symlink file (i.e. [link]).
- */
-Future createSymlink(String target, String link, {Messages messages: null}) {
-  messages = messages == null? new Messages.silent() : messages;
-  var command = 'ln';
-  var args = ['-s', target, link];
-
-  if (Platform.operatingSystem == 'windows') {
-    // Call mklink on Windows to create an NTFS junction point. Only works on
-    // Vista or later. (Junction points are available earlier, but the "mklink"
-    // command is not.) I'm using a junction point (/j) here instead of a soft
-    // link (/d) because the latter requires some privilege shenanigans that
-    // I'm not sure how to specify from the command line.
-    command = 'cmd';
-    args = ['/c', 'mklink', '/j', link, target];
-  }
-
-  return Process.run(command, args).then((result) {
-    if (result.exitCode != 0) {
-      var details = 'subprocess stdout:\n${result.stdout}\n'
-                    'subprocess stderr:\n${result.stderr}';
-      messages.error(
-        'unable to create symlink\n target: $target\n link:$link\n$details',
-        null);
-    }
-    return null;
-  });
-}
diff --git a/pkg/polymer/lib/polymer.dart b/pkg/polymer/lib/polymer.dart
index 575619b..2e4dd0e 100644
--- a/pkg/polymer/lib/polymer.dart
+++ b/pkg/polymer/lib/polymer.dart
@@ -21,12 +21,10 @@
 
 export 'package:custom_element/custom_element.dart';
 export 'package:observe/observe.dart';
+export 'package:observe/html.dart';
 export 'package:observe/src/microtask.dart';
 
-export 'observe.dart';
-export 'observe_html.dart';
 export 'polymer_element.dart';
-export 'safe_html.dart';
 
 
 /** Annotation used to automatically register polymer elements. */
diff --git a/pkg/polymer/lib/safe_html.dart b/pkg/polymer/lib/safe_html.dart
deleted file mode 100644
index c15dd5c..0000000
--- a/pkg/polymer/lib/safe_html.dart
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// TODO(sigmund): move this library to a shared package? or make part of
-// dart:html?
-library polymer.safe_html;
-
-/** Declares a string that is a well-formed HTML fragment. */
-class SafeHtml {
-
-  /** Underlying html string. */
-  final String _html;
-
-  // TODO(sigmund): provide a constructor that does html validation
-  SafeHtml.unsafe(this._html);
-
-  String toString() => _html;
-
-  operator ==(other) => other is SafeHtml && _html == other._html;
-  int get hashCode => _html.hashCode;
-}
-
-/**
- * Declares a string that is safe to use in a Uri attribute, such as `<a href=`,
- * to avoid cross-site scripting (XSS) attacks.
- */
-class SafeUri {
-  final String _uri;
-
-  // TODO(sigmund): provide a constructor that takes or creates a Uri and
-  // validates that it is safe (not a javascript: scheme, for example)
-  SafeUri.unsafe(this._uri);
-
-  String toString() => _uri;
-
-  operator ==(other) => other is SafeUri && _uri == other._uri;
-  int get hashCode => _uri.hashCode;
-}
diff --git a/pkg/polymer/lib/src/analyzer.dart b/pkg/polymer/lib/src/analyzer.dart
index 193e139..b8011a0 100644
--- a/pkg/polymer/lib/src/analyzer.dart
+++ b/pkg/polymer/lib/src/analyzer.dart
@@ -10,14 +10,11 @@
 
 import 'package:html5lib/dom.dart';
 import 'package:html5lib/dom_parsing.dart';
-import 'package:source_maps/span.dart' hide SourceFile;
 
 import 'custom_tag_name.dart';
-import 'dart_parser.dart' show parseDartCode;
 import 'files.dart';
 import 'info.dart';
 import 'messages.dart';
-import 'summary.dart';
 
 /**
  * Finds custom elements in this file and the list of referenced files with
@@ -27,9 +24,8 @@
  * supplied.
  */
 FileInfo analyzeDefinitions(GlobalInfo global, UrlInfo inputUrl,
-    Document document, String packageRoot,
-    Messages messages, {bool isEntryPoint: false}) {
-  var result = new FileInfo(inputUrl, isEntryPoint);
+    Document document, String packageRoot, Messages messages) {
+  var result = new FileInfo(inputUrl);
   var loader = new _ElementLoader(global, result, packageRoot, messages);
   loader.visit(document);
   return result;
@@ -139,10 +135,6 @@
 
     _keepIndentationSpaces = keepSpaces;
     _currentInfo = lastInfo;
-
-    if (node.tagName == 'body' || node.parent == null) {
-      _fileInfo.body = node;
-    }
   }
 
   void _analyzeComponent(ComponentInfo component) {
@@ -154,10 +146,6 @@
           'custom element with tag name ${component.extendsTag} not found.',
           component.element.sourceSpan);
     }
-
-    // Now that the component's code has been loaded, we can validate that the
-    // class exists.
-    component.findClassDeclaration(_messages);
   }
 
   void _bindCustomElement(Element node) {
@@ -182,10 +170,6 @@
     }
 
     if (component != null) {
-      if (!component.hasConflict) {
-        _currentInfo.usedComponents[component] = true;
-      }
-
       var baseTag = component.baseExtendsTag;
       var nodeTag = node.tagName;
       var hasIsAttribute = node.attributes.containsKey('is');
@@ -271,15 +255,10 @@
    *   * we scan all [info.componentLinks] and import their
    *     [info.declaredComponents], using [files] to map the href to the file
    *     info. Names in [info] will shadow names from imported files.
-   *   * we fill [LibraryInfo.externalCode] on each component declared in
-   *     [info].
    */
   void _normalize(FileInfo info, Map<String, FileInfo> files) {
-    _attachExtenalScript(info, files);
-
     for (var component in info.declaredComponents) {
       _addComponent(info, component);
-      _attachExtenalScript(component, files);
     }
 
     for (var link in info.componentLinks) {
@@ -290,20 +269,8 @@
     }
   }
 
-  /**
-   * Stores a direct reference in [info] to a dart source file that was loaded
-   * in a script tag with the 'src' attribute.
-   */
-  void _attachExtenalScript(LibraryInfo info, Map<String, FileInfo> files) {
-    var externalFile = info.externalFile;
-    if (externalFile != null) {
-      info.externalCode = files[externalFile.resolvedPath];
-      if (info.externalCode != null) info.externalCode.htmlFile = info;
-    }
-  }
-
   /** Adds a component's tag name to the names in scope for [fileInfo]. */
-  void _addComponent(FileInfo fileInfo, ComponentSummary component) {
+  void _addComponent(FileInfo fileInfo, ComponentInfo component) {
     var existing = fileInfo.components[component.tagName];
     if (existing != null) {
       if (existing == component) {
@@ -439,7 +406,7 @@
       return;
     }
 
-    var component = new ComponentInfo(node, _fileInfo, tagName, extendsTag);
+    var component = new ComponentInfo(node, tagName, extendsTag);
     _fileInfo.declaredComponents.add(component);
     _addComponent(component);
 
@@ -496,20 +463,7 @@
       return;
     }
 
-    if (scriptType != 'application/dart') {
-      if (_currentInfo is ComponentInfo) {
-        // TODO(jmesserly): this warning should not be here, but our compiler
-        // does the wrong thing and it could cause surprising behavior, so let
-        // the user know! See issue #340 for more info.
-        // What we should be doing: leave JS component untouched by compiler.
-        _messages.warning('our custom element implementation does not support '
-            'JavaScript components yet. If this is affecting you please let us '
-            'know at https://github.com/dart-lang/web-ui/issues/340.',
-            node.sourceSpan);
-      }
-
-      return;
-    }
+    if (scriptType != 'application/dart') return;
 
     if (src != null) {
       if (!src.endsWith('.dart')) {
@@ -522,45 +476,6 @@
         _messages.error('script tag has "src" attribute and also has script '
             'text.', node.sourceSpan);
       }
-
-      if (_currentInfo.codeAttached) {
-        _tooManyScriptsError(node);
-      } else {
-        _currentInfo.externalFile = UrlInfo.resolve(src, _fileInfo.inputUrl,
-            node.sourceSpan, _packageRoot, _messages);
-      }
-      return;
     }
-
-    if (node.nodes.length == 0) return;
-
-    // I don't think the html5 parser will emit a tree with more than
-    // one child of <script>
-    assert(node.nodes.length == 1);
-    Text text = node.nodes[0];
-
-    if (_currentInfo.codeAttached) {
-      _tooManyScriptsError(node);
-    } else if (_currentInfo == _fileInfo && !_fileInfo.isEntryPoint) {
-      _messages.warning('top-level dart code is ignored on '
-          ' HTML pages that define components, but are not the entry HTML '
-          'file.', node.sourceSpan);
-    } else {
-      _currentInfo.inlinedCode = parseDartCode(
-          _currentInfo.dartCodeUrl.resolvedPath, text.value,
-          text.sourceSpan.start);
-      if (_currentInfo.userCode.partOf != null) {
-        _messages.error('expected a library, not a part.',
-            node.sourceSpan);
-      }
-    }
-  }
-
-  void _tooManyScriptsError(Node node) {
-    var location = _currentInfo is ComponentInfo ?
-        'a custom element declaration' : 'the top-level HTML page';
-
-    _messages.error('there should be only one dart script tag in $location.',
-        node.sourceSpan);
   }
 }
diff --git a/pkg/polymer/lib/src/compiler.dart b/pkg/polymer/lib/src/compiler.dart
index 5e2c98f..9d5d10d 100644
--- a/pkg/polymer/lib/src/compiler.dart
+++ b/pkg/polymer/lib/src/compiler.dart
@@ -6,30 +6,21 @@
 
 import 'dart:async';
 import 'dart:collection' show SplayTreeMap;
-import 'dart:json' as json;
 
-import 'package:analyzer_experimental/src/generated/ast.dart' show Directive, UriBasedDirective;
 import 'package:csslib/visitor.dart' show StyleSheet, treeToDebugString;
 import 'package:html5lib/dom.dart';
 import 'package:html5lib/parser.dart';
-import 'package:observe/transform.dart' show transformObservables;
-import 'package:source_maps/span.dart' show Span;
-import 'package:source_maps/refactor.dart' show TextEditTransaction;
-import 'package:source_maps/printer.dart';
 
 import 'analyzer.dart';
 import 'css_analyzer.dart' show analyzeCss, findUrlsImported,
        findImportsInStyleSheet, parseCss;
 import 'css_emitters.dart' show rewriteCssUris,
        emitComponentStyleSheet, emitOriginalCss, emitStyleSheet;
-import 'dart_parser.dart';
-import 'emitters.dart';
 import 'file_system.dart';
 import 'files.dart';
 import 'info.dart';
 import 'messages.dart';
 import 'compiler_options.dart';
-import 'paths.dart';
 import 'utils.dart';
 
 /**
@@ -39,7 +30,8 @@
  *
  * Adds emitted error/warning to [messages], if [messages] is supplied.
  */
-Document parseHtml(contents, String sourcePath, Messages messages) {
+Document parseHtml(contents, String sourcePath, Messages messages,
+    bool checkDocType) {
   var parser = new HtmlParser(contents, generateSpans: true,
       sourceUrl: sourcePath);
   var document = parser.parse();
@@ -47,7 +39,9 @@
   // Note: errors aren't fatal in HTML (unless strict mode is on).
   // So just print them as warnings.
   for (var e in parser.errors) {
-    messages.warning(e.message, e.span);
+    if (checkDocType || e.errorCode != 'expected-doctype-but-got-start-tag') {
+      messages.warning(e.message, e.span);
+    }
   }
   return document;
 }
@@ -57,12 +51,11 @@
   final FileSystem fileSystem;
   final CompilerOptions options;
   final List<SourceFile> files = <SourceFile>[];
-  final List<OutputFile> output = <OutputFile>[];
 
   String _mainPath;
+  String _packageRoot;
   String _resetCssFile;
   StyleSheet _cssResetStyleSheet;
-  PathMapper _pathMapper;
   Messages _messages;
 
   FutureGroup _tasks;
@@ -70,7 +63,6 @@
 
   /** Information about source [files] given their href. */
   final Map<String, FileInfo> info = new SplayTreeMap<String, FileInfo>();
-  final _edits = new Map<DartCodeInfo, TextEditTransaction>();
 
   final GlobalInfo global = new GlobalInfo();
 
@@ -79,8 +71,7 @@
     _mainPath = options.inputFile;
     var mainDir = path.dirname(_mainPath);
     var baseDir = options.baseDir != null ? options.baseDir : mainDir;
-    var outputDir = options.outputDir != null ? options.outputDir : mainDir;
-    var packageRoot = options.packageRoot != null ? options.packageRoot
+    _packageRoot = options.packageRoot != null ? options.packageRoot
         : path.join(path.dirname(_mainPath), 'packages');
 
     if (options.resetCssFile != null) {
@@ -92,18 +83,14 @@
     }
 
     // Normalize paths - all should be relative or absolute paths.
-    if (path.isAbsolute(_mainPath) || path.isAbsolute(baseDir) ||
-        path.isAbsolute(outputDir) || path.isAbsolute(packageRoot)) {
+    if (path.isAbsolute(_mainPath) || path.isAbsolute(baseDir)
+        || path.isAbsolute(_packageRoot)) {
       if (path.isRelative(_mainPath)) _mainPath = path.resolve(_mainPath);
       if (path.isRelative(baseDir)) baseDir = path.resolve(baseDir);
-      if (path.isRelative(outputDir)) outputDir = path.resolve(outputDir);
-      if (path.isRelative(packageRoot)) {
-        packageRoot = path.resolve(packageRoot);
+      if (path.isRelative(_packageRoot)) {
+        _packageRoot = path.resolve(_packageRoot);
       }
     }
-    _pathMapper = new PathMapper(
-        baseDir, outputDir, packageRoot, options.forceMangle,
-        options.rewriteUrls);
   }
 
   /** Compile the application starting from the given input file. */
@@ -118,15 +105,9 @@
 
       // Analyze all CSS files.
       _time('Analyzed Style Sheets', '', () =>
-          analyzeCss(_pathMapper.packageRoot, files, info,
+          analyzeCss(_packageRoot, files, info,
               global.pseudoElements, _messages,
               warningsAsErrors: options.warningsAsErrors));
-
-      // TODO(jmesserly): need to go through our errors, and figure out if some
-      // of them should be warnings instead.
-      if (_messages.hasErrors || options.analysisOnly) return;
-      _transformDart();
-      _emit();
     });
   }
 
@@ -139,7 +120,7 @@
     _tasks = new FutureGroup();
     _processed = new Set();
     _processed.add(inputFile);
-    _tasks.add(_parseHtmlFile(new UrlInfo(inputFile, inputFile, null)));
+    _tasks.add(_parseHtmlFile(new UrlInfo(inputFile, inputFile, null), true));
     return _tasks.future;
   }
 
@@ -151,8 +132,8 @@
     files.add(file);
 
     var fileInfo = _time('Analyzed definitions', inputUrl.url, () {
-      return analyzeDefinitions(global, inputUrl, file.document,
-        _pathMapper.packageRoot, _messages, isEntryPoint: isEntryPoint);
+      return analyzeDefinitions(global, inputUrl, file.document, _packageRoot,
+        _messages);
     });
     info[inputUrl.resolvedPath] = fileInfo;
 
@@ -162,9 +143,6 @@
           null)));
     }
 
-    _setOutputFilenames(fileInfo);
-    _processImports(fileInfo);
-
     // Load component files referenced by [file].
     for (var link in fileInfo.componentLinks) {
       _loadFile(link, _parseHtmlFile);
@@ -175,28 +153,18 @@
       _loadFile(link, _parseCssFile);
     }
 
-    // Load .dart files being referenced in the page.
-    _loadFile(fileInfo.externalFile, _parseDartFile);
-
     // Process any @imports inside of a <style> tag.
-    var urlInfos = findUrlsImported(fileInfo, fileInfo.inputUrl,
-        _pathMapper.packageRoot, file.document, _messages, options);
+    var urlInfos = findUrlsImported(fileInfo, fileInfo.inputUrl, _packageRoot,
+        file.document, _messages, options);
     for (var urlInfo in urlInfos) {
       _loadFile(urlInfo, _parseCssFile);
     }
 
     // Load .dart files being referenced in components.
     for (var component in fileInfo.declaredComponents) {
-      if (component.externalFile != null) {
-        _loadFile(component.externalFile, _parseDartFile);
-      } else if (component.userCode != null) {
-        _processImports(component);
-      }
-
       // Process any @imports inside of the <style> tag in a component.
-      var urlInfos = findUrlsImported(component,
-          component.declaringFile.inputUrl, _pathMapper.packageRoot,
-          component.element, _messages, options);
+      var urlInfos = findUrlsImported(component, fileInfo.inputUrl,
+          _packageRoot, component.element, _messages, options);
       for (var urlInfo in urlInfos) {
         _loadFile(urlInfo, _parseCssFile);
       }
@@ -216,36 +184,8 @@
     }
   }
 
-  void _setOutputFilenames(FileInfo fileInfo) {
-    var filePath = fileInfo.dartCodeUrl.resolvedPath;
-    fileInfo.outputFilename = _pathMapper.mangle(path.basename(filePath),
-        '.dart', path.extension(filePath) == '.html');
-    for (var component in fileInfo.declaredComponents) {
-      var externalFile = component.externalFile;
-      var name = null;
-      if (externalFile != null) {
-        name = _pathMapper.mangle(
-            path.basename(externalFile.resolvedPath), '.dart');
-      } else {
-        var declaringFile = component.declaringFile;
-        var prefix = path.basename(declaringFile.inputUrl.resolvedPath);
-        if (declaringFile.declaredComponents.length == 1
-            && !declaringFile.codeAttached && !declaringFile.isEntryPoint) {
-          name = _pathMapper.mangle(prefix, '.dart', true);
-        } else {
-          var componentName = component.tagName.replaceAll('-', '_');
-          name = _pathMapper.mangle('${prefix}_$componentName', '.dart', true);
-        }
-      }
-      component.outputFilename = name;
-    }
-  }
-
   /** Parse an HTML file. */
-  Future _parseHtmlFile(UrlInfo inputUrl) {
-    if (!_pathMapper.checkInputPath(inputUrl, _messages)) {
-      return new Future<SourceFile>.value(null);
-    }
+  Future _parseHtmlFile(UrlInfo inputUrl, [bool checkDocType = false]) {
     var filePath = inputUrl.resolvedPath;
     return fileSystem.readTextOrBytes(filePath)
         .catchError((e) => _readError(e, inputUrl))
@@ -253,31 +193,14 @@
           if (source == null) return;
           var file = new SourceFile(filePath);
           file.document = _time('Parsed', filePath,
-              () => parseHtml(source, filePath, _messages));
+              () => parseHtml(source, filePath, _messages, checkDocType));
           _processHtmlFile(inputUrl, file);
         });
   }
 
-  /** Parse a Dart file. */
-  Future _parseDartFile(UrlInfo inputUrl) {
-    if (!_pathMapper.checkInputPath(inputUrl, _messages)) {
-      return new Future<SourceFile>.value(null);
-    }
-    var filePath = inputUrl.resolvedPath;
-    return fileSystem.readText(filePath)
-        .catchError((e) => _readError(e, inputUrl))
-        .then((code) {
-          if (code == null) return;
-          var file = new SourceFile(filePath, type: SourceFile.DART);
-          file.code = code;
-          _processDartFile(inputUrl, file);
-        });
-  }
-
   /** Parse a stylesheet file. */
   Future _parseCssFile(UrlInfo inputUrl) {
-    if (!options.emulateScopedCss ||
-        !_pathMapper.checkInputPath(inputUrl, _messages)) {
+    if (!options.emulateScopedCss) {
       return new Future<SourceFile>.value(null);
     }
     var filePath = inputUrl.resolvedPath;
@@ -305,29 +228,6 @@
     return null;
   }
 
-  void _processDartFile(UrlInfo inputUrl, SourceFile dartFile) {
-    if (dartFile == null) return;
-
-    files.add(dartFile);
-
-    var resolvedPath = inputUrl.resolvedPath;
-    var fileInfo = new FileInfo(inputUrl);
-    info[resolvedPath] = fileInfo;
-    fileInfo.inlinedCode = parseDartCode(resolvedPath, dartFile.code);
-    fileInfo.outputFilename =
-        _pathMapper.mangle(path.basename(resolvedPath), '.dart', false);
-
-    _processImports(fileInfo);
-  }
-
-  void _processImports(LibraryInfo library) {
-    if (library.userCode == null) return;
-
-    for (var directive in library.userCode.directives) {
-      _loadFile(_getDirectiveUrlInfo(library, directive), _parseDartFile);
-    }
-  }
-
   void _processCssFile(UrlInfo inputUrl, SourceFile cssFile) {
     if (cssFile == null) return;
 
@@ -349,8 +249,7 @@
   void _resolveStyleSheetImports(UrlInfo inputUrl, String processingFile,
       StyleSheet styleSheet) {
     var urlInfos = _time('CSS imports', processingFile, () =>
-        findImportsInStyleSheet(styleSheet, _pathMapper.packageRoot, inputUrl,
-            _messages));
+        findImportsInStyleSheet(styleSheet, _packageRoot, inputUrl, _messages));
 
     for (var urlInfo in urlInfos) {
       if (urlInfo == null) break;
@@ -359,187 +258,6 @@
     }
   }
 
-  String _directiveUri(Directive directive) {
-    var uriDirective = (directive as UriBasedDirective).uri;
-    return (uriDirective as dynamic).value;
-  }
-
-  UrlInfo _getDirectiveUrlInfo(LibraryInfo library, Directive directive) {
-    var uri = _directiveUri(directive);
-    if (uri.startsWith('dart:')) return null;
-    if (uri.startsWith('package:') && uri.startsWith('package:polymer/')) {
-      // Don't process our own package -- we'll implement @observable manually.
-      return null;
-    }
-
-    var span = library.userCode.sourceFile.span(
-        directive.offset, directive.end);
-    return UrlInfo.resolve(uri, library.dartCodeUrl, span,
-        _pathMapper.packageRoot, _messages);
-  }
-
-  /**
-   * Transform Dart source code.
-   * Currently, the only transformation is [transformObservables].
-   * Calls _emitModifiedDartFiles to write the transformed files.
-   */
-  void _transformDart() {
-    var libraries = _findAllDartLibraries();
-
-    var transformed = [];
-    for (var lib in libraries) {
-      var userCode = lib.userCode;
-      var transaction = transformObservables(userCode.compilationUnit,
-          userCode.sourceFile, userCode.code, _messages);
-      if (transaction != null) {
-        _edits[lib.userCode] = transaction;
-        if (transaction.hasEdits) {
-          transformed.add(lib);
-        } else if (lib.htmlFile != null) {
-          // All web components will be transformed too. Track that.
-          transformed.add(lib);
-        }
-      }
-    }
-
-    _findModifiedDartFiles(libraries, transformed);
-
-    libraries.forEach(_fixImports);
-
-    _emitModifiedDartFiles(libraries);
-  }
-
-  /**
-   * Finds all Dart code libraries.
-   * Each library will have [LibraryInfo.inlinedCode] that is non-null.
-   * Also each inlinedCode will be unique.
-   */
-  List<LibraryInfo> _findAllDartLibraries() {
-    var libs = <LibraryInfo>[];
-    void _addLibrary(LibraryInfo lib) {
-      if (lib.inlinedCode != null) libs.add(lib);
-    }
-
-    for (var sourceFile in files) {
-      var file = info[sourceFile.path];
-      _addLibrary(file);
-      file.declaredComponents.forEach(_addLibrary);
-    }
-
-    // Assert that each file path is unique.
-    assert(_uniquePaths(libs));
-    return libs;
-  }
-
-  bool _uniquePaths(List<LibraryInfo> libs) {
-    var seen = new Set();
-    for (var lib in libs) {
-      if (seen.contains(lib.inlinedCode)) {
-        throw new StateError('internal error: '
-            'duplicate user code for ${lib.dartCodeUrl.resolvedPath}.'
-            ' Files were: $files');
-      }
-      seen.add(lib.inlinedCode);
-    }
-    return true;
-  }
-
-  /**
-   * Queue modified Dart files to be written.
-   * This will not write files that are handled by [WebComponentEmitter] and
-   * [EntryPointEmitter].
-   */
-  void _emitModifiedDartFiles(List<LibraryInfo> libraries) {
-    for (var lib in libraries) {
-      // Components will get emitted by WebComponentEmitter, and the
-      // entry point will get emitted by MainPageEmitter.
-      // So we only need to worry about other .dart files.
-      if (lib.modified && lib is FileInfo &&
-          lib.htmlFile == null && !lib.isEntryPoint) {
-        var transaction = _edits[lib.userCode];
-
-        // Save imports that were modified by _fixImports.
-        for (var d in lib.userCode.directives) {
-          transaction.edit(d.offset, d.end, d.toString());
-        }
-
-        if (!lib.userCode.isPart) {
-          var pos = lib.userCode.firstPartOffset;
-          // Note: we use a different prefix than "autogenerated" to make
-          // ChangeRecord unambiguous. Otherwise it would be imported by this
-          // and polymer, resulting in a collision.
-          // TODO(jmesserly): only generate this for libraries that need it.
-          transaction.edit(pos, pos, "\nimport "
-              "'package:observe/observe.dart' as __observe;\n");
-        }
-        _emitFileAndSourceMaps(lib, transaction.commit(), lib.dartCodeUrl);
-      }
-    }
-  }
-
-  /**
-   * This method computes which Dart files have been modified, starting
-   * from [transformed] and marking recursively through all files that import
-   * the modified files.
-   */
-  void _findModifiedDartFiles(List<LibraryInfo> libraries,
-      List<FileInfo> transformed) {
-
-    if (transformed.length == 0) return;
-
-    // Compute files that reference each file, then use this information to
-    // flip the modified bit transitively. This is a lot simpler than trying
-    // to compute it the other way because of circular references.
-    for (var lib in libraries) {
-      for (var directive in lib.userCode.directives) {
-        var importPath = _getDirectiveUrlInfo(lib, directive);
-        if (importPath == null) continue;
-
-        var importInfo = info[importPath.resolvedPath];
-        if (importInfo != null) {
-          importInfo.referencedBy.add(lib);
-        }
-      }
-    }
-
-    // Propegate the modified bit to anything that references a modified file.
-    void setModified(LibraryInfo library) {
-      if (library.modified) return;
-      library.modified = true;
-      library.referencedBy.forEach(setModified);
-    }
-    transformed.forEach(setModified);
-
-    for (var lib in libraries) {
-      // We don't need this anymore, so free it.
-      lib.referencedBy = null;
-    }
-  }
-
-  void _fixImports(LibraryInfo library) {
-    // Fix imports. Modified files must use the generated path, otherwise
-    // we need to make the path relative to the input.
-    for (var directive in library.userCode.directives) {
-      var importPath = _getDirectiveUrlInfo(library, directive);
-      if (importPath == null) continue;
-      var importInfo = info[importPath.resolvedPath];
-      if (importInfo == null) continue;
-
-      String newUri = null;
-      if (importInfo.modified) {
-        // Use the generated URI for this file.
-        newUri = _pathMapper.importUrlFor(library, importInfo);
-      } else if (options.rewriteUrls) {
-        // Get the relative path to the input file.
-        newUri = _pathMapper.transformUrl(
-            library.dartCodeUrl.resolvedPath, directive.uri.value);
-      }
-      if (newUri != null) {
-        directive.uri = createStringLiteral(newUri);
-      }
-    }
-  }
-
   /** Run the analyzer on every input html file. */
   void _analyze() {
     var uniqueIds = new IntIterator();
@@ -552,75 +270,6 @@
     }
   }
 
-  /** Emit the generated code corresponding to each input file. */
-  void _emit() {
-    for (var file in files) {
-      if (file.isDart || file.isStyleSheet) continue;
-      _time('Codegen', file.path, () {
-        var fileInfo = info[file.path];
-        _emitComponents(fileInfo);
-      });
-    }
-
-    var entryPoint = files[0];
-    assert(info[entryPoint.path].isEntryPoint);
-    _emitMainDart(entryPoint);
-    _emitMainHtml(entryPoint);
-
-    assert(_unqiueOutputs());
-  }
-
-  bool _unqiueOutputs() {
-    var seen = new Set();
-    for (var file in output) {
-      if (seen.contains(file.path)) {
-        throw new StateError('internal error: '
-            'duplicate output file ${file.path}. Files were: $output');
-      }
-      seen.add(file.path);
-    }
-    return true;
-  }
-
-  /** Emit the main .dart file. */
-  void _emitMainDart(SourceFile file) {
-    var fileInfo = info[file.path];
-
-    var codeInfo = fileInfo.userCode;
-    if (codeInfo != null) {
-      var printer = new NestedPrinter(0);
-      if (codeInfo.libraryName == null) {
-        printer.addLine('library ${fileInfo.libraryName};');
-      }
-      printer.add(codeInfo.code);
-      _emitFileAndSourceMaps(fileInfo, printer, fileInfo.dartCodeUrl);
-    }
-  }
-
-  // TODO(jmesserly): refactor this out of Compiler.
-  /** Generate an html file with the (trimmed down) main html page. */
-  void _emitMainHtml(SourceFile file) {
-    var fileInfo = info[file.path];
-
-    var bootstrapName = '${path.basename(file.path)}_bootstrap.dart';
-    var bootstrapPath = path.join(path.dirname(file.path), bootstrapName);
-    var bootstrapOutPath = _pathMapper.outputPath(bootstrapPath, '');
-    var bootstrapOutName = path.basename(bootstrapOutPath);
-    var bootstrapInfo = new FileInfo(new UrlInfo('', bootstrapPath, null));
-    var printer = generateBootstrapCode(bootstrapInfo, fileInfo, global,
-        _pathMapper, options);
-    printer.build(bootstrapOutPath);
-    output.add(new OutputFile(
-          bootstrapOutPath, printer.text, source: file.path));
-
-    var document = file.document;
-    var hasCss = _emitAllCss();
-    transformMainHtml(document, fileInfo, _pathMapper, hasCss,
-        options.rewriteUrls, _messages, global, bootstrapOutName);
-    output.add(new OutputFile(_pathMapper.outputPath(file.path, '.html'),
-        document.outerHtml, source: file.path));
-  }
-
   // TODO(jmesserly): refactor this and other CSS related transforms out of
   // Compiler.
   /**
@@ -638,22 +287,12 @@
       var fileInfo = info[file.path];
       if (file.isStyleSheet) {
         for (var styleSheet in fileInfo.styleSheets) {
-          // Translate any URIs in CSS.
-          rewriteCssUris(_pathMapper, fileInfo.inputUrl.resolvedPath,
-              options.rewriteUrls, styleSheet);
           css.write(
               '/* Auto-generated from style sheet href = ${file.path} */\n'
               '/* DO NOT EDIT. */\n\n');
           css.write(emitStyleSheet(styleSheet, fileInfo));
           css.write('\n\n');
         }
-
-        // Emit the linked style sheet in the output directory.
-        if (fileInfo.inputUrl.url != _resetCssFile) {
-          var outCss = _pathMapper.outputPath(fileInfo.inputUrl.resolvedPath,
-              '');
-          output.add(new OutputFile(outCss, css.toString()));
-        }
       }
     }
 
@@ -664,9 +303,6 @@
         for (var component in fileInfo.declaredComponents) {
           for (var styleSheet in component.styleSheets) {
             // Translate any URIs in CSS.
-            rewriteCssUris(_pathMapper, fileInfo.inputUrl.resolvedPath,
-                options.rewriteUrls, styleSheet);
-
             if (buff.isEmpty) {
               buff.write(
                   '/* Auto-generated from components style tags. */\n'
@@ -706,55 +342,9 @@
     }
 
     if (buff.isEmpty) return false;
-
-    var cssPath = _pathMapper.outputPath(_mainPath, '.css', true);
-    output.add(new OutputFile(cssPath, buff.toString()));
     return true;
   }
 
-  /** Emits the Dart code for all components in [fileInfo]. */
-  void _emitComponents(FileInfo fileInfo) {
-    for (var component in fileInfo.declaredComponents) {
-      // TODO(terry): Handle more than one stylesheet per component
-      if (component.styleSheets.length > 1 && options.emulateScopedCss) {
-        var span = component.externalFile != null
-            ? component.externalFile.sourceSpan : null;
-        _messages.warning(
-            'Component has more than one stylesheet - first stylesheet used.',
-            span);
-      }
-      var printer = emitPolymerElement(
-          component, _pathMapper, _edits[component.userCode], options);
-      _emitFileAndSourceMaps(component, printer, component.externalFile);
-    }
-  }
-
-  /**
-   * Emits a file that was created using [NestedPrinter] and it's corresponding
-   * source map file.
-   */
-  void _emitFileAndSourceMaps(
-      LibraryInfo lib, NestedPrinter printer, UrlInfo dartCodeUrl) {
-    // Bail if we had an error generating the code for the file.
-    if (printer == null) return;
-
-    var libPath = _pathMapper.outputLibraryPath(lib);
-    var dir = path.dirname(libPath);
-    var filename = path.basename(libPath);
-    printer.add('\n//# sourceMappingURL=$filename.map');
-    printer.build(libPath);
-    var sourcePath = dartCodeUrl != null ? dartCodeUrl.resolvedPath : null;
-    output.add(new OutputFile(libPath, printer.text, source: sourcePath));
-    // Fix-up the paths in the source map file
-    var sourceMap = json.parse(printer.map);
-    var urls = sourceMap['sources'];
-    for (int i = 0; i < urls.length; i++) {
-      urls[i] = path.relative(urls[i], from: dir);
-    }
-    output.add(new OutputFile(path.join(dir, '$filename.map'),
-          json.stringify(sourceMap)));
-  }
-
   _time(String logMessage, String filePath, callback(),
       {bool printTime: false}) {
     var message = new StringBuffer();
diff --git a/pkg/polymer/lib/src/compiler_options.dart b/pkg/polymer/lib/src/compiler_options.dart
index 4c1d317..2d446ef 100644
--- a/pkg/polymer/lib/src/compiler_options.dart
+++ b/pkg/polymer/lib/src/compiler_options.dart
@@ -56,9 +56,6 @@
   /** Use CSS file for CSS Reset. */
   final String resetCssFile;
 
-  /** Whether to analyze the input for warnings without generating any code. */
-  final bool analysisOnly;
-
   // We could make this faster, if it ever matters.
   factory CompilerOptions() => parse(['']);
 
@@ -76,7 +73,6 @@
       componentsOnly = args['components_only'],
       emulateScopedCss = args['scoped-css'],
       resetCssFile = args['css-reset'],
-      analysisOnly = !args['deploy'],
       inputFile = args.rest.length > 0 ? args.rest[0] : null;
 
   /**
@@ -116,8 +112,8 @@
       ..addFlag('scoped-css', help: 'Emulate scoped styles with CSS polyfill',
           defaultsTo: false)
       ..addOption('css-reset', abbr: 'r', help: 'CSS file used to reset CSS')
-      ..addFlag('deploy', help: 'Emit code used for deploying a polymer app,'
-          ' if false just show warnings and errors (default)',
+      // TODO(sigmund): remove this flag 
+      ..addFlag('deploy', help: '(deprecated) currently a noop',
           defaultsTo: false, negatable: false)
       ..addOption('out', abbr: 'o', help: 'Directory where to generate files'
           ' (defaults to the same directory as the source file)')
diff --git a/pkg/polymer/lib/src/css_analyzer.dart b/pkg/polymer/lib/src/css_analyzer.dart
index 270af5d..0b96825 100644
--- a/pkg/polymer/lib/src/css_analyzer.dart
+++ b/pkg/polymer/lib/src/css_analyzer.dart
@@ -48,7 +48,7 @@
   void process(SourceFile file) {
     var fileInfo = info[file.path];
     if (file.isStyleSheet || fileInfo.styleSheets.length > 0) {
-      var styleSheets = processVars(fileInfo);
+      var styleSheets = processVars(fileInfo.inputUrl, fileInfo);
 
       // Add to list of all style sheets analyzed.
       allStyleSheets.addAll(styleSheets);
@@ -56,7 +56,7 @@
 
     // Process any components.
     for (var component in fileInfo.declaredComponents) {
-      var all = processVars(component);
+      var all = processVars(fileInfo.inputUrl, component);
 
       // Add to list of all style sheets analyzed.
       allStyleSheets.addAll(all);
@@ -70,9 +70,9 @@
     for (var tree in allStyleSheets) new _RemoveVarDefinitions().visitTree(tree);
   }
 
-  List<StyleSheet> processVars(var libraryInfo) {
+  List<StyleSheet> processVars(inputUrl, libraryInfo) {
     // Get list of all stylesheet(s) dependencies referenced from this file.
-    var styleSheets = _dependencies(libraryInfo).toList();
+    var styleSheets = _dependencies(inputUrl, libraryInfo).toList();
 
     var errors = [];
     css.analyze(styleSheets, errors: errors, options:
@@ -118,14 +118,9 @@
    * return a list of all referenced stylesheet dependencies (@imports or <link
    * rel="stylesheet" ..>).
    */
-  Set<StyleSheet> _dependencies(var libraryInfo, {Set<StyleSheet> seen}) {
+  Set<StyleSheet> _dependencies(inputUrl, libraryInfo, {Set<StyleSheet> seen}) {
     if (seen == null) seen = new Set();
 
-    // Used to resolve all pathing information.
-    var inputUrl = libraryInfo is FileInfo
-        ? libraryInfo.inputUrl
-        : (libraryInfo as ComponentInfo).declaringFile.inputUrl;
-
     for (var styleSheet in libraryInfo.styleSheets) {
       if (!seen.contains(styleSheet)) {
         // TODO(terry): VM uses expandos to implement hashes.  Currently, it's a
@@ -152,7 +147,8 @@
               var urls = findImportsInStyleSheet(ss, packageRoot, inputUrl,
                   _messages);
               for (var url in urls) {
-                _dependencies(info[url.resolvedPath], seen: seen);
+                var fileInfo = info[url.resolvedPath];
+                _dependencies(fileInfo.inputUrl, fileInfo, seen: seen);
               }
             }
           }
diff --git a/pkg/polymer/lib/src/css_emitters.dart b/pkg/polymer/lib/src/css_emitters.dart
index d1863f5..a4d4b7d 100644
--- a/pkg/polymer/lib/src/css_emitters.dart
+++ b/pkg/polymer/lib/src/css_emitters.dart
@@ -8,41 +8,6 @@
        UriTerm, Selector, HostDirective, SimpleSelectorSequence, StyleSheet;
 
 import 'info.dart';
-import 'paths.dart' show PathMapper;
-import 'utils.dart';
-
-void rewriteCssUris(PathMapper pathMapper, String cssPath, bool rewriteUrls,
-    StyleSheet styleSheet) {
-  new _UriVisitor(pathMapper, cssPath, rewriteUrls).visitTree(styleSheet);
-}
-
-/** Compute each CSS URI resource relative from the generated CSS file. */
-class _UriVisitor extends Visitor {
-  /**
-   * Relative path from the output css file to the location of the original
-   * css file that contained the URI to each resource.
-   */
-  final String _pathToOriginalCss;
-
-  factory _UriVisitor(PathMapper pathMapper, String cssPath, bool rewriteUrl) {
-    var cssDir = path.dirname(cssPath);
-    var outCssDir = rewriteUrl ? pathMapper.outputDirPath(cssPath)
-        : path.dirname(cssPath);
-    return new _UriVisitor._internal(path.relative(cssDir, from: outCssDir));
-  }
-
-  _UriVisitor._internal(this._pathToOriginalCss);
-
-  void visitUriTerm(UriTerm node) {
-    // Don't touch URIs that have any scheme (http, etc.).
-    var uri = Uri.parse(node.text);
-    if (uri.host != '') return;
-    if (uri.scheme != '' && uri.scheme != 'package') return;
-
-    node.text = pathToUrl(
-        path.normalize(path.join(_pathToOriginalCss, node.text)));
-  }
-}
 
 
 /** Emit the contents of the style tag outside of a component. */
diff --git a/pkg/polymer/lib/src/dart_parser.dart b/pkg/polymer/lib/src/dart_parser.dart
deleted file mode 100644
index a2f44c3..0000000
--- a/pkg/polymer/lib/src/dart_parser.dart
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Parser for Dart code based on the experimental analyzer.
- */
-library dart_parser;
-
-import 'package:analyzer_experimental/src/generated/ast.dart';
-import 'package:analyzer_experimental/src/generated/error.dart';
-import 'package:analyzer_experimental/src/generated/parser.dart';
-import 'package:analyzer_experimental/src/generated/scanner.dart';
-import 'package:source_maps/span.dart' show SourceFile, SourceFileSegment, Location;
-import 'utils.dart' show escapeDartString;
-
-/** Information extracted from a source Dart file. */
-class DartCodeInfo {
-
-  /** Library qualified identifier, if any. */
-  final String libraryName;
-
-  /** Library which the code is part-of, if any. */
-  final String partOf;
-
-  /** Declared imports, exports, and parts. */
-  final List<Directive> directives;
-
-  /** Source file representation used to compute source map information. */
-  final SourceFile sourceFile;
-
-  /** The parsed code. */
-  final CompilationUnit compilationUnit;
-
-  /** The full source code. */
-  final String code;
-
-  DartCodeInfo(this.libraryName, this.partOf, this.directives, code,
-      this.sourceFile, [compilationUnit])
-      : this.code = code,
-        this.compilationUnit = compilationUnit == null
-          ? _parseCompilationUnit(code) : compilationUnit;
-
-  bool get isPart =>
-      compilationUnit.directives.any((d) => d is PartOfDirective);
-
-  int get directivesEnd {
-    if (compilationUnit.directives.length == 0) return 0;
-    return compilationUnit.directives.last.end;
-  }
-
-  /**
-   * The position of the first "part" directive. If none is found,
-   * this behaves like [directivesEnd].
-   */
-  int get firstPartOffset {
-    for (var directive in compilationUnit.directives) {
-      if (directive is PartDirective) return directive.offset;
-    }
-    // No part directives, just return directives end.
-    return directivesEnd;
-  }
-
-  /** Gets the code after the [directives]. */
-  String codeAfterDirectives() => code.substring(directivesEnd);
-
-  ClassDeclaration findClass(String name) {
-    for (var decl in compilationUnit.declarations) {
-      if (decl is ClassDeclaration) {
-        if (decl.name.name == name) return decl;
-      }
-    }
-    return null;
-  }
-}
-
-SimpleStringLiteral createStringLiteral(String contents) {
-  var lexeme = "'${escapeDartString(contents)}'";
-  var token = new StringToken(TokenType.STRING, lexeme, null);
-  return new SimpleStringLiteral.full(token, contents);
-}
-
-
-/**
- * Parse and extract top-level directives from [code].
- *
- */
-// TODO(sigmund): log emitted error/warning messages
-DartCodeInfo parseDartCode(String path, String code, [Location offset]) {
-  var unit = _parseCompilationUnit(code);
-
-  // Extract some information from the compilation unit.
-  String libraryName, partName;
-  var directives = [];
-  int directiveEnd = 0;
-  for (var directive in unit.directives) {
-    if (directive is LibraryDirective) {
-      libraryName = directive.name.name;
-    } else if (directive is PartOfDirective) {
-      partName = directive.libraryName.name;
-    } else {
-      assert(directive is UriBasedDirective);
-      // Normalize the library URI.
-      var uriNode = directive.uri;
-      if (uriNode is! SimpleStringLiteral) {
-        String uri = uriNode.accept(new ConstantEvaluator());
-        directive.uri = createStringLiteral(uri);
-      }
-      directives.add(directive);
-    }
-  }
-
-  var sourceFile = offset == null
-      ? new SourceFile.text(path, code)
-      : new SourceFileSegment(path, code, offset);
-
-  return new DartCodeInfo(libraryName, partName, directives, code,
-      sourceFile, unit);
-}
-
-CompilationUnit _parseCompilationUnit(String code) {
-  var errorListener = new _ErrorCollector();
-  var scanner = new StringScanner(null, code, errorListener);
-  var token = scanner.tokenize();
-  var parser = new Parser(null, errorListener);
-  return parser.parseCompilationUnit(token);
-}
-
-class _ErrorCollector extends AnalysisErrorListener {
-  final errors = new List<AnalysisError>();
-  onError(error) => errors.add(error);
-}
diff --git a/pkg/polymer/lib/src/emitters.dart b/pkg/polymer/lib/src/emitters.dart
deleted file mode 100644
index e611c59..0000000
--- a/pkg/polymer/lib/src/emitters.dart
+++ /dev/null
@@ -1,246 +0,0 @@
-// 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
-// BSD-style license that can be found in the LICENSE file.
-
-/** Collects several code emitters for the template tool. */
-library emitters;
-
-import 'package:html5lib/dom.dart';
-import 'package:html5lib/dom_parsing.dart' show TreeVisitor;
-import 'package:html5lib/parser.dart' show parseFragment;
-import 'package:source_maps/printer.dart';
-import 'package:source_maps/refactor.dart';
-
-import 'compiler_options.dart';
-import 'css_emitters.dart' show emitStyleSheet, emitOriginalCss;
-import 'html5_utils.dart';
-import 'info.dart' show ComponentInfo, FileInfo, GlobalInfo;
-import 'messages.dart';
-import 'paths.dart' show PathMapper;
-import 'utils.dart' show escapeDartString, path;
-
-/** Generates the class corresponding to a single web component. */
-NestedPrinter emitPolymerElement(ComponentInfo info, PathMapper pathMapper,
-    TextEditTransaction transaction, CompilerOptions options) {
-  if (info.classDeclaration == null) return null;
-
-  var codeInfo = info.userCode;
-  if (transaction == null) {
-    // TODO(sigmund): avoid emitting this file if we don't need to do any
-    // modifications (e.g. no @observable and not adding the libraryName).
-    transaction = new TextEditTransaction(codeInfo.code, codeInfo.sourceFile);
-  }
-  if (codeInfo.libraryName == null) {
-    // For deploy, we need to import the library associated with the component,
-    // so we need to ensure there is a library directive.
-    var libraryName = info.tagName.replaceAll(new RegExp('[-./]'), '_');
-    transaction.edit(0, 0, 'library $libraryName;');
-  }
-  return transaction.commit();
-}
-
-/** The code that will be used to bootstrap the application. */
-NestedPrinter generateBootstrapCode(
-    FileInfo info, FileInfo userMainInfo, GlobalInfo global,
-    PathMapper pathMapper, CompilerOptions options) {
-
-  var printer = new NestedPrinter(0)
-      ..addLine('library app_bootstrap;')
-      ..addLine('')
-      ..addLine("import 'package:polymer/polymer.dart';")
-      ..addLine("import 'dart:mirrors' show currentMirrorSystem;");
-
-  int i = 0;
-  for (var c in global.components.values) {
-    if (c.hasConflict) continue;
-    printer.addLine("import '${pathMapper.importUrlFor(info, c)}' as i$i;");
-    i++;
-  }
-  if (userMainInfo.userCode != null) {
-    printer..addLine("import '${pathMapper.importUrlFor(info, userMainInfo)}' "
-        "as i$i;\n");
-  }
-
-  printer..addLine('')
-      ..addLine('void main() {')
-      ..indent += 1
-      ..addLine("initPolymer([")
-      ..indent += 2;
-
-  for (var c in global.components.values) {
-    if (c.hasConflict) continue;
-    printer.addLine("'${pathMapper.importUrlFor(info, c)}',");
-  }
-
-  if (userMainInfo.userCode != null) {
-    printer.addLine("'${pathMapper.importUrlFor(info, userMainInfo)}',");
-  }
-
-  return printer
-      ..indent -= 1
-      ..addLine('],')
-      ..addLine("currentMirrorSystem().isolate.rootLibrary.uri.toString());")
-      ..indent -= 2
-      ..addLine('}');
-}
-
-
-/**
- * Rewrites attributes that contain relative URL (excluding src urls in script
- * and link tags which are already rewritten by other parts of the compiler).
-*/
-class _AttributeUrlTransform extends TreeVisitor {
-  final String filePath;
-  final PathMapper pathMapper;
-
-  _AttributeUrlTransform(this.filePath, this.pathMapper);
-
-  visitElement(Element node) {
-    if (node.tagName == 'script') return;
-    if (node.tagName == 'link') return;
-
-    for (var key in node.attributes.keys) {
-      if (urlAttributes.contains(key)) {
-        node.attributes[key] =
-            pathMapper.transformUrl(filePath, node.attributes[key]);
-      }
-    }
-    super.visitElement(node);
-  }
-}
-
-final _shadowDomJS = new RegExp(r'shadowdom\..*\.js', caseSensitive: false);
-final _bootJS = new RegExp(r'.*/polymer/boot.js', caseSensitive: false);
-
-/** Trim down the html for the main html page. */
-void transformMainHtml(Document document, FileInfo fileInfo,
-    PathMapper pathMapper, bool hasCss, bool rewriteUrls,
-    Messages messages, GlobalInfo global, String bootstrapOutName) {
-  var filePath = fileInfo.inputUrl.resolvedPath;
-
-  var dartLoaderTag = null;
-  bool shadowDomFound = false;
-  for (var tag in document.queryAll('script')) {
-    var src = tag.attributes['src'];
-    if (src != null) {
-      var last = src.split('/').last;
-      if (last == 'dart.js' || last == 'testing.js') {
-        dartLoaderTag = tag;
-      } else if (_shadowDomJS.hasMatch(last)) {
-        shadowDomFound = true;
-      }
-    }
-    if (tag.attributes['type'] == 'application/dart') {
-      tag.remove();
-    } else if (src != null) {
-      if (_bootJS.hasMatch(src)) {
-        tag.remove();
-      } else if (rewriteUrls) {
-        tag.attributes["src"] = pathMapper.transformUrl(filePath, src);
-      }
-    }
-  }
-
-  for (var tag in document.queryAll('link')) {
-    var href = tag.attributes['href'];
-    var rel = tag.attributes['rel'];
-    if (rel == 'component' || rel == 'components' || rel == 'import') {
-      tag.remove();
-    } else if (href != null && rewriteUrls && !hasCss) {
-      // Only rewrite URL if rewrite on and we're not CSS polyfilling.
-      tag.attributes['href'] = pathMapper.transformUrl(filePath, href);
-    }
-  }
-
-  if (rewriteUrls) {
-    // Transform any element's attribute which is a relative URL.
-    new _AttributeUrlTransform(filePath, pathMapper).visit(document);
-  }
-
-  if (hasCss) {
-    var newCss = pathMapper.mangle(path.basename(filePath), '.css', true);
-    var linkElem = new Element.html(
-        '<link rel="stylesheet" type="text/css" href="$newCss">');
-    document.head.insertBefore(linkElem, null);
-  }
-
-  var styles = document.queryAll('style');
-  if (styles.length > 0) {
-    var allCss = new StringBuffer();
-    fileInfo.styleSheets.forEach((styleSheet) =>
-        allCss.write(emitStyleSheet(styleSheet, fileInfo)));
-    styles[0].nodes.clear();
-    styles[0].nodes.add(new Text(allCss.toString()));
-    for (var i = styles.length - 1; i > 0 ; i--) {
-      styles[i].remove();
-    }
-  }
-
-  // TODO(jmesserly): put this in the global CSS file?
-  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#css-additions
-  document.head.nodes.insert(0, parseFragment(
-      '<style shadowcssshim="">template { display: none; }</style>'));
-
-  // Move all <element> declarations to the main HTML file
-  // TODO(sigmund): remove this once we have HTMLImports implemented.
-  for (var c in global.components.values) {
-    document.body.nodes.insert(0, new Text('\n'));
-    var fragment = c.element;
-    for (var tag in fragment.queryAll('script')) {
-      // TODO(sigmund): leave script tags around when we start using "boot.js"
-      if (tag.attributes['type'] == 'application/dart') {
-        tag.remove();
-      }
-    }
-    document.body.nodes.insert(0, fragment);
-  }
-
-  if (!shadowDomFound) {
-    // TODO(jmesserly): we probably shouldn't add this automatically.
-    document.body.nodes.add(parseFragment('<script type="text/javascript" '
-        'src="packages/shadow_dom/shadow_dom.debug.js"></script>\n'));
-
-    // JS interop code required for Polymer CSS shimming.
-    document.body.nodes.add(parseFragment('<script type="text/javascript" '
-        'src="packages/browser/interop.js"></script>\n'));
-  }
-
-  var bootstrapScript = parseFragment(
-        '<script type="application/dart" src="$bootstrapOutName"></script>');
-  if (dartLoaderTag == null) {
-    document.body.nodes.add(bootstrapScript);
-    // TODO(jmesserly): turn this warning on.
-    //messages.warning('Missing script to load Dart. '
-    //    'Please add this line to your HTML file: $dartLoader',
-    //    document.body.sourceSpan);
-    // TODO(sigmund): switch to 'boot.js'
-    document.body.nodes.add(parseFragment('<script type="text/javascript" '
-        'src="packages/browser/dart.js"></script>\n'));
-  } else if (dartLoaderTag.parent != document.body) {
-    document.body.nodes.add(bootstrapScript);
-  } else {
-    document.body.insertBefore(bootstrapScript, dartLoaderTag);
-  }
-
-  // Insert the "auto-generated" comment after the doctype, otherwise IE will
-  // go into quirks mode.
-  int commentIndex = 0;
-  DocumentType doctype =
-      document.nodes.firstWhere((n) => n is DocumentType, orElse: () => null);
-  if (doctype != null) {
-    commentIndex = document.nodes.indexOf(doctype) + 1;
-    // TODO(jmesserly): the html5lib parser emits a warning for missing
-    // doctype, but it allows you to put it after comments. Presumably they do
-    // this because some comments won't force IE into quirks mode (sigh). See
-    // this link for more info:
-    //     http://bugzilla.validator.nu/show_bug.cgi?id=836
-    // For simplicity we emit the warning always, like validator.nu does.
-    if (doctype.tagName != 'html' || commentIndex != 1) {
-      messages.warning('file should start with <!DOCTYPE html> '
-          'to avoid the possibility of it being parsed in quirks mode in IE. '
-          'See http://www.w3.org/TR/html5-diff/#doctype', doctype.sourceSpan);
-    }
-  }
-  document.nodes.insert(commentIndex, parseFragment(
-      '\n<!-- This file was auto-generated from $filePath. -->\n'));
-}
diff --git a/pkg/polymer/lib/src/html5_utils.dart b/pkg/polymer/lib/src/html5_utils.dart
deleted file mode 100644
index 391c12b..0000000
--- a/pkg/polymer/lib/src/html5_utils.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// 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
-// BSD-style license that can be found in the LICENSE file.
-
-// TODO(jmesserly): html5lib might be a better home for this.
-// But at the moment we only need it here.
-
-library html5_utils;
-
-/**
- * HTML attributes that expect a URL value.
- * <http://dev.w3.org/html5/spec/section-index.html#attributes-1>
- *
- * Every one of these attributes is a URL in every context where it is used in
- * the DOM. The comments show every DOM element where an attribute can be used.
- */
-const urlAttributes = const [
-  'action',     // in form
-  'background', // in body
-  'cite',       // in blockquote, del, ins, q
-  'data',       // in object
-  'formaction', // in button, input
-  'href',       // in a, area, link, base, command
-  'icon',       // in command
-  'manifest',   // in html
-  'poster',     // in video
-  'src',        // in audio, embed, iframe, img, input, script, source, track,
-                //    video
-];
diff --git a/pkg/polymer/lib/src/info.dart b/pkg/polymer/lib/src/info.dart
index 9a7b530..5fa901f 100644
--- a/pkg/polymer/lib/src/info.dart
+++ b/pkg/polymer/lib/src/info.dart
@@ -10,14 +10,11 @@
 
 import 'dart:collection' show SplayTreeMap, LinkedHashMap;
 
-import 'package:analyzer_experimental/src/generated/ast.dart';
 import 'package:csslib/visitor.dart';
 import 'package:html5lib/dom.dart';
 import 'package:source_maps/span.dart' show Span;
 
-import 'dart_parser.dart' show DartCodeInfo;
 import 'messages.dart';
-import 'summary.dart';
 import 'utils.dart';
 
 /**
@@ -44,92 +41,17 @@
  * component-level behavior code. This code can either be inlined in the HTML
  * file or included in a script tag with the "src" attribute.
  */
-abstract class LibraryInfo implements LibrarySummary {
-
-  /** Whether there is any code associated with the page/component. */
-  bool get codeAttached => inlinedCode != null || externalFile != null;
-
-  /**
-   * The actual inlined code. Use [userCode] if you want the code from this file
-   * or from an external file.
-   */
-  DartCodeInfo inlinedCode;
-
-  /**
-   * If this library's code was loaded using a script tag (e.g. in a component),
-   * [externalFile] has the path to such Dart file relative from the compiler's
-   * base directory.
-   */
-  UrlInfo externalFile;
-
-  /** Info asscociated with [externalFile], if any. */
-  FileInfo externalCode;
-
-  /**
-   * The inverse of [externalCode]. If this .dart file was imported via a script
-   * tag, this refers to the HTML file that imported it.
-   */
-  LibraryInfo htmlFile;
-
-  /** File where the top-level code was defined. */
-  UrlInfo get dartCodeUrl;
-
-  /**
-   * Name of the file that will hold any generated Dart code for this library
-   * unit. Note this is initialized after parsing.
-   */
-  String outputFilename;
-
+abstract class LibraryInfo {
   /** Parsed cssSource. */
   List<StyleSheet> styleSheets = [];
-
-  /** This is used in transforming Dart code to track modified files. */
-  bool modified = false;
-
-  /**
-   * This is used in transforming Dart code to compute files that reference
-   * [modified] files.
-   */
-  List<FileInfo> referencedBy = [];
-
-  /**
-   * Components used within this library unit. For [FileInfo] these are
-   * components used directly in the page. For [ComponentInfo] these are
-   * components used within their shadowed template.
-   */
-  final Map<ComponentSummary, bool> usedComponents =
-      new LinkedHashMap<ComponentSummary, bool>();
-
-  /**
-   * The actual code, either inlined or from an external file, or `null` if none
-   * was defined.
-   */
-  DartCodeInfo get userCode =>
-      externalCode != null ? externalCode.inlinedCode : inlinedCode;
 }
 
 /** Information extracted at the file-level. */
-class FileInfo extends LibraryInfo implements HtmlFileSummary {
+class FileInfo extends LibraryInfo {
   /** Relative path to this file from the compiler's base directory. */
   final UrlInfo inputUrl;
 
   /**
-   * Whether this file should be treated as the entry point of the web app, i.e.
-   * the file users navigate to in their browser. This will be true if this file
-   * was passed in the command line to the dwc compiler, and the
-   * `--components_only` flag was omitted.
-   */
-  final bool isEntryPoint;
-
-  // TODO(terry): Ensure that that the libraryName is a valid identifier:
-  //              a..z || A..Z || _ [a..z || A..Z || 0..9 || _]*
-  String get libraryName =>
-      path.basename(inputUrl.resolvedPath).replaceAll('.', '_');
-
-  /** File where the top-level code was defined. */
-  UrlInfo get dartCodeUrl => externalFile != null ? externalFile : inputUrl;
-
-  /**
    * All custom element definitions in this file. This may contain duplicates.
    * Normally you should use [components] for lookup.
    */
@@ -140,8 +62,8 @@
    *`<link rel='components'>` tag. Maps from the tag name to the component
    * information. This map is sorted by the tag name.
    */
-  final Map<String, ComponentSummary> components =
-      new SplayTreeMap<String, ComponentSummary>();
+  final Map<String, ComponentInfo> components =
+      new SplayTreeMap<String, ComponentInfo>();
 
   /** Files imported with `<link rel="import">` */
   final List<UrlInfo> componentLinks = <UrlInfo>[];
@@ -149,24 +71,12 @@
   /** Files imported with `<link rel="stylesheet">` */
   final List<UrlInfo> styleSheetHrefs = <UrlInfo>[];
 
-  /** Root is associated with the body node. */
-  Element body;
-
-  FileInfo(this.inputUrl, [this.isEntryPoint = false]);
-
-  /**
-   * Query for an [Element] matching the provided [tag], starting from the
-   * [body].
-   */
-  Element query(String tag) => body.query(tag);
+  FileInfo(this.inputUrl);
 }
 
 
 /** Information about a web component definition declared locally. */
-// TODO(sigmund): use a mixin to pull in ComponentSummary.
-class ComponentInfo extends LibraryInfo implements ComponentSummary {
-  /** The file that declares this component. */
-  final FileInfo declaringFile;
+class ComponentInfo extends LibraryInfo {
 
   /** The component tag name, defined with the `name` attribute on `element`. */
   final String tagName;
@@ -182,30 +92,18 @@
    * This will be `null` if the component extends a built-in HTML tag, or
    * if the analyzer has not run yet.
    */
-  ComponentSummary extendsComponent;
-
-  /** The Dart class containing the component's behavior. */
-  String className;
-
-  /** The Dart class declaration. */
-  ClassDeclaration get classDeclaration => _classDeclaration;
-  ClassDeclaration _classDeclaration;
+  ComponentInfo extendsComponent;
 
   /** The declaring `<element>` tag. */
   final Node element;
 
-  /** File where this component was defined. */
-  UrlInfo get dartCodeUrl => externalFile != null
-      ? externalFile : declaringFile.inputUrl;
-
   /**
    * True if [tagName] was defined by more than one component. If this happened
    * we will skip over the component.
    */
   bool hasConflict = false;
 
-  ComponentInfo(this.element, this.declaringFile, this.tagName,
-      this.extendsTag);
+  ComponentInfo(this.element, this.tagName, this.extendsTag);
 
   /**
    * Gets the HTML tag extended by the base of the component hierarchy.
@@ -221,52 +119,7 @@
   bool get hasAuthorStyles =>
       element.attributes.containsKey('apply-author-styles');
 
-  /**
-   * Finds the declaring class, and initializes [className] and
-   * [classDeclaration]. Also [userCode] is generated if there was no script.
-   */
-  void findClassDeclaration(Messages messages) {
-    var constructor = element.attributes['constructor'];
-    className = constructor != null ? constructor :
-        toCamelCase(tagName, startUppercase: true);
-
-    // If we don't have any code, generate a small class definition, and
-    // pretend the user wrote it as inlined code.
-    if (userCode == null) {
-      var superclass = extendsComponent != null ? extendsComponent.className
-          : 'autogenerated.PolymerElement';
-      inlinedCode = new DartCodeInfo(null, null, [],
-          'class $className extends $superclass {\n}', null);
-    }
-
-    var code = userCode.code;
-    _classDeclaration = userCode.findClass(className);
-    if (_classDeclaration == null) {
-      // Check for deprecated x-tags implied constructor.
-      if (tagName.startsWith('x-') && constructor == null) {
-        var oldCtor = toCamelCase(tagName.substring(2), startUppercase: true);
-        _classDeclaration = userCode.findClass(oldCtor);
-        if (_classDeclaration != null) {
-          messages.warning('Implied constructor name for x-tags has changed to '
-              '"$className". You should rename your class or add a '
-              'constructor="$oldCtor" attribute to the element declaration. '
-              'Also custom tags are not required to start with "x-" if their '
-              'name has at least one dash.',
-              element.sourceSpan);
-          className = oldCtor;
-        }
-      }
-
-      if (_classDeclaration == null) {
-        messages.error('please provide a class definition '
-            'for $className:\n $code', element.sourceSpan);
-        return;
-      }
-    }
-  }
-
-  String toString() => '#<ComponentInfo $tagName '
-      '${inlinedCode != null ? "inline" : "from ${dartCodeUrl.resolvedPath}"}>';
+  String toString() => '#<ComponentInfo $tagName>';
 }
 
 
diff --git a/pkg/polymer/lib/src/messages.dart b/pkg/polymer/lib/src/messages.dart
index 5dc6247..b0a5ebd 100644
--- a/pkg/polymer/lib/src/messages.dart
+++ b/pkg/polymer/lib/src/messages.dart
@@ -4,7 +4,7 @@
 
 library messages;
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:barback/barback.dart' show TransformLogger;
 import 'package:source_maps/span.dart' show Span;
@@ -54,7 +54,7 @@
 
   String toJson() {
     if (span == null) return toString();
-    return json.stringify([{
+    return JSON.encode([{
       'method': kind,
       'params': {
         'file': span.sourceUrl,
diff --git a/pkg/polymer/lib/src/paths.dart b/pkg/polymer/lib/src/paths.dart
deleted file mode 100644
index 34037d9..0000000
--- a/pkg/polymer/lib/src/paths.dart
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Holds path information that is used by the WebUI compiler to find files,
- * compute their output location and relative paths between them.
- */
-library polymer.src.paths;
-
-import 'info.dart' show UrlInfo;
-import 'messages.dart';
-import 'summary.dart';
-import 'utils.dart' show path, pathToUrl;
-
-/**
- * Stores information about paths and computes mappings between input and output
- * path locations.
- */
-class PathMapper {
-  /**
-   * Common prefix to all input paths that are read from the file system. The
-   * output generated by the compiler will reflect the directory structure
-   * starting from [_baseDir]. For instance, if [_baseDir] is `a/b/c` and
-   * [_outputDir] is `g/h/`, then the corresponding output file for
-   * `a/b/c/e/f.html` will be under `g/h/e/f.html.dart`.
-   */
-  final String _baseDir;
-
-  /** Base path where all output is generated. */
-  final String _outputDir;
-
-  /** The package root directory. */
-  final String packageRoot;
-
-  /** Whether to add prefixes and to output file names. */
-  final bool _mangleFilenames;
-
-  final bool _rewriteUrls;
-
-  bool get _rewritePackageImports => _rewriteUrls || !_mangleFilenames;
-
-  /** Default prefix added to all filenames. */
-  static const String _DEFAULT_PREFIX = '_';
-
-  PathMapper(String baseDir, String outputDir, this.packageRoot,
-      bool forceMangle, this._rewriteUrls)
-      : _baseDir = baseDir,
-        _outputDir = outputDir,
-        _mangleFilenames = forceMangle || (baseDir == outputDir);
-
-  /** Add a prefix and [suffix] if [_mangleFilenames] is true */
-  String mangle(String name, String suffix, [bool forceSuffix = false]) =>
-    _mangleFilenames ? "$_DEFAULT_PREFIX$name$suffix"
-        : (forceSuffix ? "$name$suffix" : name);
-
-  /**
-   * Checks that `input.resolvedPath` is a valid input path. It must be in
-   * [_baseDir] and must not be in the [_outputDir]. If not, an error message
-   * is added to [messages].
-   */
-  bool checkInputPath(UrlInfo input, Messages messages) {
-    if (_mangleFilenames) return true;
-    var canonicalized = path.normalize(input.resolvedPath);
-    var parentDir = '..${path.separator}';
-    if (!path.relative(canonicalized, from: _outputDir).startsWith(parentDir)) {
-      messages.error(
-          'The file ${input.resolvedPath} cannot be processed. '
-          'Files cannot be under the output folder (${_outputDir}).',
-          input.sourceSpan);
-      return false;
-    }
-    if (path.relative(canonicalized, from: _baseDir).startsWith(parentDir)) {
-      messages.error(
-          'The file ${input.resolvedPath} cannot be processed. '
-          'All processed files must be under the base folder (${_baseDir}), you'
-          ' can specify the base folder using the --basedir flag.',
-          input.sourceSpan);
-      return false;
-    }
-    return true;
-  }
-
-  /**
-   * The path to the output file corresponding to [input], by adding
-   * [_DEFAULT_PREFIX] and a [suffix] to its file name.
-   */
-  String outputPath(String input, String suffix, [bool forceSuffix = false]) =>
-      path.join(outputDirPath(input),
-          mangle(path.basename(input), suffix, forceSuffix));
-
-  /** The path to the output file corresponding to [info]. */
-  String outputLibraryPath(LibrarySummary lib) =>
-      path.join(outputDirPath(lib.dartCodeUrl.resolvedPath),
-          lib.outputFilename);
-
-  /** The corresponding output directory for [input]'s directory. */
-  String outputDirPath(String input) {
-    return _rewritePackages(path.normalize(
-          path.join(_outputDir, path.relative(
-              path.dirname(input), from: _baseDir))));
-  }
-
-  /**
-   * We deal with `packages/` directories in a very special way. We assume it
-   * points to resources loaded from other pub packages. If an output directory
-   * is specified, the compiler will create a packages symlink so that
-   * `package:` imports work.
-   *
-   * To make it possible to share components through pub, we allow using tags of
-   * the form `<link rel="import" href="packages/...">`, so that you can
-   * refer to components within the packages symlink.  Regardless of whether an
-   * --out option was given to the compiler, we don't want to generate files
-   * inside `packages/` for those components.  Instead we will generate such
-   * code in a special directory called `_from_packages/`.
-   */
-  String _rewritePackages(String outputPath) {
-    // TODO(jmesserly): this should match against packageRoot instead.
-    if (!outputPath.contains('packages')) return outputPath;
-    if (!_rewritePackageImports) return outputPath;
-    var segments = path.split(outputPath);
-    return path.joinAll(
-        segments.map((s) => s == 'packages' ? '_from_packages' : s));
-  }
-
-  /**
-   * Returns a url to import/export the output library represented by [target]
-   * from the output library of [src]. In other words, a url to import or export
-   * `target.outputFilename` from `src.outputFilename`.
-   */
-  String importUrlFor(LibrarySummary src, LibrarySummary target) {
-    if (!_rewritePackageImports &&
-        target.dartCodeUrl.url.startsWith('package:')) {
-      return pathToUrl(path.join(path.dirname(target.dartCodeUrl.url),
-            target.outputFilename));
-    }
-    var srcDir = path.dirname(src.dartCodeUrl.resolvedPath);
-    var relDir = path.relative(
-        path.dirname(target.dartCodeUrl.resolvedPath), from: srcDir);
-    return pathToUrl(_rewritePackages(path.normalize(
-          path.join(relDir, target.outputFilename))));
-  }
-
-  /**
-   * Transforms a [target] url seen in [src] (e.g. a Dart import, a .css href in
-   * an HTML file, etc) into a corresponding url from the output file associated
-   * with [src]. This will keep 'package:', 'dart:', path-absolute, and absolute
-   * urls intact, but it will fix relative paths to walk from the output
-   * directory back to the input directory. An exception will be thrown if
-   * [target] is not under [_baseDir].
-   */
-  String transformUrl(String src, String target) {
-    var uri = Uri.parse(target);
-    if (uri.isAbsolute) return target;
-    if (!uri.scheme.isEmpty) return target;
-    if (!uri.host.isEmpty) return target;
-    if (uri.path.isEmpty) return target;  // Implies standalone ? or # in URI.
-    if (path.isAbsolute(target)) return target;
-
-    return pathToUrl(path.normalize(path.relative(
-          path.join(path.dirname(src), target), from: outputDirPath(src))));
-  }
-}
-
-/**
- * Returns a "mangled" name, with a prefix and [suffix] depending on the
- * compiler's settings. [forceSuffix] causes [suffix] to be appended even if
- * the compiler is not mangling names.
- */
-typedef String NameMangler(String name, String suffix, [bool forceSuffix]);
diff --git a/pkg/polymer/lib/src/summary.dart b/pkg/polymer/lib/src/summary.dart
deleted file mode 100644
index 841870a..0000000
--- a/pkg/polymer/lib/src/summary.dart
+++ /dev/null
@@ -1,88 +0,0 @@
-// 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
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Summary information for components and libraries.
- *
- * These classes are used for modular compilation. Summaries are a subset of the
- * information collected by Info objects (see `info.dart`). When we are
- * compiling a single file, the information extracted from that file is stored
- * as info objects, but any information that is needed from other files (like
- * imported components) is stored as a summary.
- */
-library polymer.src.summary;
-
-import 'package:source_maps/span.dart' show Span;
-
-// TODO(sigmund): consider moving UrlInfo out of info.dart
-import 'info.dart' show UrlInfo;
-
-/**
- * Summary information from other library-like objects, which includes HTML
- * components and dart libraries).
- */
-class LibrarySummary {
-  /** Path to the sources represented by this summary. */
-  final UrlInfo dartCodeUrl;
-
-  /** Name given to this source after it was compiled. */
-  final String outputFilename;
-
-  LibrarySummary(this.dartCodeUrl, this.outputFilename);
-}
-
-/** Summary information for an HTML file that defines custom elements. */
-class HtmlFileSummary extends LibrarySummary {
-  /**
-   * Summary of each component defined either explicitly the HTML file or
-   * included transitively from `<link rel="import">` tags.
-   */
-  final Map<String, ComponentSummary> components;
-
-  HtmlFileSummary(UrlInfo dartCodeUrl, String outputFilename, this.components)
-      : super(dartCodeUrl, outputFilename);
-}
-
-/** Information about a web component definition. */
-class ComponentSummary extends LibrarySummary {
-  /** The component tag name, defined with the `name` attribute on `element`. */
-  final String tagName;
-
-  /**
-   * The tag name that this component extends, defined with the `extends`
-   * attribute on `element`.
-   */
-  final String extendsTag;
-
-  /**
-   * The Dart class containing the component's behavior, derived from tagName or
-   * defined in the `constructor` attribute on `element`.
-   */
-  final String className;
-
-  /** Summary of the base component, if any. */
-  final ComponentSummary extendsComponent;
-
-  /**
-   * True if [tagName] was defined by more than one component. Used internally
-   * by the analyzer. Conflicting component will be skipped by the compiler.
-   */
-  bool hasConflict;
-
-  /** Original span where this component is declared. */
-  final Span sourceSpan;
-
-  ComponentSummary(UrlInfo dartCodeUrl, String outputFilename,
-      this.tagName, this.extendsTag, this.className, this.extendsComponent,
-      this.sourceSpan, [this.hasConflict = false])
-      : super(dartCodeUrl, outputFilename);
-
-  /**
-   * Gets the HTML tag extended by the base of the component hierarchy.
-   * Equivalent to [extendsTag] if this inherits directly from an HTML element,
-   * in other words, if [extendsComponent] is null.
-   */
-  String get baseExtendsTag =>
-      extendsComponent == null ? extendsTag : extendsComponent.baseExtendsTag;
-}
diff --git a/pkg/polymer/lib/src/transform.dart b/pkg/polymer/lib/src/transform.dart
index ff5de2b..d2bf910 100644
--- a/pkg/polymer/lib/src/transform.dart
+++ b/pkg/polymer/lib/src/transform.dart
@@ -10,15 +10,18 @@
 import 'transform/code_extractor.dart';
 import 'transform/import_inliner.dart';
 import 'transform/script_compactor.dart';
+import 'transform/polyfill_injector.dart';
 
 export 'transform/code_extractor.dart';
 export 'transform/import_inliner.dart';
 export 'transform/script_compactor.dart';
+export 'transform/polyfill_injector.dart';
 
 /** Phases to deploy a polymer application. */
 var phases = [
   [new InlineCodeExtractor()],
   [new ObservableTransformer()],
   [new ImportedElementInliner()],
-  [new ScriptCompactor()]
+  [new ScriptCompactor()],
+  [new PolyfillInjector()]
 ];
diff --git a/pkg/polymer/lib/src/transform/code_extractor.dart b/pkg/polymer/lib/src/transform/code_extractor.dart
index 0e6d4d5..20fd73a 100644
--- a/pkg/polymer/lib/src/transform/code_extractor.dart
+++ b/pkg/polymer/lib/src/transform/code_extractor.dart
@@ -7,6 +7,10 @@
 
 import 'dart:async';
 
+import 'package:analyzer_experimental/src/generated/ast.dart';
+import 'package:analyzer_experimental/src/generated/error.dart';
+import 'package:analyzer_experimental/src/generated/parser.dart';
+import 'package:analyzer_experimental/src/generated/scanner.dart';
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
 
@@ -17,12 +21,13 @@
  * separate file for each.
  */
 class InlineCodeExtractor extends Transformer {
-  Future<bool> isPrimary(Asset input) =>
-      new Future.value(input.id.extension == ".html");
+  /** Only run this transformer on .html files. */
+  final String allowedExtensions = ".html";
+
 
   Future apply(Transform transform) {
-    var inputId = transform.primaryId;
-    return getPrimaryContent(transform).then((content) {
+    var inputId = transform.primaryInput.id;
+    return transform.primaryInput.readAsString().then((content) {
       var document = parseHtml(content, inputId.path, transform.logger);
       int count = 0;
       bool htmlChanged = false;
@@ -40,14 +45,18 @@
           continue;
         }
 
-        // TODO(sigmund): should we automatically include a library directive
-        // if it doesn't have one?
         var filename = path.url.basename(inputId.path);
         // TODO(sigmund): ensure this filename is unique (dartbug.com/12618).
         tag.attributes['src'] = '$filename.$count.dart';
         var textContent = tag.nodes.first;
+        var code = textContent.value;
         var id = inputId.addExtension('.$count.dart');
-        transform.addOutput(new Asset.fromString(id, textContent.value));
+        if (!_hasLibraryDirective(code)) {
+          var libname = path.withoutExtension(id.path)
+              .replaceAll(new RegExp('[-./]'), '_');
+          code = "library $libname;\n$code";
+        }
+        transform.addOutput(new Asset.fromString(id, code));
         textContent.remove();
         count++;
       }
@@ -56,3 +65,16 @@
     });
   }
 }
+
+/** Parse [code] and determine whether it has a library directive. */
+bool _hasLibraryDirective(String code) {
+  var errorListener = new _ErrorCollector();
+  var token = new StringScanner(null, code, errorListener).tokenize();
+  var unit = new Parser(null, errorListener).parseCompilationUnit(token);
+  return unit.directives.any((d) => d is LibraryDirective);
+}
+
+class _ErrorCollector extends AnalysisErrorListener {
+  final errors = <AnalysisError>[];
+  onError(error) => errors.add(error);
+}
diff --git a/pkg/polymer/lib/src/transform/common.dart b/pkg/polymer/lib/src/transform/common.dart
index c72e8b1..f20d836 100644
--- a/pkg/polymer/lib/src/transform/common.dart
+++ b/pkg/polymer/lib/src/transform/common.dart
@@ -13,15 +13,6 @@
 import 'package:path/path.dart' as path;
 import 'package:source_maps/span.dart' show Span;
 
-// TODO(sigmund): delete this function (see dartbug.com/12515 and
-// dartbug.com/12516)
-Future<String> getPrimaryContent(Transform transform) =>
-  transform.primaryInput.then((asset) => asset.readAsString());
-
-// TODO(sigmund): delete this function (see dartbug.com/12515)
-Future<String> getContent(Transform transform, AssetId id) =>
-  transform.getInput(id).then((asset) => asset.readAsString());
-
 /**
  * Parses an HTML file [contents] and returns a DOM-like tree. Adds emitted
  * error/warning to [logger].
diff --git a/pkg/polymer/lib/src/transform/import_inliner.dart b/pkg/polymer/lib/src/transform/import_inliner.dart
index ac8ab7e..1f8fbf2 100644
--- a/pkg/polymer/lib/src/transform/import_inliner.dart
+++ b/pkg/polymer/lib/src/transform/import_inliner.dart
@@ -8,22 +8,24 @@
 import 'dart:async';
 
 import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
 import 'package:html5lib/dom.dart' show Document, Node, DocumentFragment;
+import 'package:html5lib/dom_parsing.dart' show TreeVisitor;
 import 'common.dart';
 
 /** Recursively inlines polymer-element definitions from html imports. */
 // TODO(sigmund): make sure we match semantics of html-imports for tags other
 // than polymer-element (see dartbug.com/12613).
 class ImportedElementInliner extends Transformer {
-  Future<bool> isPrimary(Asset input) =>
-      new Future.value(input.id.extension == ".html");
+  /** Only run this transformer on .html files. */
+  final String allowedExtensions = ".html";
 
   Future apply(Transform transform) {
     var seen = new Set<AssetId>();
     var elements = [];
-    var id = transform.primaryId;
+    var id = transform.primaryInput.id;
     seen.add(id);
-    return getPrimaryContent(transform).then((content) {
+    return transform.primaryInput.readAsString().then((content) {
       var document = parseHtml(content, id.path, transform.logger);
       var future = _visitImports(document, id, transform, seen, elements);
       return future.then((importsFound) {
@@ -78,14 +80,91 @@
    * Loads an asset identified by [id], visits its imports and collects it's
    * polymer-element definitions.
    */
-  Future _collectPolymerElements(
-      AssetId id, Transform transform, Set<AssetId> seen, List elements) {
-    return getContent(transform, id)
-        .then((content) => parseHtml(
-              content, id.path, transform.logger, checkDocType: false))
-        .then((document) {
-          return _visitImports(document, id, transform, seen, elements)
-            .then((_) => elements.addAll(document.queryAll('polymer-element')));
-        });
+  Future _collectPolymerElements(AssetId id, Transform transform,
+      Set<AssetId> seen, List elements) {
+    return transform.readInputAsString(id).then((content) {
+      var document = parseHtml(
+          content, id.path, transform.logger, checkDocType: false);
+      return _visitImports(document, id, transform, seen, elements).then((_) {
+        var normalizer = new _UrlNormalizer(transform, id);
+        for (var element in document.queryAll('polymer-element')) {
+          normalizer.visit(document);
+          elements.add(element);
+        }
+      });
+    });
   }
 }
+
+/** Internally adjusts urls in the html that we are about to inline. */
+class _UrlNormalizer extends TreeVisitor {
+  final Transform transform;
+
+  /** Asset where the original content (and original url) was found. */
+  final AssetId sourceId;
+
+  _UrlNormalizer(this.transform, this.sourceId);
+
+  visitElement(Element node) {
+    for (var key in node.attributes.keys) {
+      if (_urlAttributes.contains(key)) {
+        var url = node.attributes[key];
+        if (url != null && url != '') {
+          node.attributes[key] = _newUrl(url, node.sourceSpan);
+        }
+      }
+    }
+    super.visitElement(node);
+  }
+
+  _newUrl(String href, Span span) {
+    var uri = Uri.parse(href);
+    if (uri.isAbsolute) return href;
+    if (!uri.scheme.isEmpty) return href;
+    if (!uri.host.isEmpty) return href;
+    if (uri.path.isEmpty) return href;  // Implies standalone ? or # in URI.
+    if (path.isAbsolute(href)) return href;
+
+    var id = resolve(sourceId, href, transform.logger, span);
+    var primaryId = transform.primaryInput.id;
+
+    if (id.path.startsWith('lib/')) {
+      return 'packages/${id.package}/${id.path.substring(4)}';
+    }
+
+    if (id.path.startsWith('asset/')) {
+      return 'assets/${id.package}/${id.path.substring(6)}';
+    }
+
+    if (primaryId.package != id.package) {
+      // Techincally we shouldn't get there
+      logger.error("don't know how to include $id from $primaryId", span);
+      return null;
+    }
+    
+    var builder = path.url;
+    return builder.relative(builder.join('/', id.path),
+        from: builder.join('/', builder.dirname(primaryId.path)));
+  }
+}
+
+/**
+ * HTML attributes that expect a URL value.
+ * <http://dev.w3.org/html5/spec/section-index.html#attributes-1>
+ *
+ * Every one of these attributes is a URL in every context where it is used in
+ * the DOM. The comments show every DOM element where an attribute can be used.
+ */
+const _urlAttributes = const [
+  'action',     // in form
+  'background', // in body
+  'cite',       // in blockquote, del, ins, q
+  'data',       // in object
+  'formaction', // in button, input
+  'href',       // in a, area, link, base, command
+  'icon',       // in command
+  'manifest',   // in html
+  'poster',     // in video
+  'src',        // in audio, embed, iframe, img, input, script, source, track,
+                //    video
+];
diff --git a/pkg/polymer/lib/src/transform/polyfill_injector.dart b/pkg/polymer/lib/src/transform/polyfill_injector.dart
new file mode 100644
index 0000000..899fdd8
--- /dev/null
+++ b/pkg/polymer/lib/src/transform/polyfill_injector.dart
@@ -0,0 +1,76 @@
+// 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.
+
+/**
+ * Final phase of the polymer transformation: includes any additional polyfills
+ * that may needed by the deployed app.
+ */
+library polymer.src.transform.polyfill_injector;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:html5lib/dom.dart' show Document, Node, DocumentFragment;
+import 'package:html5lib/parser.dart' show parseFragment;
+import 'common.dart';
+
+/**
+ * Ensures that any scripts and polyfills needed to run a polymer application
+ * are included. For example, this transformer will ensure that there is a
+ * script tag that loads the shadow_dom polyfill and interop.js (used for the
+ * css shimming).
+ */
+class PolyfillInjector extends Transformer {
+  /** Only run this transformer on .html files. */
+  final String allowedExtensions = ".html";
+
+  Future apply(Transform transform) {
+    var id = transform.primaryInput.id;
+    return transform.primaryInput.readAsString().then((content) {
+      var document = parseHtml(content, id.path, transform.logger);
+      bool shadowDomFound = false;
+      bool jsInteropFound = false;
+      bool dartScriptTags = false;
+
+      for (var tag in document.queryAll('script')) {
+        var src = tag.attributes['src'];
+        if (src != null) {
+          var last = src.split('/').last;
+          if (last == 'interop.js') {
+            jsInteropFound = true;
+          } else if (_shadowDomJS.hasMatch(last)) {
+            shadowDomFound = true;
+          }
+        }
+
+        if (tag.attributes['type'] == 'application/dart') {
+          dartScriptTags = true;
+        }
+      }
+
+      if (!dartScriptTags) {
+        // This HTML has no Dart code, there is nothing to do here.
+        transform.addOutput(new Asset.fromString(id, content));
+        return;
+      }
+
+      if (!jsInteropFound) {
+        // JS interop code is required for Polymer CSS shimming.
+        document.body.nodes.insert(0, parseFragment(
+            '<script src="packages/browser/interop.js"></script>\n'));
+      }
+
+      if (!shadowDomFound) {
+        // Insert at the beginning (this polyfill needs to run as early as
+        // possible).
+        document.body.nodes.insert(0, parseFragment(
+            '<script src="packages/shadow_dom/shadow_dom.min.js"></script>\n'));
+      }
+
+      transform.addOutput(new Asset.fromString(id, document.outerHtml));
+    });
+  }
+}
+
+final _shadowDomJS = new RegExp(r'shadow_dom\..*\.js', caseSensitive: false);
diff --git a/pkg/polymer/lib/src/transform/script_compactor.dart b/pkg/polymer/lib/src/transform/script_compactor.dart
index 9c2550a..8a217e6 100644
--- a/pkg/polymer/lib/src/transform/script_compactor.dart
+++ b/pkg/polymer/lib/src/transform/script_compactor.dart
@@ -28,13 +28,13 @@
  * elements annotated with `@CustomTag`.
  */
 class ScriptCompactor extends Transformer {
-  Future<bool> isPrimary(Asset input) =>
-      new Future.value(input.id.extension == ".html");
+  /** Only run this transformer on .html files. */
+  final String allowedExtensions = ".html";
 
   Future apply(Transform transform) {
-    var id = transform.primaryId;
+    var id = transform.primaryInput.id;
     var logger = transform.logger;
-    return getPrimaryContent(transform).then((content) {
+    return transform.primaryInput.readAsString().then((content) {
       var document = parseHtml(content, id.path, logger);
       var libraries = [];
       bool changed = false;
@@ -79,8 +79,8 @@
             '<script type="application/dart" src="$filename"></script>');
       if (dartLoaderTag == null) {
         document.body.nodes.add(bootstrapScript);
-        document.body.nodes.add(parseFragment('<script type="text/javascript" '
-            'src="packages/browser/dart.js"></script>'));
+        document.body.nodes.add(parseFragment(
+            '<script src="packages/browser/dart.js"></script>'));
       } else if (dartLoaderTag.parent != document.body) {
         document.body.nodes.add(bootstrapScript);
       } else {
@@ -111,7 +111,7 @@
     if (id.path.startsWith('lib/')) {
       return 'package:${id.package}/${id.path.substring(4)}';
     }
-    
+
     // Use relative urls only if it's possible.
     if (id.package != sourceId.package) {
       logger.error("don't know how to import $id from $sourceId");
diff --git a/pkg/polymer/lib/testing/content_shell_test.dart b/pkg/polymer/lib/testing/content_shell_test.dart
index 97398be..cc60912 100644
--- a/pkg/polymer/lib/testing/content_shell_test.dart
+++ b/pkg/polymer/lib/testing/content_shell_test.dart
@@ -11,7 +11,7 @@
 import 'package:args/args.dart';
 import 'package:path/path.dart' as path;
 import 'package:unittest/unittest.dart';
-import 'package:polymer/dwc.dart' as dwc;
+import 'package:polymer/deploy.dart' as deploy;
 
 
 /**
@@ -20,17 +20,17 @@
  */
 void endToEndTests(String inputDir, String outDir, {List<String> arguments}) {
   _testHelper(new _TestOptions(inputDir, inputDir, null, outDir,
-        arguments: arguments));
+      arguments: arguments));
 }
 
 /**
  * Compiles [testFile] with the web-ui compiler, and then runs the output as a
  * render test in content_shell.
  */
-void renderTests(String baseDir, String inputDir, String expectedDir,
+void renderTests(String webDir, String inputDir, String expectedDir,
     String outDir, {List<String> arguments, String script, String pattern,
     bool deleteDir: true}) {
-  _testHelper(new _TestOptions(baseDir, inputDir, expectedDir, outDir,
+  _testHelper(new _TestOptions(webDir, inputDir, expectedDir, outDir,
       arguments: arguments, script: script, pattern: pattern,
       deleteDir: deleteDir));
 }
@@ -51,18 +51,12 @@
     print('Cleaning old output for ${path.normalize(options.outDir)}');
     dir.deleteSync(recursive: true);
   }
-  dir.createSync();
+  dir.createSync(recursive: true);
 
   for (var filePath in paths) {
     var filename = path.basename(filePath);
     test('compile $filename', () {
-      var testArgs = ['-o', options.outDir, '--basedir', options.baseDir,
-          '--deploy']
-          ..addAll(options.compilerArgs)
-          ..add(filePath);
-      expect(dwc.run(testArgs, printTime: false).then((res) {
-        expect(res.messages.length, 0, reason: res.messages.join('\n'));
-      }), completes);
+      return deploy.runForTest(options.webDir, options.outDir);
     });
   }
 
@@ -70,26 +64,29 @@
   // Sort files to match the order in which run.sh runs diff.
   filenames.sort();
 
-  // Get the path from "input" relative to "baseDir"
-  var relativeToBase = path.relative(options.inputDir, from: options.baseDir);
-  var finalOutDir = path.join(options.outDir, relativeToBase);
+  var finalOutDir = path.join(options.outDir, options.inputDir);
+  var outBaseDir = path.join(options.outDir, options.webDir);
 
   runTests(String search) {
     var output;
 
     for (var filename in filenames) {
       test('content_shell run $filename$search', () {
-        var args = ['--dump-render-tree',
-            'file://$finalOutDir/$filename$search'];
-        var env = {'DART_FLAGS': '--checked'};
-        expect(Process.run('content_shell', args, environment: env).then((res) {
-          expect(res.exitCode, 0, reason: 'content_shell exit code: '
-              '${res.exitCode}. Contents of stderr: \n${res.stderr}');
-          var outs = res.stdout.split('#EOF\n')
-            .where((s) => !s.trim().isEmpty).toList();
-          expect(outs.length, 1);
-          output = outs.first;
-        }), completes);
+        var lnArgs = ['-s', '$outBaseDir/packages', '$finalOutDir/packages'];
+        return Process.run('ln', lnArgs).then((_) {
+          var args = ['--dump-render-tree',
+              'file://$finalOutDir/$filename$search'];
+          var env = {'DART_FLAGS': '--checked'};
+          return Process.run('content_shell', args, environment: env)
+              .then((res) {
+                expect(res.exitCode, 0, reason: 'content_shell exit code: '
+                    '${res.exitCode}. Contents of stderr: \n${res.stderr}');
+                var outs = res.stdout.split('#EOF\n')
+                  .where((s) => !s.trim().isEmpty).toList();
+                expect(outs.length, 1);
+                output = outs.first;
+              });
+        });
       });
 
       test('verify $filename $search', () {
@@ -150,7 +147,7 @@
 }
 
 class _TestOptions {
-  final String baseDir;
+  final String webDir;
   final String inputDir;
 
   final String expectedDir;
@@ -166,7 +163,7 @@
   final List<String> compilerArgs;
   final RegExp pattern;
 
-  factory _TestOptions(String baseDir, String inputDir, String expectedDir,
+  factory _TestOptions(String webDir, String inputDir, String expectedDir,
       String outDir, {List<String> arguments, String script, String pattern,
       bool deleteDir: true}) {
     if (arguments == null) arguments = new Options().arguments;
@@ -186,19 +183,19 @@
     }
 
     var scriptDir = path.absolute(path.dirname(script));
-    baseDir = path.join(scriptDir, baseDir);
-    inputDir = path.join(scriptDir, inputDir);
+    webDir = path.relative(path.join(scriptDir, webDir));
+    inputDir = path.relative(path.join(scriptDir, inputDir));
     outDir = path.join(scriptDir, outDir);
     if (expectedDir != null) {
       expectedDir = path.join(scriptDir, expectedDir);
     }
 
-    return new _TestOptions._(baseDir, inputDir, expectedDir, outDir, deleteDir,
+    return new _TestOptions._(webDir, inputDir, expectedDir, outDir, deleteDir,
         args['dart'] == true, args['js'] == true, args['shadowdom'] == true,
         compilerArgs, filePattern);
   }
 
-  _TestOptions._(this.baseDir, this.inputDir, this.expectedDir, this.outDir,
+  _TestOptions._(this.webDir, this.inputDir, this.expectedDir, this.outDir,
       this.deleteDir, this.runAsDart, this.runAsJs,
       this.forcePolyfillShadowDom, this.compilerArgs, this.pattern);
 }
diff --git a/pkg/polymer/lib/testing/testing.js b/pkg/polymer/lib/testing/testing.js
index 957a48c..3c22f05 100644
--- a/pkg/polymer/lib/testing/testing.js
+++ b/pkg/polymer/lib/testing/testing.js
@@ -71,6 +71,17 @@
         }
       }
 
+      // We remove the contents of style tags so that we can compare both runs
+      // with and without the runtmie css shim. We keep the STYLE right under
+      // HEAD, because it is not affected by the shim.
+      if (node.tagName == 'STYLE') {
+        if (node.attributes['shadowcssshim'] != null) {
+          node.parentNode.removeChild(node);
+        } else if (node.parentNode.tagName != "HEAD") {
+          node.textContent = '/* style hidden by testing.js */'
+        }
+      }
+
       if (node.tagName == 'SCRIPT') {
         if (node.textContent.indexOf('_DART_TEMPORARY_ATTACHED') >= 0)  {
           node.parentNode.removeChild(node);
diff --git a/pkg/polymer/test/compiler_test.dart b/pkg/polymer/test/compiler_test.dart
index d5d47ba..abe5e32 100644
--- a/pkg/polymer/test/compiler_test.dart
+++ b/pkg/polymer/test/compiler_test.dart
@@ -39,18 +39,6 @@
         'foo.html': 1,
         'bar.html': 1
       }), reason: 'Actual:\n  ${fs.readCount}');
-
-      var outputs = compiler.output.map((o) => o.path);
-      expect(outputs, equals([
-        'foo.html.dart',
-        'foo.html.dart.map',
-        'bar.html.dart',
-        'bar.html.dart.map',
-        'index.html.dart',
-        'index.html.dart.map',
-        'index.html_bootstrap.dart',
-        'index.html',
-      ].map((p) => path.join('out', p))));
     }));
   });
 
@@ -66,18 +54,9 @@
       compiler.run().then(expectAsync1((e) {
         var msgs = messages.messages.where((m) =>
             m.message.contains('unable')).toList();
-
-        expect(msgs.length, 1);
-        expect(msgs[0].level, Level.SEVERE);
-        expect(msgs[0].message, contains('unable to open file'));
-        expect(msgs[0].span, isNotNull);
-        expect(msgs[0].span.sourceUrl, 'index.html');
-
+        expect(msgs.length, 0);
         MockFileSystem fs = compiler.fileSystem;
-        expect(fs.readCount, { 'index.html': 1, 'notfound.dart': 1 });
-
-        var outputs = compiler.output.map((o) => o.path.toString());
-        expect(outputs, []);
+        expect(fs.readCount, { 'index.html': 1 });
       }));
     });
 
@@ -102,9 +81,6 @@
 
         MockFileSystem fs = compiler.fileSystem;
         expect(fs.readCount, { 'index.html': 1, 'notfound.html': 1 });
-
-        var outputs = compiler.output.map((o) => o.path.toString());
-        expect(outputs, []);
       }));
     });
 
@@ -124,17 +100,10 @@
       compiler.run().then(expectAsync1((e) {
         var msgs = messages.messages.where((m) =>
             m.message.contains('unable')).toList();
-
-        expect(msgs.length, 1);
-        expect(msgs[0].level, Level.SEVERE);
-        expect(msgs[0].message, contains('unable to open file'));
-
+        expect(msgs.length, 0);
         MockFileSystem fs = compiler.fileSystem;
         expect(fs.readCount,
-            { 'index.html': 1, 'foo.html': 1, 'notfound.dart': 1  });
-
-        var outputs = compiler.output.map((o) => o.path.toString());
-        expect(outputs, []);
+            { 'index.html': 1, 'foo.html': 1 });
       }));
     });
   });
diff --git a/pkg/polymer/test/css_test.dart b/pkg/polymer/test/css_test.dart
index 9a53ef4..9f4c734 100644
--- a/pkg/polymer/test/css_test.dart
+++ b/pkg/polymer/test/css_test.dart
@@ -50,14 +50,6 @@
     expect(htmlInfo.styleSheets.length, 2);
     expect(prettyPrintCss(htmlInfo.styleSheets[0]), '');
     expect(prettyPrintCss(htmlInfo.styleSheets[1]), '.test { color: red; }');
-
-    var outputs = compiler.output.map((o) => o.path);
-    expect(outputs, equals([
-      'out/index.html.dart',
-      'out/index.html.dart.map',
-      'out/index.html_bootstrap.dart',
-      'out/index.html',
-    ]));
   }));
 }
 
@@ -150,13 +142,6 @@
         '.test-19 { border: 2px 2px 2px 3px dashed red; } '
         '.test-20 { border: 3px 2px 2px 2px dashed green; } '
         '.test-21 { border: bold 1px 10px blue; }');
-    var outputs = compiler.output.map((o) => o.path);
-    expect(outputs, equals([
-      'out/index.html.dart',
-      'out/index.html.dart.map',
-      'out/index.html_bootstrap.dart',
-      'out/index.html',
-    ]));
   }));
 }
 
@@ -202,15 +187,6 @@
     expect(htmlInfo.styleSheets.length, 1);
     expect(prettyPrintCss(htmlInfo.styleSheets[0]),
         '@import url(foo.css); .test { color: red; }');
-
-    var outputs = compiler.output.map((o) => o.path);
-    expect(outputs, equals([
-      'out/index.html.dart',
-      'out/index.html.dart.map',
-      'out/index.html_bootstrap.dart',
-      'out/foo.css',
-      'out/index.html',
-    ]));
   }));
 }
 
@@ -293,18 +269,6 @@
         '@import url(second.css); '
         '.test-1 { color: red; } '
         '.test-2 { width: 100px; }');
-
-    var outputs = compiler.output.map((o) => o.path);
-    expect(outputs, equals([
-      'out/index.html.dart',
-      'out/index.html.dart.map',
-      'out/index.html_bootstrap.dart',
-      'out/first.css',
-      'out/second.css',
-      'out/third.css',
-      'out/fourth.css',
-      'out/index.html',
-    ]));
   }));
 }
 
@@ -378,39 +342,26 @@
       expect(htmlInfo.declaredComponents.length, 1);
       expect(htmlInfo.declaredComponents[0].styleSheets.length, 1);
 
-      var outputs = compiler.output.map((o) => o.path);
-      expect(outputs, equals([
-        'out/foo.html.dart',
-        'out/foo.html.dart.map',
-        'out/index.html.dart',
-        'out/index.html.dart.map',
-        'out/index.html_bootstrap.dart',
-        'out/foo.css',
-        'out/index.html.css',
-        'out/index.html',
-      ]));
-
-      for (var file in compiler.output) {
-        if (file.path == 'out/index.html.css') {
-          expect(file.contents,
-              '/* Auto-generated from components style tags. */\n'
-              '/* DO NOT EDIT. */\n\n'
-              '/* ==================================================== \n'
-              '   Component x-foo stylesheet \n'
-              '   ==================================================== */\n'
-              '@import "foo.css";\n'
-              '[is="x-foo"] .main {\n'
-              '  color: #f00;\n'
-              '}\n'
-              '[is="x-foo"] .test-background {\n'
-              '  background: url("http://www.foo.com/bar.png");\n'
-              '}\n\n');
-        } else if (file.path == 'out/foo.css') {
-          expect(file.contents,
-              '/* Auto-generated from style sheet href = foo.css */\n'
-              '/* DO NOT EDIT. */\n\n\n\n');
-        }
-      }
+      // TODO(sigmund,terry): reenable
+      //   if (file.path == 'out/index.html.css') {
+      //     expect(file.contents,
+      //         '/* Auto-generated from components style tags. */\n'
+      //         '/* DO NOT EDIT. */\n\n'
+      //         '/* ==================================================== \n'
+      //         '   Component x-foo stylesheet \n'
+      //         '   ==================================================== */\n'
+      //         '@import "foo.css";\n'
+      //         '[is="x-foo"] .main {\n'
+      //         '  color: #f00;\n'
+      //         '}\n'
+      //         '[is="x-foo"] .test-background {\n'
+      //         '  background: url("http://www.foo.com/bar.png");\n'
+      //         '}\n\n');
+      //   } else if (file.path == 'out/foo.css') {
+      //     expect(file.contents,
+      //         '/* Auto-generated from style sheet href = foo.css */\n'
+      //         '/* DO NOT EDIT. */\n\n\n\n');
+      //   }
 
       // Check for warning messages about var- cycles in no expected order.
       expect(messages.messages.length, 8);
@@ -505,33 +456,25 @@
         'foo.html': 1,
       }), reason: 'Actual:\n  ${fs.readCount}');
 
-      var outputs = compiler.output.map((o) => o.path);
-      expect(outputs, equals([
-        'out/foo.html.dart',
-        'out/foo.html.dart.map',
-        'out/index.html.dart',
-        'out/index.html.dart.map',
-        'out/index.html_bootstrap.dart',
-        'out/index.html',
-      ]));
-      expect(compiler.output.last.contents, contains(
-          '<div pseudo="x-foo_0">'
-            '<div>Test</div>'
-          '</div>'
-          '<div pseudo="x-foo1_1 x-foo2_2">'
-          '<div>Test</div>'
-          '</div>'));
-      expect(compiler.output.last.contents, contains(
-          '<style>.test > *[pseudo="x-foo_0"] {\n'
-            '  background-color: #f00;\n'
-          '}\n'
-          '.test > *[pseudo="x-foo1_1"] {\n'
-          '  color: #00f;\n'
-          '}\n'
-          '.test > *[pseudo="x-foo2_2"] {\n'
-          '  color: #008000;\n'
-          '}'
-          '</style>'));
+      // TODO(sigmund, terry): reenable
+      // expect(compiler.output.last.contents, contains(
+      //     '<div pseudo="x-foo_0">'
+      //       '<div>Test</div>'
+      //     '</div>'
+      //     '<div pseudo="x-foo1_1 x-foo2_2">'
+      //     '<div>Test</div>'
+      //     '</div>'));
+      // expect(compiler.output.last.contents, contains(
+      //     '<style>.test > *[pseudo="x-foo_0"] {\n'
+      //       '  background-color: #f00;\n'
+      //     '}\n'
+      //     '.test > *[pseudo="x-foo1_1"] {\n'
+      //     '  color: #00f;\n'
+      //     '}\n'
+      //     '.test > *[pseudo="x-foo2_2"] {\n'
+      //     '  color: #008000;\n'
+      //     '}'
+      //     '</style>'));
     }));
 }
 
diff --git a/pkg/polymer/test/paths_test.dart b/pkg/polymer/test/paths_test.dart
deleted file mode 100644
index 4a54a9d..0000000
--- a/pkg/polymer/test/paths_test.dart
+++ /dev/null
@@ -1,339 +0,0 @@
-// 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
-// BSD-style license that can be found in the LICENSE file.
-
-/** Tests for [PathMapper]. */
-library path_info_test;
-
-import 'package:path/path.dart' as path;
-import 'package:polymer/src/info.dart';
-import 'package:polymer/src/paths.dart';
-import 'package:polymer/src/utils.dart' as utils;
-import 'package:unittest/compact_vm_config.dart';
-import 'package:unittest/unittest.dart';
-
-main() {
-  useCompactVMConfiguration();
-  group('paths', () {
-    setUp(() {
-      utils.path = new path.Builder(style: path.Style.posix);
-    });
-
-    tearDown(() {
-      utils.path = new path.Builder();
-    });
-
-    testPaths();
-  });
-}
-
-testPaths() {
-  group('outdir == basedir:', () {
-    group('outputPath', () {
-      test('mangle automatic', () {
-        var pathMapper = _newPathMapper('a', 'a', false);
-        var file = _mockFile('a/b.dart', pathMapper);
-        expect(file.dartCodeUrl.resolvedPath, 'a/b.dart');
-        expect(pathMapper.outputPath(file.dartCodeUrl.resolvedPath, '.dart'),
-            'a/_b.dart.dart');
-      });
-
-      test('within packages/', () {
-        var pathMapper = _newPathMapper('a', 'a', false);
-        var file = _mockFile('a/packages/b.dart', pathMapper);
-        expect(file.dartCodeUrl.resolvedPath, 'a/packages/b.dart');
-        expect(pathMapper.outputPath(file.dartCodeUrl.resolvedPath, '.dart'),
-            'a/_from_packages/_b.dart.dart');
-      });
-    });
-
-    group('importUrlFor', () {
-      test('simple pathMapper', () {
-        var pathMapper = _newPathMapper('a', 'a', false);
-        var file1 = _mockFile('a/b.dart', pathMapper);
-        var file2 = _mockFile('a/c/d.dart', pathMapper);
-        var file3 = _mockFile('a/e/f.dart', pathMapper);
-        expect(pathMapper.importUrlFor(file1, file2), 'c/_d.dart.dart');
-        expect(pathMapper.importUrlFor(file1, file3), 'e/_f.dart.dart');
-        expect(pathMapper.importUrlFor(file2, file1), '../_b.dart.dart');
-        expect(pathMapper.importUrlFor(file2, file3), '../e/_f.dart.dart');
-        expect(pathMapper.importUrlFor(file3, file2), '../c/_d.dart.dart');
-        expect(pathMapper.importUrlFor(file3, file1), '../_b.dart.dart');
-      });
-
-      test('include packages/', () {
-        var pathMapper = _newPathMapper('a', 'a', false);
-        var file1 = _mockFile('a/b.dart', pathMapper);
-        var file2 = _mockFile('a/c/d.dart', pathMapper);
-        var file3 = _mockFile('a/packages/f.dart', pathMapper);
-        expect(pathMapper.importUrlFor(file1, file2), 'c/_d.dart.dart');
-        expect(pathMapper.importUrlFor(file1, file3),
-            '_from_packages/_f.dart.dart');
-        expect(pathMapper.importUrlFor(file2, file1), '../_b.dart.dart');
-        expect(pathMapper.importUrlFor(file2, file3),
-            '../_from_packages/_f.dart.dart');
-        expect(pathMapper.importUrlFor(file3, file2), '../c/_d.dart.dart');
-        expect(pathMapper.importUrlFor(file3, file1), '../_b.dart.dart');
-      });
-
-      test('packages, but no rewrite', () {
-        var pathMapper = _newPathMapper('a', 'a', false, rewriteUrls: false);
-        var file1 = _mockFile('a/b.dart', pathMapper);
-        var file2 = _mockFile('a/c/d.dart', pathMapper);
-        var file3 = _mockFile('a/packages/c/f.dart', pathMapper,
-            url: 'package:e/f.dart');
-        expect(pathMapper.importUrlFor(file1, file2), 'c/_d.dart.dart');
-        expect(pathMapper.importUrlFor(file1, file3),
-          'package:e/_f.dart.dart');
-        expect(pathMapper.importUrlFor(file2, file1), '../_b.dart.dart');
-        expect(pathMapper.importUrlFor(file2, file3),
-            'package:e/_f.dart.dart');
-      });
-
-      test('windows paths', () {
-        try {
-          utils.path = new path.Builder(style: path.Style.windows);
-          var pathMapper = _newPathMapper('a', 'a', false);
-          var file1 = _mockFile('a\\b.dart', pathMapper);
-          var file2 = _mockFile('a\\c\\d.dart', pathMapper);
-          var file3 = _mockFile('a\\packages\\f.dart', pathMapper);
-          expect(pathMapper.importUrlFor(file1, file2), 'c/_d.dart.dart');
-          expect(pathMapper.importUrlFor(file1, file3),
-              '_from_packages/_f.dart.dart');
-          expect(pathMapper.importUrlFor(file2, file1), '../_b.dart.dart');
-          expect(pathMapper.importUrlFor(file2, file3),
-              '../_from_packages/_f.dart.dart');
-          expect(pathMapper.importUrlFor(file3, file2), '../c/_d.dart.dart');
-          expect(pathMapper.importUrlFor(file3, file1), '../_b.dart.dart');
-        } finally {
-          utils.path = new path.Builder();
-        }
-      });
-    });
-
-    test('transformUrl simple paths', () {
-      var pathMapper = _newPathMapper('a', 'a', false);
-      var file1 = 'a/b.dart';
-      var file2 = 'a/c/d.html';
-      // when the output == input directory, no paths should be rewritten
-      expect(pathMapper.transformUrl(file1, '/a.dart'), '/a.dart');
-      expect(pathMapper.transformUrl(file1, 'c.dart'), 'c.dart');
-      expect(pathMapper.transformUrl(file1, '../c/d.dart'), '../c/d.dart');
-      expect(pathMapper.transformUrl(file1, 'packages/c.dart'),
-          'packages/c.dart');
-      expect(pathMapper.transformUrl(file2, 'e.css'), 'e.css');
-      expect(pathMapper.transformUrl(file2, '../c/e.css'), 'e.css');
-      expect(pathMapper.transformUrl(file2, '../q/e.css'), '../q/e.css');
-      expect(pathMapper.transformUrl(file2, 'packages/c.css'),
-          'packages/c.css');
-      expect(pathMapper.transformUrl(file2, '../packages/c.css'),
-          '../packages/c.css');
-    });
-
-    test('transformUrl with source in packages/', () {
-      var pathMapper = _newPathMapper('a', 'a', false);
-      var file = 'a/packages/e.html';
-      // Even when output == base, files under packages/ are moved to
-      // _from_packages, so all imports are affected:
-      expect(pathMapper.transformUrl(file, 'e.css'), '../packages/e.css');
-      expect(pathMapper.transformUrl(file, '../packages/e.css'),
-          '../packages/e.css');
-      expect(pathMapper.transformUrl(file, '../q/e.css'), '../q/e.css');
-      expect(pathMapper.transformUrl(file, 'packages/c.css'),
-          '../packages/packages/c.css');
-    });
-  });
-
-  group('outdir != basedir:', () {
-    group('outputPath', (){
-      test('no force mangle', () {
-        var pathMapper = _newPathMapper('a', 'out', false);
-        var file = _mockFile('a/b.dart', pathMapper);
-        expect(file.dartCodeUrl.resolvedPath, 'a/b.dart');
-        expect(pathMapper.outputPath(file.dartCodeUrl.resolvedPath, '.dart'),
-            'out/b.dart');
-      });
-
-      test('force mangling', () {
-        var pathMapper = _newPathMapper('a', 'out', true);
-        var file = _mockFile('a/b.dart', pathMapper);
-        expect(file.dartCodeUrl.resolvedPath, 'a/b.dart');
-        expect(pathMapper.outputPath(file.dartCodeUrl.resolvedPath, '.dart'),
-            'out/_b.dart.dart');
-      });
-
-      test('within packages/, no mangle', () {
-        var pathMapper = _newPathMapper('a', 'out', false);
-        var file = _mockFile('a/packages/b.dart', pathMapper);
-        expect(file.dartCodeUrl.resolvedPath, 'a/packages/b.dart');
-        expect(pathMapper.outputPath(file.dartCodeUrl.resolvedPath, '.dart'),
-            'out/_from_packages/b.dart');
-      });
-
-      test('within packages/, mangle', () {
-        var pathMapper = _newPathMapper('a', 'out', true);
-        var file = _mockFile('a/packages/b.dart', pathMapper);
-        expect(file.dartCodeUrl.resolvedPath, 'a/packages/b.dart');
-        expect(pathMapper.outputPath(file.dartCodeUrl.resolvedPath, '.dart'),
-            'out/_from_packages/_b.dart.dart');
-      });
-    });
-
-    group('importUrlFor', (){
-      test('simple paths, no mangle', () {
-        var pathMapper = _newPathMapper('a', 'out', false);
-        var file1 = _mockFile('a/b.dart', pathMapper);
-        var file2 = _mockFile('a/c/d.dart', pathMapper);
-        var file3 = _mockFile('a/e/f.dart', pathMapper);
-        expect(pathMapper.importUrlFor(file1, file2), 'c/d.dart');
-        expect(pathMapper.importUrlFor(file1, file3), 'e/f.dart');
-        expect(pathMapper.importUrlFor(file2, file1), '../b.dart');
-        expect(pathMapper.importUrlFor(file2, file3), '../e/f.dart');
-        expect(pathMapper.importUrlFor(file3, file2), '../c/d.dart');
-        expect(pathMapper.importUrlFor(file3, file1), '../b.dart');
-      });
-
-      test('simple paths, mangle', () {
-        var pathMapper = _newPathMapper('a', 'out', true);
-        var file1 = _mockFile('a/b.dart', pathMapper);
-        var file2 = _mockFile('a/c/d.dart', pathMapper);
-        var file3 = _mockFile('a/e/f.dart', pathMapper);
-        expect(pathMapper.importUrlFor(file1, file2), 'c/_d.dart.dart');
-        expect(pathMapper.importUrlFor(file1, file3), 'e/_f.dart.dart');
-        expect(pathMapper.importUrlFor(file2, file1), '../_b.dart.dart');
-        expect(pathMapper.importUrlFor(file2, file3), '../e/_f.dart.dart');
-        expect(pathMapper.importUrlFor(file3, file2), '../c/_d.dart.dart');
-        expect(pathMapper.importUrlFor(file3, file1), '../_b.dart.dart');
-      });
-
-      test('include packages/, no mangle', () {
-        var pathMapper = _newPathMapper('a', 'out', false);
-        var file1 = _mockFile('a/b.dart', pathMapper);
-        var file2 = _mockFile('a/c/d.dart', pathMapper);
-        var file3 = _mockFile('a/packages/e/f.dart', pathMapper,
-            url: 'package:e/f.dart');
-        expect(pathMapper.importUrlFor(file1, file2), 'c/d.dart');
-        expect(pathMapper.importUrlFor(file1, file3),
-            '_from_packages/e/f.dart');
-        expect(pathMapper.importUrlFor(file2, file1), '../b.dart');
-        expect(pathMapper.importUrlFor(file2, file3),
-            '../_from_packages/e/f.dart');
-        expect(pathMapper.importUrlFor(file3, file2), '../../c/d.dart');
-        expect(pathMapper.importUrlFor(file3, file1), '../../b.dart');
-      });
-
-      test('include packages/, mangle', () {
-        var pathMapper = _newPathMapper('a', 'out', true);
-        var file1 = _mockFile('a/b.dart', pathMapper);
-        var file2 = _mockFile('a/c/d.dart', pathMapper);
-        var file3 = _mockFile('a/packages/e/f.dart', pathMapper,
-            url: 'package:e/f.dart');
-        expect(pathMapper.importUrlFor(file1, file2), 'c/_d.dart.dart');
-        expect(pathMapper.importUrlFor(file1, file3),
-          '_from_packages/e/_f.dart.dart');
-        expect(pathMapper.importUrlFor(file2, file1), '../_b.dart.dart');
-        expect(pathMapper.importUrlFor(file2, file3),
-            '../_from_packages/e/_f.dart.dart');
-        expect(pathMapper.importUrlFor(file3, file2), '../../c/_d.dart.dart');
-        expect(pathMapper.importUrlFor(file3, file1), '../../_b.dart.dart');
-      });
-
-      test('windows paths', () {
-        try {
-          utils.path = new path.Builder(style: path.Style.windows);
-          var pathMapper = _newPathMapper('a', 'out', true);
-          var file1 = _mockFile('a\\b.dart', pathMapper);
-          var file2 = _mockFile('a\\c\\d.dart', pathMapper);
-          var file3 = _mockFile('a\\packages\\f.dart', pathMapper);
-          expect(pathMapper.importUrlFor(file1, file2), 'c/_d.dart.dart');
-          expect(pathMapper.importUrlFor(file1, file3),
-              '_from_packages/_f.dart.dart');
-          expect(pathMapper.importUrlFor(file2, file1), '../_b.dart.dart');
-          expect(pathMapper.importUrlFor(file2, file3),
-              '../_from_packages/_f.dart.dart');
-          expect(pathMapper.importUrlFor(file3, file2), '../c/_d.dart.dart');
-          expect(pathMapper.importUrlFor(file3, file1), '../_b.dart.dart');
-        } finally {
-          utils.path = new path.Builder();
-        }
-      });
-    });
-
-    group('transformUrl', () {
-      test('simple source, not in packages/', () {
-        var pathMapper = _newPathMapper('a', 'out', false);
-        var file1 = 'a/b.dart';
-        var file2 = 'a/c/d.html';
-        // when the output == input directory, no paths should be rewritten
-        expect(pathMapper.transformUrl(file1, '/a.dart'), '/a.dart');
-        expect(pathMapper.transformUrl(file1, 'c.dart'), '../a/c.dart');
-
-        // reach out from basedir:
-        expect(pathMapper.transformUrl(file1, '../c/d.dart'), '../c/d.dart');
-
-        // reach into packages dir:
-        expect(pathMapper.transformUrl(file1, 'packages/c.dart'),
-            '../a/packages/c.dart');
-
-        expect(pathMapper.transformUrl(file2, 'e.css'), '../../a/c/e.css');
-
-        _checkPath('../../a/c/../c/e.css', '../../a/c/e.css');
-        expect(pathMapper.transformUrl(file2, '../c/e.css'), '../../a/c/e.css');
-
-        _checkPath('../../a/c/../q/e.css', '../../a/q/e.css');
-        expect(pathMapper.transformUrl(file2, '../q/e.css'), '../../a/q/e.css');
-
-        expect(pathMapper.transformUrl(file2, 'packages/c.css'),
-            '../../a/c/packages/c.css');
-        _checkPath('../../a/c/../packages/c.css', '../../a/packages/c.css');
-        expect(pathMapper.transformUrl(file2, '../packages/c.css'),
-            '../../a/packages/c.css');
-      });
-
-      test('input in packages/', () {
-        var pathMapper = _newPathMapper('a', 'out', true);
-        var file = 'a/packages/e.html';
-        expect(pathMapper.transformUrl(file, 'e.css'),
-            '../../a/packages/e.css');
-        expect(pathMapper.transformUrl(file, '../packages/e.css'),
-            '../../a/packages/e.css');
-        expect(pathMapper.transformUrl(file, '../q/e.css'), '../../a/q/e.css');
-        expect(pathMapper.transformUrl(file, 'packages/c.css'),
-            '../../a/packages/packages/c.css');
-      });
-
-      test('src fragments', () {
-        var pathMapper = _newPathMapper('a', 'out', false);
-        var file1 = 'a/b.dart';
-        var file2 = 'a/c/html.html';
-        // when the output == input directory, no paths should be rewritten
-        expect(pathMapper.transformUrl(file1, '#tips'), '#tips');
-        expect(pathMapper.transformUrl(file1,
-            'http://www.w3schools.com/html_links.htm#tips'),
-            'http://www.w3schools.com/html_links.htm#tips');
-        expect(pathMapper.transformUrl(file2,
-          'html_links.html'),
-          '../../a/c/html_links.html');
-        expect(pathMapper.transformUrl(file2,
-            'html_links.html#tips'),
-            '../../a/c/html_links.html#tips');
-      });
-    });
-  });
-}
-
-_newPathMapper(String baseDir, String outDir, bool forceMangle,
-    {bool rewriteUrls: true}) =>
-  new PathMapper(baseDir, outDir, 'packages', forceMangle, rewriteUrls);
-
-_mockFile(String filePath, PathMapper pathMapper, {String url}) {
-  var file = new FileInfo(new UrlInfo(
-        url == null ? filePath : url, filePath, null));
-  file.outputFilename = pathMapper.mangle(
-      utils.path.basename(filePath), '.dart', false);
-  return file;
-}
-
-_checkPath(String filePath, String expected) {
-  expect(utils.path.normalize(filePath), expected);
-}
diff --git a/pkg/polymer/test/run.sh b/pkg/polymer/test/run.sh
index 0d2b569..3d04337 100755
--- a/pkg/polymer/test/run.sh
+++ b/pkg/polymer/test/run.sh
@@ -16,8 +16,28 @@
 # set -x
 
 DIR=$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd )
+# Note: dartanalyzer and some tests needs to be run from the root directory
+pushd $DIR/.. > /dev/null
+
 export DART_FLAGS="--checked"
-TEST_PATTERN=$1
+
+# Search for the first argument that doesn't look like an option ('--foo')
+function first_non_option {
+  while [[ $# -gt 0 ]]; do
+    if [[ $1 != --* ]]; then # Note: --* is a regex
+      echo $1
+      return
+    fi
+    shift
+  done
+}
+
+TEST_PATTERN=$(first_non_option $@)
+
+SDK_DIR=$(cd ../../out/ReleaseIA32/dart-sdk/; pwd)
+package_root=$SDK_DIR/../packages
+dart="$SDK_DIR/bin/dart --package-root=$package_root"
+dartanalyzer="$SDK_DIR/bin/dartanalyzer --package-root=$package_root"
 
 function fail {
   return 1
@@ -51,15 +71,14 @@
 }
 
 if [[ ($TEST_PATTERN == "") ]]; then
-  # Note: dartanalyzer needs to be run from the root directory for proper path
-  # canonicalization.
-  pushd $DIR/.. > /dev/null
+  echo Analyzing analyzer for warnings or type errors
+  $dartanalyzer --hints --fatal-warnings --fatal-type-errors lib/dwc.dart
 
-  echo Analyzing compiler for warnings or type errors
-  dartanalyzer --hints --fatal-warnings --fatal-type-errors bin/dwc.dart
+  echo Analyzing deploy-compiler for warnings or type errors
+  $dartanalyzer --hints --fatal-warnings --fatal-type-errors lib/deploy.dart
 
   echo -e "\nAnalyzing runtime for warnings or type errors"
-  dartanalyzer --hints --fatal-warnings --fatal-type-errors lib/polymer.dart
+  $dartanalyzer --hints --fatal-warnings --fatal-type-errors lib/polymer.dart
 
   popd > /dev/null
 fi
@@ -68,8 +87,7 @@
 # TODO(jmesserly): bash and dart regexp might not be 100% the same. Ideally we
 # could do all the heavy lifting in Dart code, and keep this script as a thin
 # wrapper that sets `--enable-type-checks --enable-asserts`
-  for input in $DIR/../example/component/news/test/*_test.html \
-               $DIR/../../../samples/third_party/todomvc/test/*_test.html; do
+  for input in $DIR/../example/component/news/test/*_test.html; do
     if [[ ($TEST_PATTERN == "") || ($input =~ $TEST_PATTERN) ]]; then
       FILENAME=`basename $input`
       DIRNAME=`dirname $input`
@@ -77,7 +95,7 @@
         DIRNAME=`dirname $DIRNAME`
       fi
       echo -e -n "Checking diff for $FILENAME "
-      DUMP="$DIRNAME/out/$FILENAME.txt"
+      DUMP="test/data/out/example/test/$FILENAME.txt"
       EXPECTATION="$DIRNAME/expected/$FILENAME.txt"
 
       compare $EXPECTATION $DUMP
@@ -87,47 +105,26 @@
   fail
 }
 
-if [[ -e $DIR/data/input/example ]]; then
-  echo "WARNING: detected old data/input/example symlink."
-  echo "Removing it and rerunning pub install to fix broken example symlinks."
-  echo "See http://dartbug.com/9418 for more information."
-  echo "You should only see this message once."
-  if [[ -e $DIR/packages ]]; then
-    find . -name packages -type l | xargs rm
-  fi
-  rm $DIR/data/input/example
-  pushd $DIR/..
-  pub install
-  popd
-fi
-
-# TODO(jmesserly): dart:io fails if we run the Dart scripts with an absolute
-# path. So use pushd/popd to change the working directory.
 if [[ ($TEST_PATTERN == "") ]]; then
-  pushd $DIR/.. > /dev/null
   echo -e "\nTesting build.dart... "
-  dart $DART_FLAGS build.dart
+  $dart $DART_FLAGS build.dart
   # Run it the way the editor does. Hide stdout because it is in noisy machine
   # format. Show stderr in case something breaks.
   # NOTE: not using --checked because the editor doesn't use it, and to workaround
   # http://dartbug.com/9637
-  dart build.dart --machine --clean > /dev/null
-  dart build.dart --machine --full > /dev/null
-  dart build.dart --machine --changed ../../samples/third_party/todomvc/web/index.html > /dev/null
-  popd > /dev/null
+  $dart build.dart --machine --clean > /dev/null
+  $dart build.dart --machine --full > /dev/null
 fi
 
-pushd $DIR > /dev/null
 echo -e "\nRunning unit tests... "
-dart $DART_FLAGS run_all.dart $@ || compare_all
-popd > /dev/null
+$dart $DART_FLAGS test/run_all.dart $@ || compare_all
 
 # Run Dart analyzer to check that we're generating warning clean code.
-# It's a bit slow, so only do this for TodoMVC and html5_utils tests.
-OUT_PATTERN="$DIR/../../../third_party/samples/todomvc/test/out/test/*$TEST_PATTERN*_bootstrap.dart"
+# It's a bit slow, so only do this for one test.
+OUT_PATTERN="$DIR/../example/component/news/test/out/test/*$TEST_PATTERN*_bootstrap.dart"
 if [[ `ls $OUT_PATTERN 2>/dev/null` != "" ]]; then
   echo -e "\nAnalyzing generated code for warnings or type errors."
-  ls $OUT_PATTERN 2>/dev/null | dartanalyzer --package-root=packages \
+  ls $OUT_PATTERN 2>/dev/null | $dartanalyzer \
       --fatal-warnings --fatal-type-errors -batch
 fi
 
diff --git a/pkg/polymer/test/run_all.dart b/pkg/polymer/test/run_all.dart
index cc666ed..d11f475 100644
--- a/pkg/polymer/test/run_all.dart
+++ b/pkg/polymer/test/run_all.dart
@@ -15,12 +15,12 @@
 
 import 'css_test.dart' as css_test;
 import 'compiler_test.dart' as compiler_test;
-import 'paths_test.dart' as paths_test;
 import 'utils_test.dart' as utils_test;
+import 'transform/all_phases_test.dart' as all_phases_test;
 import 'transform/code_extractor_test.dart' as code_extractor_test;
 import 'transform/import_inliner_test.dart' as import_inliner_test;
+import 'transform/polyfill_injector_test.dart' as polyfill_injector_test;
 import 'transform/script_compactor_test.dart' as script_compactor_test;
-import 'transform/all_phases_test.dart' as all_phases_test;
 
 main() {
   var args = new Options().arguments;
@@ -36,11 +36,12 @@
 
   addGroup('compiler_test.dart', compiler_test.main);
   addGroup('css_test.dart', css_test.main);
-  addGroup('paths_test.dart', paths_test.main);
   addGroup('utils_test.dart', utils_test.main);
   addGroup('transform/code_extractor_test.dart', code_extractor_test.main);
   addGroup('transform/import_inliner_test.dart', import_inliner_test.main);
   addGroup('transform/script_compactor_test.dart', script_compactor_test.main);
+  addGroup('transform/polyfill_injector_test.dart',
+      polyfill_injector_test.main);
   addGroup('transform/all_phases_test.dart', all_phases_test.main);
 
   endToEndTests('data/unit/', 'data/out');
@@ -51,36 +52,15 @@
   // TODO(jmesserly): figure out why this fails in content_shell but works in
   // Dartium and Firefox when using the ShadowDOM polyfill.
   exampleTest('../example/component/news', ['--no-shadowdom']..addAll(args));
-
-  exampleTest('../../../samples/third_party/todomvc');
 }
 
-void exampleTest(String path, [List<String> args]) {
-  renderTests(path, '$path/test', '$path/test/expected', '$path/test/out',
-      arguments: args);
-}
-
-void cssCompileMangleTest(String path, String pattern,
-    [bool deleteDirectory = true]) {
-  renderTests(path, path, '$path/expected', '$path/out',
-      arguments: ['--css-mangle'], pattern: pattern,
-      deleteDir: deleteDirectory);
-}
-
-void cssCompilePolyFillTest(String path, String pattern, String cssReset,
-    [bool deleteDirectory = true]) {
-  var args = ['--no-css-mangle'];
-  if (cssReset != null) {
-    args.addAll(['--css-reset', '${path}/${cssReset}']);
-  }
-  renderTests(path, path, '$path/expected', '$path/out',
-      arguments: args, pattern: pattern, deleteDir: deleteDirectory);
-}
-
-void cssCompileShadowDOMTest(String path, String pattern,
-    [bool deleteDirectory = true]) {
-  var args = ['--no-css'];
-  renderTests(path, path, '$path/expected', '$path/out',
-      arguments: args, pattern: pattern,
-      deleteDir: deleteDirectory);
+void exampleTest(String path, [List args]) {
+  // TODO(sigmund): renderTests currently contatenates [path] with the out
+  // folder. This can be a problem with relative paths that go up (like todomvc
+  // above, which has '../../../'). If we continue running tests with
+  // test/run.sh, we should fix this. For now we work around this problem by
+  // using a long path 'data/out/example/test'. That way we avoid dumping output
+  // in the source-tree.
+  renderTests(path, '$path/test', '$path/test/expected',
+      'data/out/example/test', arguments: args);
 }
diff --git a/pkg/polymer/test/transform/all_phases_test.dart b/pkg/polymer/test/transform/all_phases_test.dart
index a644fe5..a3826fa 100644
--- a/pkg/polymer/test/transform/all_phases_test.dart
+++ b/pkg/polymer/test/transform/all_phases_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library polymer.test.transform.script_compactor_test;
+library polymer.test.transform.all_phases_test;
 
 import 'package:polymer/src/transform.dart';
 import 'package:unittest/compact_vm_config.dart';
@@ -34,10 +34,11 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body>'
+          '$SHADOW_DOM_TAG'
+          '$INTEROP_TAG'
           '<script type="application/dart" '
           'src="test.html_bootstrap.dart"></script>'
-          '<script type="text/javascript" '
-          'src="packages/browser/dart.js"></script>'
+          '<script src="packages/browser/dart.js"></script>'
           '</body></html>',
 
       'a|web/test.html_bootstrap.dart':
@@ -65,10 +66,11 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body>'
+          '$SHADOW_DOM_TAG'
+          '$INTEROP_TAG'
           '<script type="application/dart" '
           'src="test.html_bootstrap.dart"></script>'
-          '<script type="text/javascript" '
-          'src="packages/browser/dart.js"></script>'
+          '<script src="packages/browser/dart.js"></script>'
           '</body></html>',
 
       'a|web/test.html_bootstrap.dart':
@@ -102,11 +104,13 @@
       'a|web/a.dart': _sampleObservable('A', 'foo'),
     }, {
       'a|web/test.html':
-          '<!DOCTYPE html><html><head></head><body><div></div>'
+          '<!DOCTYPE html><html><head></head><body>'
+          '$SHADOW_DOM_TAG'
+          '$INTEROP_TAG'
+          '<div></div>'
           '<script type="application/dart" '
           'src="test.html_bootstrap.dart"></script>'
-          '<script type="text/javascript" '
-          'src="packages/browser/dart.js"></script>'
+          '<script src="packages/browser/dart.js"></script>'
           '</body></html>',
 
       'a|web/test.html_bootstrap.dart':
@@ -144,19 +148,20 @@
           '${_sampleObservable("C", "car")}</script>',
       'a|web/b.dart': _sampleObservable('B', 'bar'),
       'a|web/test2.html':
-          '<!DOCTYPE html><html><head>'
-          '</head><body><polymer-element>1'
+          '<!DOCTYPE html><html><head></head><body>'
+          '<polymer-element>1'
           '<script type="application/dart">'
           '${_sampleObservable("A", "foo")}</script>'
           '</polymer-element></html>',
     }, {
       'a|web/index.html':
           '<!DOCTYPE html><html><head></head><body>'
+          '$SHADOW_DOM_TAG'
+          '$INTEROP_TAG'
           '<polymer-element>1</polymer-element>'
           '<script type="application/dart" '
           'src="index.html_bootstrap.dart"></script>'
-          '<script type="text/javascript" '
-          'src="packages/browser/dart.js"></script>'
+          '<script src="packages/browser/dart.js"></script>'
           '</body></html>',
       'a|web/index.html_bootstrap.dart':
           '''library app_bootstrap;
@@ -183,6 +188,7 @@
 }
 
 String _sampleObservable(String className, String fieldName) => '''
+library ${className}_$fieldName;
 import 'package:observe/observe.dart';
 
 class $className extends ObservableBase {
@@ -192,6 +198,7 @@
 ''';
 
 String _sampleObservableOutput(String className, String fieldName) => '''
+library ${className}_$fieldName;
 import 'package:observe/observe.dart';
 
 class $className extends ChangeNotifierBase {
diff --git a/pkg/polymer/test/transform/code_extractor_test.dart b/pkg/polymer/test/transform/code_extractor_test.dart
index e62ec96..9619684 100644
--- a/pkg/polymer/test/transform/code_extractor_test.dart
+++ b/pkg/polymer/test/transform/code_extractor_test.dart
@@ -18,7 +18,7 @@
       'a|test.html': '<!DOCTYPE html><html></html>',
     });
 
-  testPhases('single script', [[new InlineCodeExtractor()]], {
+  testPhases('single script, no lib', [[new InlineCodeExtractor()]], {
       'a|test.html':
           '<!DOCTYPE html><html><head>'
           '<script type="application/dart">main() { }</script>',
@@ -29,14 +29,28 @@
           '</head><body></body></html>',
 
       'a|test.html.0.dart':
-          'main() { }',
+          'library test_html_0;\nmain() { }',
+    });
+
+  testPhases('single script, with lib', [[new InlineCodeExtractor()]], {
+      'a|test.html':
+          '<!DOCTYPE html><html><head>'
+          '<script type="application/dart">library f;\nmain() { }</script>',
+    }, {
+      'a|test.html':
+          '<!DOCTYPE html><html><head>'
+          '<script type="application/dart" src="test.html.0.dart"></script>'
+          '</head><body></body></html>',
+
+      'a|test.html.0.dart':
+          'library f;\nmain() { }',
     });
 
   testPhases('multiple scripts', [[new InlineCodeExtractor()]], {
       'a|test.html':
           '<!DOCTYPE html><html><head>'
-          '<script type="application/dart">main1() { }</script>'
-          '<script type="application/dart">main2() { }</script>',
+          '<script type="application/dart">library a1;\nmain1() { }</script>'
+          '<script type="application/dart">library a2;\nmain2() { }</script>',
     }, {
       'a|test.html':
           '<!DOCTYPE html><html><head>'
@@ -45,10 +59,10 @@
           '</head><body></body></html>',
 
       'a|test.html.0.dart':
-          'main1() { }',
+          'library a1;\nmain1() { }',
 
       'a|test.html.1.dart':
-          'main2() { }',
+          'library a2;\nmain2() { }',
     });
 
   testPhases('multiple deeper scripts', [[new InlineCodeExtractor()]], {
@@ -71,12 +85,12 @@
           '</div></div></body></html>',
 
       'a|test.html.0.dart':
-          'main1() { }',
+          'library test_html_0;\nmain1() { }',
 
       'a|test.html.1.dart':
-          'main2() { }',
+          'library test_html_1;\nmain2() { }',
 
       'a|test.html.2.dart':
-          'main3() { }',
+          'library test_html_2;\nmain3() { }',
     });
 }
diff --git a/pkg/polymer/test/transform/common.dart b/pkg/polymer/test/transform/common.dart
index c0fd47e..8114feb 100644
--- a/pkg/polymer/test/transform/common.dart
+++ b/pkg/polymer/test/transform/common.dart
@@ -95,3 +95,7 @@
   });
 }
 
+const SHADOW_DOM_TAG =
+    '<script src="packages/shadow_dom/shadow_dom.min.js"></script>\n';
+
+const INTEROP_TAG = '<script src="packages/browser/interop.js"></script>\n';
diff --git a/pkg/polymer/test/transform/polyfill_injector_test.dart b/pkg/polymer/test/transform/polyfill_injector_test.dart
new file mode 100644
index 0000000..0800325
--- /dev/null
+++ b/pkg/polymer/test/transform/polyfill_injector_test.dart
@@ -0,0 +1,46 @@
+// 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 polymer.test.transform.polyfill_injector_test;
+
+import 'package:polymer/src/transform.dart';
+import 'package:unittest/compact_vm_config.dart';
+
+import 'common.dart';
+
+void main() {
+  useCompactVMConfiguration();
+
+  testPhases('no changes', [[new PolyfillInjector()]], {
+      'a|web/test.html': '<!DOCTYPE html><html></html>',
+    }, {
+      'a|web/test.html': '<!DOCTYPE html><html></html>',
+    });
+
+  testPhases('with some script', [[new PolyfillInjector()]], {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head></head><body>'
+          '<script type="application/dart" src="a.dart"></script>',
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head></head><body>'
+          '$SHADOW_DOM_TAG$INTEROP_TAG'
+          '<script type="application/dart" src="a.dart"></script>'
+          '</body></html>',
+    });
+
+  testPhases('interop/shadow dom already present', [[new PolyfillInjector()]], {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head></head><body>'
+          '<script type="application/dart" src="a.dart"></script>'
+          '$SHADOW_DOM_TAG'
+          '$INTEROP_TAG',
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head></head><body>'
+          '<script type="application/dart" src="a.dart"></script>'
+          '$SHADOW_DOM_TAG'
+          '$INTEROP_TAG</body></html>',
+    });
+}
diff --git a/pkg/polymer/test/transform/script_compactor_test.dart b/pkg/polymer/test/transform/script_compactor_test.dart
index b271e3c..e12d379 100644
--- a/pkg/polymer/test/transform/script_compactor_test.dart
+++ b/pkg/polymer/test/transform/script_compactor_test.dart
@@ -27,8 +27,7 @@
           '<!DOCTYPE html><html><head></head><body>'
           '<script type="application/dart" '
           'src="test.html_bootstrap.dart"></script>'
-          '<script type="text/javascript" '
-          'src="packages/browser/dart.js"></script>'
+          '<script src="packages/browser/dart.js"></script>'
           '</body></html>',
 
       'a|test.html_bootstrap.dart':
@@ -61,8 +60,7 @@
           '<!DOCTYPE html><html><head></head><body><div></div>'
           '<script type="application/dart" '
           'src="test.html_bootstrap.dart"></script>'
-          '<script type="text/javascript" '
-          'src="packages/browser/dart.js"></script>'
+          '<script src="packages/browser/dart.js"></script>'
           '</body></html>',
 
       'a|test.html_bootstrap.dart':
diff --git a/pkg/polymer_expressions/lib/eval.dart b/pkg/polymer_expressions/lib/eval.dart
index dbf1f88..7ed7b5a 100644
--- a/pkg/polymer_expressions/lib/eval.dart
+++ b/pkg/polymer_expressions/lib/eval.dart
@@ -74,24 +74,30 @@
   bool isIndex = false;
   var filters = <Expression>[]; // reversed order for assignment
 
-  while (expr is BinaryOperator && expr.operator == '|') {
-    filters.add(expr.right);
-    expr = expr.left;
+  while (expr is BinaryOperator) {
+    BinaryOperator op = expr;
+    if (op.operator != '|') {
+      break;
+    }
+    filters.add(op.right);
+    expr = op.left;
   }
 
   if (expr is Identifier) {
     expression = empty();
-    property = expr.value;
+    Identifier ident = expr;
+    property = ident.value;
   } else if (expr is Invoke) {
-    expression = expr.receiver;
-    if (expr.method == '[]') {
-      if (expr.arguments[0] is! Literal) notAssignable();
-      Literal l = expr.arguments[0];
+    Invoke invoke = expr;
+    expression = invoke.receiver;
+    if (invoke.method == '[]') {
+      if (invoke.arguments[0] is! Literal) notAssignable();
+      Literal l = invoke.arguments[0];
       property = l.value;
       isIndex = true;
-    } else if (expr.method != null) {
-      if (expr.arguments != null) notAssignable();
-      property = expr.method;
+    } else if (invoke.method != null) {
+      if (invoke.arguments != null) notAssignable();
+      property = invoke.method;
     } else {
       notAssignable();
     }
@@ -418,7 +424,7 @@
     implements ParenthesizedExpression {
   final ExpressionObserver child;
 
-  ParenthesizedObserver(ExpressionObserver expr, this.child) : super(expr);
+  ParenthesizedObserver(ParenthesizedExpression expr, this.child) : super(expr);
 
 
   _updateSelf(Scope scope) {
diff --git a/pkg/polymer_expressions/lib/expression.dart b/pkg/polymer_expressions/lib/expression.dart
index 516e85b..0a5bb82 100644
--- a/pkg/polymer_expressions/lib/expression.dart
+++ b/pkg/polymer_expressions/lib/expression.dart
@@ -84,6 +84,8 @@
   String toString() => "{$entries}";
 
   bool operator ==(o) => o is MapLiteral && _listEquals(o.entries, entries);
+
+  int get hashCode => _hashList(entries);
 }
 
 class MapLiteralEntry extends Expression {
@@ -98,6 +100,8 @@
 
   bool operator ==(o) => o is MapLiteralEntry && o.key == key
       && o.entryValue == entryValue;
+
+  int get hashCode => _JenkinsSmiHash.hash2(key.hashCode, entryValue.hashCode);
 }
 
 class ParenthesizedExpression extends Expression {
@@ -140,6 +144,8 @@
 
   bool operator ==(o) => o is UnaryOperator && o.operator == operator
       && o.child == child;
+
+  int get hashCode => _JenkinsSmiHash.hash2(operator.hashCode, child.hashCode);
 }
 
 class BinaryOperator extends Expression {
@@ -155,6 +161,9 @@
 
   bool operator ==(o) => o is BinaryOperator && o.operator == operator
       && o.left == left && o.right == right;
+
+  int get hashCode => _JenkinsSmiHash.hash3(operator.hashCode, left.hashCode,
+      right.hashCode);
 }
 
 class InExpression extends Expression {
@@ -169,6 +178,8 @@
 
   bool operator ==(o) => o is InExpression && o.left == left
       && o.right == right;
+
+  int get hashCode => _JenkinsSmiHash.hash2(left.hashCode, right.hashCode);
 }
 
 /**
@@ -195,6 +206,9 @@
       && o.receiver == receiver
       && o.method == method
       && _listEquals(o.arguments, arguments);
+
+  int get hashCode => _JenkinsSmiHash.hash3(receiver.hashCode, method.hashCode,
+      _hashList(arguments));
 }
 
 bool _listEquals(List a, List b) {
@@ -205,4 +219,33 @@
     if (a[i] != b[i]) return false;
   }
   return true;
-}
\ No newline at end of file
+}
+
+int _hashList(List l) {
+  var hash = l.fold(0,
+      (h, item) => _JenkinsSmiHash.combine(h, item.hashCode));
+  return _JenkinsSmiHash.finish(hash);
+}
+
+class _JenkinsSmiHash {
+  // TODO: Bug 11617- This class should be optimized and standardized elsewhere.
+
+  static int combine(int hash, int value) {
+    hash = 0x1fffffff & (hash + value);
+    hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
+    return hash ^ (hash >> 6);
+  }
+
+  static int finish(int hash) {
+    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) <<  3));
+    hash = hash ^ (hash >> 11);
+    return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
+  }
+
+  static int hash2(a, b) => finish(combine(combine(0, a), b));
+
+  static int hash3(a, b, c) => finish(combine(combine(combine(0, a), b), c));
+
+  static int hash4(a, b, c, d) =>
+      finish(combine(combine(combine(combine(0, a), b), c), d));
+}
diff --git a/pkg/polymer_expressions/lib/parser.dart b/pkg/polymer_expressions/lib/parser.dart
index c02d656..cc06681 100644
--- a/pkg/polymer_expressions/lib/parser.dart
+++ b/pkg/polymer_expressions/lib/parser.dart
@@ -134,22 +134,16 @@
           return _astFactory.identifier('this');
         } else if (keyword == 'in') {
           return null;
-        } else {
-          throw new ArgumentError('unrecognized keyword: $keyword');
         }
-        break;
+        throw new ArgumentError('unrecognized keyword: $keyword');
       case IDENTIFIER_TOKEN:
         return _parseInvokeOrIdentifier();
-        break;
       case STRING_TOKEN:
         return _parseString();
-        break;
       case INTEGER_TOKEN:
         return _parseInteger();
-        break;
       case DECIMAL_TOKEN:
         return _parseDecimal();
-        break;
       case GROUPER_TOKEN:
         if (_token.value == '(') {
           return _parseParenthesized();
@@ -157,7 +151,6 @@
           return _parseMapLiteral();
         }
         return null;
-        break;
       default:
         return null;
     }
diff --git a/pkg/polymer_expressions/lib/tokenizer.dart b/pkg/polymer_expressions/lib/tokenizer.dart
index 4e03167..6d3f2c9 100644
--- a/pkg/polymer_expressions/lib/tokenizer.dart
+++ b/pkg/polymer_expressions/lib/tokenizer.dart
@@ -132,11 +132,11 @@
 
 int escape(int c) {
   switch (c) {
-    case _f: return _FF; break;
-    case _n: return _LF; break;
-    case _r: return _CR; break;
-    case _t: return _TAB; break;
-    case _v: return _VTAB; break;
+    case _f: return _FF;
+    case _n: return _LF;
+    case _r: return _CR;
+    case _t: return _TAB;
+    case _v: return _VTAB;
     default: return c;
   }
 }
diff --git a/pkg/serialization/test/serialization_test.dart b/pkg/serialization/test/serialization_test.dart
index 3cb5a75..83232c9 100644
--- a/pkg/serialization/test/serialization_test.dart
+++ b/pkg/serialization/test/serialization_test.dart
@@ -4,7 +4,7 @@
 
 library serialization_test;
 
-import 'dart:json' as json;
+import 'dart:convert';
 import 'package:unittest/unittest.dart';
 import 'package:serialization/serialization.dart';
 import 'package:serialization/src/serialization_helpers.dart';
@@ -366,8 +366,8 @@
   test("Straight JSON format", () {
     var s = new Serialization();
     var writer = s.newWriter(const SimpleJsonFormat());
-    var out = json.stringify(writer.write(a1));
-    var reconstituted = json.parse(out);
+    var out = JSON.encode(writer.write(a1));
+    var reconstituted = JSON.decode(out);
     expect(reconstituted.length, 4);
     expect(reconstituted[0], "Seattle");
   });
@@ -378,8 +378,8 @@
     var addressRule = s.addRuleFor(Address)..configureForMaps();
     var personRule = s.addRuleFor(Person)..configureForMaps();
     var writer = s.newWriter(const SimpleJsonFormat(storeRoundTripInfo: true));
-    var out = json.stringify(writer.write(p1));
-    var reconstituted = json.parse(out);
+    var out = JSON.encode(writer.write(p1));
+    var reconstituted = JSON.decode(out);
     var expected = {
       "name" : "Alice",
       "rank" : null,
diff --git a/pkg/source_maps/lib/builder.dart b/pkg/source_maps/lib/builder.dart
index be00c9e..12587cd 100644
--- a/pkg/source_maps/lib/builder.dart
+++ b/pkg/source_maps/lib/builder.dart
@@ -7,8 +7,8 @@
 
 // TODO(sigmund): add a builder for multi-section mappings.
 
-import 'dart:json' as json;
 import 'dart:collection';
+import 'dart:convert';
 
 import 'span.dart';
 import 'src/vlq.dart';
@@ -108,7 +108,7 @@
   }
 
   /// Encodes all mappings added to this builder as a json string.
-  String toJson(String fileUrl) => json.stringify(build(fileUrl));
+  String toJson(String fileUrl) => JSON.encode(build(fileUrl));
 
   /// Get the index of [value] in [map], or create one if it doesn't exist.
   int _indexOf(Map<String, int> map, String value) {
diff --git a/pkg/source_maps/lib/parser.dart b/pkg/source_maps/lib/parser.dart
index e293263..6b8bf37 100644
--- a/pkg/source_maps/lib/parser.dart
+++ b/pkg/source_maps/lib/parser.dart
@@ -5,7 +5,7 @@
 /// Contains the top-level function to parse source maps version 3.
 library source_maps.parser;
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'span.dart';
 import 'src/utils.dart';
@@ -15,7 +15,7 @@
 // TODO(sigmund): evaluate whether other maps should have the json parsed, or
 // the string represenation.
 Mapping parse(String jsonMap, {Map<String, Map> otherMaps}) =>
-  parseJson(json.parse(jsonMap), otherMaps: otherMaps);
+  parseJson(JSON.decode(jsonMap), otherMaps: otherMaps);
 
 /// Parses a source map directly from a json map object.
 Mapping parseJson(Map map, {Map<String, Map> otherMaps}) {
diff --git a/pkg/source_maps/test/builder_test.dart b/pkg/source_maps/test/builder_test.dart
index 7bf2ee4..8842c62 100644
--- a/pkg/source_maps/test/builder_test.dart
+++ b/pkg/source_maps/test/builder_test.dart
@@ -4,7 +4,7 @@
 
 library test.source_maps_test;
 
-import 'dart:json' as json;
+import 'dart:convert';
 import 'package:unittest/unittest.dart';
 import 'package:source_maps/source_maps.dart';
 import 'common.dart';
@@ -27,6 +27,6 @@
         ..addLocation(inputVar2.start, outputVar2.start, 'longVar2')
         ..addLocation(inputExpr.start, outputExpr.start, null))
         .toJson(output.url);
-    expect(str, json.stringify(EXPECTED_MAP));
+    expect(str, JSON.encode(EXPECTED_MAP));
   });
 }
diff --git a/pkg/source_maps/test/parser_test.dart b/pkg/source_maps/test/parser_test.dart
index 1c32cbd..c99acb2 100644
--- a/pkg/source_maps/test/parser_test.dart
+++ b/pkg/source_maps/test/parser_test.dart
@@ -4,7 +4,7 @@
 
 library test.parser_test;
 
-import 'dart:json' as json;
+import 'dart:convert';
 import 'package:unittest/unittest.dart';
 import 'package:source_maps/source_maps.dart';
 import 'common.dart';
@@ -19,7 +19,7 @@
   });
 
   test('parse + json', () {
-    var mapping = parse(json.stringify(EXPECTED_MAP));
+    var mapping = parse(JSON.encode(EXPECTED_MAP));
     check(outputVar1, mapping, inputVar1, false);
     check(outputVar2, mapping, inputVar2, false);
     check(outputFunction, mapping, inputFunction, false);
diff --git a/pkg/source_maps/test/printer_test.dart b/pkg/source_maps/test/printer_test.dart
index eaeae2a..fe27f76 100644
--- a/pkg/source_maps/test/printer_test.dart
+++ b/pkg/source_maps/test/printer_test.dart
@@ -4,7 +4,7 @@
 
 library test.printer_test;
 
-import 'dart:json' as json;
+import 'dart:convert';
 import 'package:unittest/unittest.dart';
 import 'package:source_maps/printer.dart';
 import 'package:source_maps/span.dart';
@@ -23,7 +23,7 @@
            ..mark(inputExpr)
            ..add('x + y;\n');
     expect(printer.text, OUTPUT);
-    expect(printer.map, json.stringify(EXPECTED_MAP));
+    expect(printer.map, JSON.encode(EXPECTED_MAP));
   });
 
   test('printer projecting marks', () {
@@ -90,7 +90,7 @@
              ..add('x + y;\n', span: inputExpr)
              ..build('output.dart');
       expect(printer.text, OUTPUT);
-      expect(printer.map, json.stringify(EXPECTED_MAP));
+      expect(printer.map, JSON.encode(EXPECTED_MAP));
     });
 
     test('nested use', () {
@@ -102,7 +102,7 @@
              ..add('x + y;\n', span: inputExpr)
              ..build('output.dart');
       expect(printer.text, OUTPUT);
-      expect(printer.map, json.stringify(EXPECTED_MAP));
+      expect(printer.map, JSON.encode(EXPECTED_MAP));
     });
 
     test('add indentation', () {
diff --git a/pkg/third_party/html5lib/lib/dom_parsing.dart b/pkg/third_party/html5lib/lib/dom_parsing.dart
index 91b37ec..363db7d 100644
--- a/pkg/third_party/html5lib/lib/dom_parsing.dart
+++ b/pkg/third_party/html5lib/lib/dom_parsing.dart
@@ -5,7 +5,7 @@
 library dom_parsing;
 
 import 'dart:math';
-import 'dart:utf' show codepointsToString;
+import 'package:utf/utf.dart' show codepointsToString;
 import 'dom.dart';
 
 /** A simple tree visitor for the DOM nodes. */
diff --git a/pkg/third_party/html5lib/lib/src/char_encodings.dart b/pkg/third_party/html5lib/lib/src/char_encodings.dart
index 610a8da..7fce8fd 100644
--- a/pkg/third_party/html5lib/lib/src/char_encodings.dart
+++ b/pkg/third_party/html5lib/lib/src/char_encodings.dart
@@ -2,7 +2,7 @@
 library char_encodings;
 
 import 'dart:collection';
-import 'dart:utf';
+import 'package:utf/utf.dart';
 
 // TODO(jmesserly): this function is conspicuously absent from dart:utf.
 /**
diff --git a/pkg/third_party/html5lib/lib/src/inputstream.dart b/pkg/third_party/html5lib/lib/src/inputstream.dart
index 29ee1dc..a3d6046 100644
--- a/pkg/third_party/html5lib/lib/src/inputstream.dart
+++ b/pkg/third_party/html5lib/lib/src/inputstream.dart
@@ -1,7 +1,7 @@
 library inputstream;
 
 import 'dart:collection';
-import 'dart:utf';
+import 'package:utf/utf.dart';
 import 'package:source_maps/span.dart' show SourceFile;
 import 'char_encodings.dart';
 import 'constants.dart';
diff --git a/pkg/third_party/html5lib/pubspec.yaml b/pkg/third_party/html5lib/pubspec.yaml
index 79a09be..cd968ae 100644
--- a/pkg/third_party/html5lib/pubspec.yaml
+++ b/pkg/third_party/html5lib/pubspec.yaml
@@ -4,6 +4,7 @@
 homepage: https://github.com/dart-lang/html5lib
 dependencies:
   source_maps: any
+  utf: any
 dev_dependencies:
   browser: any
   path: any
diff --git a/pkg/third_party/html5lib/test/parser_test.dart b/pkg/third_party/html5lib/test/parser_test.dart
index 0125634..060359c 100644
--- a/pkg/third_party/html5lib/test/parser_test.dart
+++ b/pkg/third_party/html5lib/test/parser_test.dart
@@ -1,7 +1,7 @@
 library parser_test;
 
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 import 'package:path/path.dart' as pathos;
 import 'package:unittest/unittest.dart';
 import 'package:html5lib/dom.dart';
@@ -114,11 +114,11 @@
 
 /** Extract the name for the test based on the test input data. */
 _nameFor(String input) {
-  // Using json.parse to unescape other unicode characters
+  // Using JSON.decode to unescape other unicode characters
   var escapeQuote = input
       .replaceAll(new RegExp('\\\\.'), '_')
       .replaceAll(new RegExp('\u0000'), '_')
       .replaceAll('"', '\\"')
       .replaceAll(new RegExp('[\n\r\t]'),'_');
-  return json.parse('"$escapeQuote"');
+  return JSON.decode('"$escapeQuote"');
 }
diff --git a/pkg/third_party/html5lib/test/tokenizer_test.dart b/pkg/third_party/html5lib/test/tokenizer_test.dart
index fc98012..637cc9a 100644
--- a/pkg/third_party/html5lib/test/tokenizer_test.dart
+++ b/pkg/third_party/html5lib/test/tokenizer_test.dart
@@ -2,10 +2,9 @@
 
 // Note: mirrors used to match the getattr usage in the original test
 import 'dart:async';
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 import 'dart:mirrors';
-import 'dart:utf';
 import 'package:path/path.dart' as pathos;
 import 'package:unittest/unittest.dart';
 import 'package:html5lib/src/char_encodings.dart';
@@ -13,6 +12,7 @@
 import 'package:html5lib/src/token.dart';
 import 'package:html5lib/src/tokenizer.dart';
 import 'package:html5lib/src/utils.dart';
+import 'package:utf/utf.dart';
 import 'support.dart';
 
 class TokenizerTestParser {
@@ -207,10 +207,10 @@
 }
 
 Map unescape(Map testInfo) {
-  // TODO(sigmundch,jmesserly): we currently use json.parse to unescape the
+  // TODO(sigmundch,jmesserly): we currently use JSON.decode to unescape the
   // unicode characters in the string, we should use a decoding that works with
   // any control characters.
-  decode(inp) => inp == '\u0000' ? inp : json.parse('"$inp"');
+  decode(inp) => inp == '\u0000' ? inp : JSON.decode('"$inp"');
 
   testInfo["input"] = decode(testInfo["input"]);
   for (var token in testInfo["output"]) {
@@ -248,7 +248,7 @@
     if (!path.endsWith('.test')) continue;
 
     var text = new File(path).readAsStringSync();
-    var tests = json.parse(text);
+    var tests = JSON.decode(text);
     var testName = pathos.basenameWithoutExtension(path);
     var testList = tests['tests'];
     if (testList == null) continue;
diff --git a/pkg/unittest/lib/interactive_html_config.dart b/pkg/unittest/lib/interactive_html_config.dart
index 27791ee..16a69a0 100644
--- a/pkg/unittest/lib/interactive_html_config.dart
+++ b/pkg/unittest/lib/interactive_html_config.dart
@@ -19,7 +19,7 @@
 
 import 'dart:html';
 import 'dart:async';
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:stack_trace/stack_trace.dart';
 
@@ -164,7 +164,7 @@
     DateTime end = new DateTime.now();
     int elapsed = end.difference(_testStarts[testCase.id]).inMilliseconds;
     if (testCase.stackTrace != null) {
-      var message = json.stringify(testCase.stackTrace.frames.map((frame) {
+      var message = JSON.encode(testCase.stackTrace.frames.map((frame) {
         return <String, dynamic>{
           "uri": frame.uri.toString(),
           "line": frame.line,
@@ -244,7 +244,7 @@
     if (msg.messageType == _Message.LOG) {
       logMessage(e.data);
     } else if (msg.messageType == _Message.STACK) {
-      _stack = new Trace(json.parse(msg.body).map((frame) {
+      _stack = new Trace(JSON.decode(msg.body).map((frame) {
         return new Frame(
             Uri.parse(frame['uri']),
             frame['line'],
diff --git a/pkg/unittest/lib/src/configuration.dart b/pkg/unittest/lib/src/configuration.dart
index c9ec1c0..1862bf5 100644
--- a/pkg/unittest/lib/src/configuration.dart
+++ b/pkg/unittest/lib/src/configuration.dart
@@ -28,6 +28,9 @@
    */
   bool get autoStart => true;
 
+  /// How long a [TestCase] can run before it is considered an error.
+  Duration get timeout => const Duration(seconds: 20);
+
   /**
    * Called as soon as the unittest framework becomes initialized. This is done
    * even before tests are added to the test framework. It might be used to
diff --git a/pkg/unittest/lib/src/simple_configuration.dart b/pkg/unittest/lib/src/simple_configuration.dart
index 1056ad3..20172c3 100644
--- a/pkg/unittest/lib/src/simple_configuration.dart
+++ b/pkg/unittest/lib/src/simple_configuration.dart
@@ -52,6 +52,9 @@
   // we do with this List.
   final _testLogBuffer = <Pair<String, StackTrace>>[];
 
+  /// How long a [TestCase] can run before it is considered an error.
+  Duration timeout = const Duration(seconds: 20);
+
   /**
    * The constructor sets up a failure handler for [expect] that redirects
    * [expect] failures to [onExpectFailure].
diff --git a/pkg/unittest/lib/test_controller.js b/pkg/unittest/lib/test_controller.js
index 439b703..fe5cf93 100644
--- a/pkg/unittest/lib/test_controller.js
+++ b/pkg/unittest/lib/test_controller.js
@@ -23,7 +23,15 @@
   window.postMessage('unittest-suite-external-error', '*');
 };
 
-if (navigator.webkitStartDart) {
+// Start Dartium/content_shell, unless we are waiting for HTML Imports to load.
+// HTML Imports allows a document to link to other HTMLs documents via
+// <link rel=import>. It also allows for those other documents to contain
+// <script> tags, which must be run before scripts on the main page.
+// We have package:html_import to polyfill this feature, and it will handle
+// starting Dartium/content_shell in that case. HTML Imports is used by Polymer,
+// but it could be used by itself too. See the specification:
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html
+if (navigator.webkitStartDart && !window.HTMLImports) {
   navigator.webkitStartDart();
 }
 
@@ -152,6 +160,7 @@
     window.postMessage(msg, '*');
     return;
   }
+  if (typeof console === 'object') console.warn(msg);
   var pre = document.createElement("pre");
   pre.appendChild(document.createTextNode(String(msg)));
   document.body.appendChild(pre);
diff --git a/pkg/unittest/lib/unittest.dart b/pkg/unittest/lib/unittest.dart
index f6e83c2..f3b4e44 100644
--- a/pkg/unittest/lib/unittest.dart
+++ b/pkg/unittest/lib/unittest.dart
@@ -752,7 +752,18 @@
   } else {
     final testCase = testCases[_currentTestCaseIndex];
     var f = _guardAsync(testCase._run, null, testCase);
+    Timer timer;
+    try {
+      final Duration timeout = unittestConfiguration.timeout;
+      timer = new Timer(timeout, () {
+        testCase.error("Test timed out after ${timeout.inSeconds} seconds.");
+      });
+    } on UnsupportedError catch (e) {
+      if (e.message != "Timer greater than 0.") rethrow;
+      // Support running on d8 and jsshell which don't support timers.
+    }
     f.whenComplete(() {
+      if (timer != null) timer.cancel();
       var now = new DateTime.now().millisecondsSinceEpoch;
       if ((now - _lastBreath) >= BREATH_INTERVAL) {
         _lastBreath = now;
diff --git a/pkg/unittest/test/matchers_minified_test.dart b/pkg/unittest/test/matchers_minified_test.dart
index 787c9e1..0edd3e3 100644
--- a/pkg/unittest/test/matchers_minified_test.dart
+++ b/pkg/unittest/test/matchers_minified_test.dart
@@ -52,8 +52,9 @@
     });
 
     test('throwsNoSuchMethodError', () {
-      shouldPass(() { throw new NoSuchMethodError(null, '', null, null); },
-          throwsNoSuchMethodError);
+      shouldPass(() {
+        throw new NoSuchMethodError(null, const Symbol(''), null, null);
+      }, throwsNoSuchMethodError);
       shouldFail(() { throw new Exception(); },
           throwsNoSuchMethodError,
           matches(
diff --git a/pkg/unittest/test/matchers_unminified_test.dart b/pkg/unittest/test/matchers_unminified_test.dart
index 8a1b005..3d7c322 100644
--- a/pkg/unittest/test/matchers_unminified_test.dart
+++ b/pkg/unittest/test/matchers_unminified_test.dart
@@ -51,8 +51,9 @@
     });
 
     test('throwsNoSuchMethodError', () {
-      shouldPass(() { throw new NoSuchMethodError(null, '', null, null); },
-          throwsNoSuchMethodError);
+      shouldPass(() {
+          throw new NoSuchMethodError(null, const Symbol(''), null, null);
+      }, throwsNoSuchMethodError);
       shouldFail(() { throw new Exception(); },
           throwsNoSuchMethodError,
           matches(
diff --git a/pkg/unittest/test/missing_tick_test.dart b/pkg/unittest/test/missing_tick_test.dart
new file mode 100644
index 0000000..7b42fab
--- /dev/null
+++ b/pkg/unittest/test/missing_tick_test.dart
@@ -0,0 +1,14 @@
+// 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.
+
+import 'package:unittest/unittest.dart';
+
+// TODO(gram): Convert to a shouldFail passing test.
+main() {
+  group('Broken', () {
+    test('test that should time out', () {
+      expectAsync0(() {});
+    });
+  });
+}
diff --git a/pkg/yaml/lib/yaml.dart b/pkg/yaml/lib/yaml.dart
index 85861d5..fa52861 100644
--- a/pkg/yaml/lib/yaml.dart
+++ b/pkg/yaml/lib/yaml.dart
@@ -29,13 +29,13 @@
 ///     }
 ///
 /// This library currently doesn't support dumping to YAML. You should use
-/// `stringify` from `dart:json` instead:
+/// `JSON.encode` from `dart:convert` instead:
 ///
-///     import 'dart:json' as json;
+///     import 'dart:convert';
 ///     import 'package:yaml/yaml.dart';
 ///     main() {
 ///       var doc = loadYaml("YAML: YAML Ain't Markup Language");
-///       print(json.stringify(doc));
+///       print(JSON.encode(doc));
 ///     }
 ///
 /// [pub]: http://pub.dartlang.org
diff --git a/runtime/bin/dbg_message.cc b/runtime/bin/dbg_message.cc
index aaf4f90..739e82c 100644
--- a/runtime/bin/dbg_message.cc
+++ b/runtime/bin/dbg_message.cc
@@ -648,9 +648,8 @@
   Dart_Handle target;
 
   if (msg_parser.HasParam("libraryId")) {
-    in_msg->SendErrorReply(msg_id,
-                           "libararyId evaluation target not supported");
-    return false;
+    intptr_t lib_id = msg_parser.GetIntParam("libraryId");
+    target = Dart_GetLibraryFromId(lib_id);
   } else if (msg_parser.HasParam("classId")) {
     intptr_t cls_id = msg_parser.GetIntParam("classId");
     target = Dart_GetClassFromId(cls_id);
diff --git a/runtime/bin/vmservice/running_isolates.dart b/runtime/bin/vmservice/running_isolates.dart
index 945e4f2..5b38223 100644
--- a/runtime/bin/vmservice/running_isolates.dart
+++ b/runtime/bin/vmservice/running_isolates.dart
@@ -35,7 +35,7 @@
     });
     result['type'] = 'IsolateList';
     result['members'] = members;
-    request.setResponse(JSON.stringify(result));
+    request.setResponse(JSON.encode(result));
   }
 
   Future route(ServiceRequest request) {
diff --git a/runtime/bin/vmservice/service_request.dart b/runtime/bin/vmservice/service_request.dart
index 04bf397..4724d7c 100644
--- a/runtime/bin/vmservice/service_request.dart
+++ b/runtime/bin/vmservice/service_request.dart
@@ -36,7 +36,7 @@
   }
 
   void setErrorResponse(String error) {
-    _response = JSON.stringify({
+    _response = JSON.encode({
         'type': 'error',
         'msg': error,
         'pathSegments': pathSegments,
diff --git a/runtime/bin/vmservice/vmservice.dart b/runtime/bin/vmservice/vmservice.dart
index 042d467..681eff1 100644
--- a/runtime/bin/vmservice/vmservice.dart
+++ b/runtime/bin/vmservice/vmservice.dart
@@ -5,7 +5,7 @@
 library vmservice;
 
 import 'dart:async';
-import 'dart:json' as JSON;
+import "dart:convert";
 import 'dart:isolate';
 import 'dart:typed_data';
 
diff --git a/runtime/include/dart_debugger_api.h b/runtime/include/dart_debugger_api.h
index 13b19ac..50bf9f0 100755
--- a/runtime/include/dart_debugger_api.h
+++ b/runtime/include/dart_debugger_api.h
@@ -598,6 +598,16 @@
 
 
 /**
+ * Returns a handle to the library \library_id.
+ *
+ * Requires there to be a current isolate.
+ *
+ * \return A library handle if the id is valid.
+ */
+DART_EXPORT Dart_Handle Dart_GetLibraryFromId(intptr_t library_id);
+
+
+/**
  * Returns an array containing all variable names and values of
  * the given library \library_id.
  *
diff --git a/runtime/lib/bool_patch.dart b/runtime/lib/bool_patch.dart
index d5594e2..60b5596 100644
--- a/runtime/lib/bool_patch.dart
+++ b/runtime/lib/bool_patch.dart
@@ -9,8 +9,4 @@
   int get hashCode {
     return this ? 1231 : 1237;
   }
-
-  String toString() {
-  	return this ? "true" : "false";
-  }
 }
diff --git a/runtime/lib/collection_patch.dart b/runtime/lib/collection_patch.dart
index e1cc262..869a70b 100644
--- a/runtime/lib/collection_patch.dart
+++ b/runtime/lib/collection_patch.dart
@@ -3,114 +3,275 @@
 // BSD-style license that can be found in the LICENSE file.
 
 patch class HashMap<K, V> {
-  final _HashMapTable<K, V> _hashTable = new _HashMapTable<K, V>();
+  static const int _INITIAL_CAPACITY = 8;
+  static const int _MODIFICATION_COUNT_MASK = 0x3fffffff;
 
-  /* patch */ HashMap() {
-    _hashTable._container = this;
-  }
+  int _elementCount = 0;
+  List<_HashMapEntry> _buckets = new List(_INITIAL_CAPACITY);
+  int _modificationCount = 0;
+
+  /* patch */ HashMap();
+
+  /* patch */ int get length => _elementCount;
+  /* patch */ bool get isEmpty => _elementCount == 0;
+  /* patch */ bool get isNotEmpty => _elementCount != 0;
+
+  /* patch */ Iterable<K> get keys => new _HashMapKeyIterable<K>(this);
+  /* patch */ Iterable<V> get values => new _HashMapValueIterable<V>(this);
 
   /* patch */ bool containsKey(Object key) {
-    return _hashTable._get(key) >= 0;
+    int hashCode = key.hashCode;
+    List buckets = _buckets;
+    int index = hashCode & (buckets.length - 1);
+    _HashMapEntry entry = buckets[index];
+    while (entry != null) {
+      if (hashCode == entry.hashCode && entry.key == key) return true;
+      entry = entry.next;
+    }
+    return false;
   }
 
   /* patch */ bool containsValue(Object value) {
-    List table = _hashTable._table;
-    int entrySize = _hashTable._entrySize;
-    for (int offset = 0; offset < table.length; offset += entrySize) {
-      if (!_hashTable._isFree(table[offset]) &&
-          _hashTable._value(offset) == value) {
-        return true;
+    List buckets = _buckets;
+    int length = buckets.length;
+    for (int i = 0; i < length; i++) {
+      _HashMapEntry entry = buckets[i];
+      while (entry != null) {
+        if (entry.value == value) return true;
+        entry = entry.next;
       }
     }
     return false;
   }
 
-  /* patch */ void addAll(Map<K, V> other) {
-    other.forEach((K key, V value) {
-      int offset = _hashTable._put(key);
-      _hashTable._setValue(offset, value);
-      _hashTable._checkCapacity();
-    });
-  }
-
-  /* patch */ V operator [](Object key) {
-    int offset = _hashTable._get(key);
-    if (offset >= 0) return _hashTable._value(offset);
+  /* patch */ V operator[](Object key) {
+    int hashCode = key.hashCode;
+    List buckets = _buckets;
+    int index = hashCode & (buckets.length - 1);
+    _HashMapEntry entry = buckets[index];
+    while (entry != null) {
+      if (hashCode == entry.hashCode && entry.key == key) {
+        return entry.value;
+      }
+      entry = entry.next;
+    }
     return null;
   }
 
   /* patch */ void operator []=(K key, V value) {
-    int offset = _hashTable._put(key);
-    _hashTable._setValue(offset, value);
-    _hashTable._checkCapacity();
+    int hashCode = key.hashCode;
+    List buckets = _buckets;
+    int length = buckets.length;
+    int index = hashCode & (length - 1);
+    _HashMapEntry entry = buckets[index];
+    while (entry != null) {
+      if (hashCode == entry.hashCode && entry.key == key) {
+        entry.value = value;
+        return;
+      }
+      entry = entry.next;
+    }
+    _addEntry(buckets, index, length, key, value, hashCode);
   }
 
   /* patch */ V putIfAbsent(K key, V ifAbsent()) {
-    int offset = _hashTable._probeForAdd(_hashTable._hashCodeOf(key), key);
-    Object entry = _hashTable._table[offset];
-    if (!_hashTable._isFree(entry)) {
-      return _hashTable._value(offset);
-    }
-    int modificationCount = _hashTable._modificationCount;
-    V value = ifAbsent();
-    if (modificationCount == _hashTable._modificationCount) {
-      _hashTable._setKey(offset, key);
-      _hashTable._setValue(offset, value);
-      if (entry == null) {
-        _hashTable._entryCount++;
-        _hashTable._checkCapacity();
-      } else {
-        assert(identical(entry, _TOMBSTONE));
-        _hashTable._deletedCount--;
+    int hashCode = key.hashCode;
+    List buckets = _buckets;
+    int length = buckets.length;
+    int index = hashCode & (length - 1);
+    _HashMapEntry entry = buckets[index];
+    while (entry != null) {
+      if (hashCode == entry.hashCode && entry.key == key) {
+        return entry.value;
       }
-      _hashTable._recordModification();
+      entry = entry.next;
+    }
+    int stamp = _modificationCount;
+    V value = ifAbsent();
+    if (stamp == _modificationCount) {
+      _addEntry(buckets, index, length, key, value, hashCode);
     } else {
-      // The table might have changed, so we can't trust [offset] any more.
-      // Do another lookup before setting the value.
-      offset = _hashTable._put(key);
-      _hashTable._setValue(offset, value);
-      _hashTable._checkCapacity();
+      this[key] = value;
     }
     return value;
   }
 
-  /* patch */ V remove(Object key) {
-    int offset = _hashTable._remove(key);
-    if (offset < 0) return null;
-    V oldValue = _hashTable._value(offset);
-    _hashTable._setValue(offset, null);
-    _hashTable._checkCapacity();
-    return oldValue;
-  }
-
-  /* patch */ void clear() {
-    _hashTable._clear();
+  /* patch */ void addAll(Map<K, V> other) {
+    other.forEach((K key, V value) {
+      this[key] = value;
+    });
   }
 
   /* patch */ void forEach(void action(K key, V value)) {
-    int modificationCount = _hashTable._modificationCount;
-    List table = _hashTable._table;
-    int entrySize = _hashTable._entrySize;
-    for (int offset = 0; offset < table.length; offset += entrySize) {
-      Object entry = table[offset];
-      if (!_hashTable._isFree(entry)) {
-        K key = identical(entry, _NULL) ? null : entry;
-        V value = _hashTable._value(offset);
-        action(key, value);
-        _hashTable._checkModification(modificationCount);
+    int stamp = _modificationCount;
+    List buckets = _buckets;
+    int length = buckets.length;
+    for (int i = 0; i < length; i++) {
+      _HashMapEntry entry = buckets[i];
+      while (entry != null) {
+        action(entry.key, entry.value);
+        if (stamp != _modificationCount) {
+          throw new ConcurrentModificationError(this);
+        }
+        entry = entry.next;
       }
     }
   }
 
-  /* patch */ Iterable<K> get keys => new _HashTableKeyIterable<K>(_hashTable);
-  /* patch */ Iterable<V> get values =>
-      new _HashTableValueIterable<V>(_hashTable, _HashMapTable._VALUE_INDEX);
+  /* patch */ V remove(Object key) {
+    int hashCode = key.hashCode;
+    List buckets = _buckets;
+    int index = hashCode & (buckets.length - 1);
+    _HashMapEntry entry = buckets[index];
+    _HashMapEntry previous = null;
+    while (entry != null) {
+      _HashMapEntry next = entry.next;
+      if (hashCode == entry.hashCode && entry.key == key) {
+        if (previous == null) {
+          buckets[index] = next;
+        } else {
+          previous.next = next;
+        }
+        _elementCount--;
+        _modificationCount =
+            (_modificationCount + 1) & _MODIFICATION_COUNT_MASK;
+        return entry.value;
+      }
+      previous = entry;
+      entry = next;
+    }
+    return null;
+  }
 
-  /* patch */ int get length => _hashTable._elementCount;
+  /* patch */ void clear() {
+    _elementCount = 0;
+    _buckets = new List(_INITIAL_CAPACITY);
+    _modificationCount = (_modificationCount + 1) & _MODIFICATION_COUNT_MASK;
+  }
 
-  /* patch */ bool get isEmpty => _hashTable._elementCount == 0;
+  void _addEntry(List buckets, int index, int length,
+                 K key, V value, int hashCode) {
+    _HashMapEntry entry =
+        new _HashMapEntry(key, value, hashCode, buckets[index]);
+    buckets[index] = entry;
+    int newElements = _elementCount + 1;
+    _elementCount = newElements;
+    // If we end up with more than 75% non-empty entries, we
+    // resize the backing store.
+    if ((newElements << 2) > ((length << 1) + length)) _resize();
+    _modificationCount = (_modificationCount + 1) & _MODIFICATION_COUNT_MASK;
+  }
 
-  /* patch */ bool get isNotEmpty => !isEmpty;
+  void _resize() {
+    List oldBuckets = _buckets;
+    int oldLength = oldBuckets.length;
+    int newLength = oldLength << 1;
+    List newBuckets = new List(newLength);
+    for (int i = 0; i < oldLength; i++) {
+      _HashMapEntry entry = oldBuckets[i];
+      while (entry != null) {
+        _HashMapEntry next = entry.next;
+        int hashCode = entry.hashCode;
+        int index = hashCode & (newLength - 1);
+        entry.next = newBuckets[index];
+        newBuckets[index] = entry;
+        entry = next;
+      }
+    }
+    _buckets = newBuckets;
+  }
+}
+
+class _HashMapEntry {
+  final key;
+  var value;
+  final int hashCode;
+  _HashMapEntry next;
+  _HashMapEntry(this.key, this.value, this.hashCode, this.next);
+}
+
+abstract class _HashMapIterable<E> extends IterableBase<E> {
+  final HashMap _map;
+  _HashMapIterable(this._map);
+  int get length => _map.length;
+  bool get isEmpty => _map.isEmpty;
+  bool get isNotEmpty => _map.isNotEmpty;
+}
+
+class _HashMapKeyIterable<K> extends _HashMapIterable<K> {
+  _HashMapKeyIterable(HashMap map) : super(map);
+  Iterator<K> get iterator => new _HashMapKeyIterator<K>(_map);
+  bool contains(K key) => _map.containsKey(key);
+  void forEach(void action(K key)) {
+    _map.forEach((K key, _) {
+      action(key);
+    });
+  }
+}
+
+class _HashMapValueIterable<V> extends _HashMapIterable<V> {
+  _HashMapValueIterable(HashMap map) : super(map);
+  Iterator<V> get iterator => new _HashMapValueIterator<V>(_map);
+  bool contains(V value) => _map.containsValue(value);
+  void forEach(void action(V value)) {
+    _map.forEach((_, V value) {
+      action(value);
+    });
+  }
+}
+
+abstract class _HashMapIterator<E> implements Iterator<E> {
+  final HashMap _map;
+  final int _stamp;
+
+  int _index = 0;
+  _HashMapEntry _entry;
+
+  _HashMapIterator(HashMap map)
+     : _map = map, _stamp = map._modificationCount;
+
+  bool moveNext() {
+    if (_stamp != _map._modificationCount) {
+      throw new ConcurrentModificationError(_map);
+    }
+    _HashMapEntry entry = _entry;
+    if (entry != null) {
+      _HashMapEntry next = entry.next;
+      if (next != null) {
+        _entry = next;
+        return true;
+      }
+      _entry = null;
+    }
+    List buckets = _map._buckets;
+    int length = buckets.length;
+    for (int i = _index; i < length; i++) {
+      entry = buckets[i];
+      if (entry != null) {
+        _index = i + 1;
+        _entry = entry;
+        return true;
+      }
+    }
+    _index = length;
+    return false;
+  }
+}
+
+class _HashMapKeyIterator<K> extends _HashMapIterator<K> {
+  _HashMapKeyIterator(HashMap map) : super(map);
+  K get current {
+    _HashMapEntry entry = _entry;
+    return (entry == null) ? null : entry.key;
+  }
+}
+
+class _HashMapValueIterator<V> extends _HashMapIterator<V> {
+  _HashMapValueIterator(HashMap map) : super(map);
+  V get current {
+    _HashMapEntry entry = _entry;
+    return (entry == null) ? null : entry.value;
+  }
 }
 
 patch class HashSet<E> {
@@ -193,119 +354,264 @@
   }
 }
 
+class _LinkedHashMapEntry extends _HashMapEntry {
+  var _nextEntry;
+  var _previousEntry;
+  _LinkedHashMapEntry(key, value, int hashCode, _LinkedHashMapEntry next,
+                      this._previousEntry, this._nextEntry)
+      : super(key, value, hashCode, next) {
+    _previousEntry._nextEntry = this;
+    _nextEntry._previousEntry = this;
+  }
+}
+
+class _LinkedHashMapKeyIterable<K> extends IterableBase<K> {
+  LinkedHashMap<K, dynamic> _map;
+  _LinkedHashMapKeyIterable(this._map);
+  Iterator<K> get iterator => new _LinkedHashMapKeyIterator<K>(_map);
+  bool contains(K key) => _map.containsKey(key);
+  bool get isEmpty => _map.isEmpty;
+  bool get isNotEmpty => _map.isNotEmpty;
+  int get length => _map.length;
+}
+
+class _LinkedHashMapValueIterable<V> extends IterableBase<V> {
+  LinkedHashMap<dynamic, V> _map;
+  _LinkedHashMapValueIterable(this._map);
+  Iterator<K> get iterator => new _LinkedHashMapValueIterator<V>(_map);
+  bool contains(V value) => _map.containsValue(value);
+  bool get isEmpty => _map.isEmpty;
+  bool get isNotEmpty => _map.isNotEmpty;
+  int get length => _map.length;
+}
+
+abstract class _LinkedHashMapIterator<T> implements Iterator<T> {
+  final _LinkedHashMap _map;
+  var _next;
+  T _current;
+  int _modificationCount;
+  _LinkedHashMapIterator(_LinkedHashMap map)
+      : _map = map,
+        _current = null,
+        _next = map._nextEntry,
+        _modificationCount = map._modificationCount;
+
+  bool moveNext() {
+    if (_modificationCount != _map._modificationCount) {
+      throw new ConcurrentModificationError(_map);
+    }
+    if (identical(_map, _next)) {
+      _current = null;
+      return false;
+    }
+    _LinkedHashMapEntry entry = _next;
+    _next = entry._nextEntry;
+    _current = _getValue(entry);
+    return true;
+  }
+
+  T _getValue(_LinkedHashMapEntry entry);
+
+  T get current => _current;
+}
+
+class _LinkedHashMapKeyIterator<K> extends _LinkedHashMapIterator<K> {
+  _LinkedHashMapKeyIterator(_LinkedHashMap map) : super(map);
+  K _getValue(_LinkedHashMapEntry entry) => entry.key;
+}
+
+class _LinkedHashMapValueIterator<V> extends _LinkedHashMapIterator<V> {
+  _LinkedHashMapValueIterator(_LinkedHashMap map) : super(map);
+  V _getValue(_LinkedHashMapEntry entry) => entry.value;
+}
+
+
 /**
  * A hash-based map that iterates keys and values in key insertion order.
  */
 patch class LinkedHashMap<K, V> {
-  final _LinkedHashMapTable _hashTable;
+  static const int _INITIAL_CAPACITY = 8;
+  static const int _MODIFICATION_COUNT_MASK = 0x3fffffff;
 
-  /* patch */ LinkedHashMap() : _hashTable = new _LinkedHashMapTable<K, V>() {
-    _hashTable._container = this;
+  int _elementCount = 0;
+  List<_HashMapEntry> _buckets = new List(_INITIAL_CAPACITY);
+  int _modificationCount = 0;
+
+  var _nextEntry;
+  var _previousEntry;
+
+  /* patch */ LinkedHashMap() {
+    _nextEntry = _previousEntry = this;
   }
 
+  /* patch */ int get length => _elementCount;
+  /* patch */ bool get isEmpty => _elementCount == 0;
+  /* patch */ bool get isNotEmpty => _elementCount != 0;
+
+  /* patch */ Iterable<K> get keys => new _LinkedHashMapKeyIterable<K>(this);
+  /* patch */ Iterable<V> get values => new _LinkedHashMapValueIterable<V>(this);
+
   /* patch */ bool containsKey(Object key) {
-    return _hashTable._get(key) >= 0;
-  }
-
-  /* patch */ bool containsValue(Object value) {
-    int modificationCount = _hashTable._modificationCount;
-    for (int offset = _hashTable._next(_LinkedHashTable._HEAD_OFFSET);
-         offset != _LinkedHashTable._HEAD_OFFSET;
-         offset = _hashTable._next(offset)) {
-      if (_hashTable._value(offset) == value) {
-        return true;
-      }
-      // The == call may modify the table.
-      _hashTable._checkModification(modificationCount);
+    int hashCode = key.hashCode;
+    List buckets = _buckets;
+    int index = hashCode & (buckets.length - 1);
+    _HashMapEntry entry = buckets[index];
+    while (entry != null) {
+      if (hashCode == entry.hashCode && entry.key == key) return true;
+      entry = entry.next;
     }
     return false;
   }
 
-  /* patch */ void addAll(Map<K, V> other) {
-    other.forEach((K key, V value) {
-      int offset = _hashTable._put(key);
-      _hashTable._setValue(offset, value);
-      _hashTable._checkCapacity();
-    });
+  /* patch */ bool containsValue(Object value) {
+    var cursor = _nextEntry;
+    int modificationCount = _modificationCount;
+    while (!identical(cursor, this)) {
+      _HashMapEntry entry = cursor;
+      if (entry.value == value) return true;
+      cursor = cursor._nextEntry;
+    }
+    return false;
   }
 
-  /* patch */ V operator [](Object key) {
-    int offset = _hashTable._get(key);
-    if (offset >= 0) return _hashTable._value(offset);
+  /* patch */ V operator[](Object key) {
+    int hashCode = key.hashCode;
+    List buckets = _buckets;
+    int index = hashCode & (buckets.length - 1);
+    _HashMapEntry entry = buckets[index];
+    while (entry != null) {
+      if (hashCode == entry.hashCode && entry.key == key) {
+        return entry.value;
+      }
+      entry = entry.next;
+    }
     return null;
   }
 
   /* patch */ void operator []=(K key, V value) {
-    int offset = _hashTable._put(key);
-    _hashTable._setValue(offset, value);
-    _hashTable._checkCapacity();
+    int hashCode = key.hashCode;
+    List buckets = _buckets;
+    int length = buckets.length;
+    int index = hashCode & (length - 1);
+    _HashMapEntry entry = buckets[index];
+    while (entry != null) {
+      if (hashCode == entry.hashCode && entry.key == key) {
+        entry.value = value;
+        return;
+      }
+      entry = entry.next;
+    }
+    _addEntry(buckets, index, length, key, value, hashCode);
   }
 
   /* patch */ V putIfAbsent(K key, V ifAbsent()) {
-    int offset = _hashTable._probeForAdd(_hashTable._hashCodeOf(key), key);
-    Object entry = _hashTable._table[offset];
-    if (!_hashTable._isFree(entry)) {
-      return _hashTable._value(offset);
-    }
-    int modificationCount = _hashTable._modificationCount;
-    V value = ifAbsent();
-    if (modificationCount == _hashTable._modificationCount) {
-      _hashTable._setKey(offset, key);
-      _hashTable._setValue(offset, value);
-      _hashTable._linkLast(offset);
-      if (entry == null) {
-        _hashTable._entryCount++;
-        _hashTable._checkCapacity();
-      } else {
-        assert(identical(entry, _TOMBSTONE));
-        _hashTable._deletedCount--;
+    int hashCode = key.hashCode;
+    List buckets = _buckets;
+    int length = buckets.length;
+    int index = hashCode & (length - 1);
+    _HashMapEntry entry = buckets[index];
+    while (entry != null) {
+      if (hashCode == entry.hashCode && entry.key == key) {
+        return entry.value;
       }
-      _hashTable._recordModification();
+      entry = entry.next;
+    }
+    int stamp = _modificationCount;
+    V value = ifAbsent();
+    if (stamp == _modificationCount) {
+      _addEntry(buckets, index, length, key, value, hashCode);
     } else {
-      // The table might have changed, so we can't trust [offset] any more.
-      // Do another lookup before setting the value.
-      offset = _hashTable._put(key);
-      _hashTable._setValue(offset, value);
-      _hashTable._checkCapacity();
+      this[key] = value;
     }
     return value;
   }
 
-  /* patch */ V remove(Object key) {
-    int offset = _hashTable._remove(key);
-    if (offset < 0) return null;
-    Object oldValue = _hashTable._value(offset);
-    _hashTable._setValue(offset, null);
-    _hashTable._checkCapacity();
-    return oldValue;
+  /* patch */ void addAll(Map<K, V> other) {
+    other.forEach((K key, V value) {
+      this[key] = value;
+    });
   }
 
-  /* patch */ void clear() {
-    _hashTable._clear();
-  }
-
-  /* patch */ void forEach(void action (K key, V value)) {
-    int modificationCount = _hashTable._modificationCount;
-    for (int offset = _hashTable._next(_LinkedHashTable._HEAD_OFFSET);
-         offset != _LinkedHashTable._HEAD_OFFSET;
-         offset = _hashTable._next(offset)) {
-      action(_hashTable._key(offset), _hashTable._value(offset));
-      _hashTable._checkModification(modificationCount);
+  /* patch */ void forEach(void action(K key, V value)) {
+    int stamp = _modificationCount;
+    var cursor = _nextEntry;
+    while (!identical(cursor, this)) {
+      _HashMapEntry entry = cursor;
+      action(entry.key, entry.value);
+      if (stamp != _modificationCount) {
+        throw new ConcurrentModificationError(this);
+      }
+      cursor = cursor._nextEntry;
     }
   }
 
-  /* patch */ Iterable<K> get keys =>
-      new _LinkedHashTableKeyIterable<K>(_hashTable);
+  /* patch */ V remove(Object key) {
+    int hashCode = key.hashCode;
+    List buckets = _buckets;
+    int index = hashCode & (buckets.length - 1);
+    _LinkedHashMapEntry entry = buckets[index];
+    _HashMapEntry previous = null;
+    while (entry != null) {
+      _HashMapEntry next = entry.next;
+      if (hashCode == entry.hashCode && entry.key == key) {
+        if (previous == null) {
+          buckets[index] = next;
+        } else {
+          previous.next = next;
+        }
+        entry._previousEntry._nextEntry = entry._nextEntry;
+        entry._nextEntry._previousEntry = entry._previousEntry;
+        entry._nextEntry = entry._previousEntry = null;
+        _elementCount--;
+        _modificationCount =
+            (_modificationCount + 1) & _MODIFICATION_COUNT_MASK;
+        return entry.value;
+      }
+      previous = entry;
+      entry = next;
+    }
+    return null;
+  }
 
-  /* patch */ Iterable<V> get values =>
-      new _LinkedHashTableValueIterable<V>(_hashTable,
-                                           _LinkedHashMapTable._VALUE_INDEX);
+  /* patch */ void clear() {
+    _elementCount = 0;
+    _nextEntry = _previousEntry = this;
+    _buckets = new List(_INITIAL_CAPACITY);
+    _modificationCount = (_modificationCount + 1) & _MODIFICATION_COUNT_MASK;
+  }
 
-  /* patch */ int get length => _hashTable._elementCount;
+  void _addEntry(List buckets, int index, int length,
+                 K key, V value, int hashCode) {
+    _HashMapEntry entry =
+        new _LinkedHashMapEntry(key, value, hashCode, buckets[index],
+                                _previousEntry, this);
+    buckets[index] = entry;
+    int newElements = _elementCount + 1;
+    _elementCount = newElements;
+    // If we end up with more than 75% non-empty entries, we
+    // resize the backing store.
+    if ((newElements << 2) > ((length << 1) + length)) _resize();
+    _modificationCount = (_modificationCount + 1) & _MODIFICATION_COUNT_MASK;
+  }
 
-  /* patch */ bool get isEmpty => _hashTable._elementCount == 0;
-
-  /* patch */ bool get isNotEmpty => !isEmpty;
+  void _resize() {
+    List oldBuckets = _buckets;
+    int oldLength = oldBuckets.length;
+    int newLength = oldLength << 1;
+    List newBuckets = new List(newLength);
+    for (int i = 0; i < oldLength; i++) {
+      _HashMapEntry entry = oldBuckets[i];
+      while (entry != null) {
+        _HashMapEntry next = entry.next;
+        int hashCode = entry.hashCode;
+        int index = hashCode & (newLength - 1);
+        entry.next = newBuckets[index];
+        newBuckets[index] = entry;
+        entry = next;
+      }
+    }
+    _buckets = newBuckets;
+  }
 }
 
 patch class LinkedHashSet<E> extends _HashSetBase<E> {
diff --git a/runtime/lib/errors_patch.dart b/runtime/lib/errors_patch.dart
index f841240..a1818db 100644
--- a/runtime/lib/errors_patch.dart
+++ b/runtime/lib/errors_patch.dart
@@ -148,13 +148,13 @@
     } else {
       positionalArguments = arguments.sublist(0, numPositionalArguments);
     }
-    Map<String, dynamic> namedArguments = new Map<String, dynamic>();
+    Map<Symbol, dynamic> namedArguments = new Map<Symbol, dynamic>();
     for (int i = 0; i < numNamedArguments; i++) {
       var arg_value = arguments[numPositionalArguments + i];
-      namedArguments[argumentNames[i]] = arg_value;
+      namedArguments[new Symbol(argumentNames[i])] = arg_value;
     }
     throw new NoSuchMethodError._withType(receiver,
-                                          memberName,
+                                          new Symbol(memberName),
                                           invocation_type,
                                           positionalArguments,
                                           namedArguments,
@@ -167,20 +167,31 @@
   final int _invocation_type;
 
   NoSuchMethodError(Object this._receiver,
-                    String this._memberName,
+                    Symbol this._memberName,
                     List this._arguments,
-                    Map<String,dynamic> this._namedArguments,
+                    Map<Symbol, dynamic> this._namedArguments,
                     [List existingArgumentNames = null])
       : this._existingArgumentNames = existingArgumentNames,
         this._invocation_type = -1;
 
+  // This constructor seems to be called with either strings or
+  // values read from another NoSuchMethodError.
   NoSuchMethodError._withType(Object this._receiver,
-                              String this._memberName,
+                              /*String|Symbol*/ memberName,
                               this._invocation_type,
                               List this._arguments,
-                              Map<String,dynamic> this._namedArguments,
+                              Map<dynamic, dynamic> namedArguments,
                               [List existingArgumentNames = null])
-      : this._existingArgumentNames = existingArgumentNames;
+      : this._memberName =
+            (memberName is String) ? new Symbol(memberName) : memberName,
+        this._namedArguments =
+            (namedArguments == null)
+                ? null
+                : new Map<Symbol, dynamic>.fromIterable(
+                    namedArguments.keys,
+                    key: (k) => (k is String) ? new Symbol(k) : k,
+                    value: (k) => namedArguments[k]),
+        this._existingArgumentNames = existingArgumentNames;
 
 
   String _developerMessage(args_mismatch) {
@@ -194,33 +205,35 @@
         (const ["method", "getter", "setter", "getter or setter"])[type];
     var args_message = args_mismatch ? " with matching arguments" : "";
     var msg;
+    var memberName =
+        (_memberName == null) ? "" :_collection_dev.Symbol.getName(_memberName);
     switch (level) {
       case _InvocationMirror._DYNAMIC: {
         if (_receiver == null) {
-          msg = "The null object does not have a $type_str '$_memberName'"
+          msg = "The null object does not have a $type_str '$memberName'"
               "$args_message.";
         } else {
           if (_receiver is Function) {
             msg = "Closure call with mismatched arguments: "
-                "function '$_memberName'";
+                "function '$memberName'";
           } else {
             msg = "Class '${_receiver.runtimeType}' has no instance $type_str "
-                "'$_memberName'$args_message.";
+                "'$memberName'$args_message.";
           }
         }
         break;
       }
       case _InvocationMirror._STATIC: {
-        msg = "No static $type_str '$_memberName' declared in class "
+        msg = "No static $type_str '$memberName' declared in class "
             "'$_receiver'.";
         break;
       }
       case _InvocationMirror._CONSTRUCTOR: {
-        msg = "No constructor '$_memberName' declared in class '$_receiver'.";
+        msg = "No constructor '$memberName' declared in class '$_receiver'.";
         break;
       }
       case _InvocationMirror._TOP_LEVEL: {
-        msg = "No top-level $type_str '$_memberName'$args_message declared.";
+        msg = "No top-level $type_str '$memberName'$args_message declared.";
         break;
       }
     }
@@ -244,11 +257,11 @@
       }
     }
     if (_namedArguments != null) {
-      _namedArguments.forEach((String key, var value) {
+      _namedArguments.forEach((Symbol key, var value) {
         if (i > 0) {
           actual_buf.write(", ");
         }
-        actual_buf.write(key);
+        actual_buf.write(_collection_dev.Symbol.getName(key));
         actual_buf.write(": ");
         actual_buf.write(Error.safeToString(value));
         i++;
@@ -264,9 +277,11 @@
     } else {
       receiver_str = Error.safeToString(_receiver);
     }
+    var memberName =
+        (_memberName == null) ? "" :_collection_dev.Symbol.getName(_memberName);
     if (!args_mismatch) {
       msg_buf.write(
-          "NoSuchMethodError : method not found: '$_memberName'\n"
+          "NoSuchMethodError : method not found: '$memberName'\n"
           "Receiver: $receiver_str\n"
           "Arguments: [$actual_buf]");
     } else {
@@ -281,10 +296,10 @@
       String formalParameters = formal_buf.toString();
       msg_buf.write(
           "NoSuchMethodError: incorrect number of arguments passed to "
-          "method named '$_memberName'\n"
+          "method named '$memberName'\n"
           "Receiver: $receiver_str\n"
-          "Tried calling: $_memberName($actualParameters)\n"
-          "Found: $_memberName($formalParameters)");
+          "Tried calling: $memberName($actualParameters)\n"
+          "Found: $memberName($formalParameters)");
     }
     return msg_buf.toString();
   }
diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
index 4962ac9..5be23af 100644
--- a/runtime/lib/integers.cc
+++ b/runtime/lib/integers.cc
@@ -216,9 +216,6 @@
     return Integer::New(temp);
   }
 
-  const Array& args = Array::Handle(Array::New(1));
-  args.SetAt(0, value);
-  Exceptions::ThrowByType(Exceptions::kFormat, args);
   return Object::null();
 }
 
diff --git a/runtime/lib/integers_patch.dart b/runtime/lib/integers_patch.dart
index fb749d7..fab603f 100644
--- a/runtime/lib/integers_patch.dart
+++ b/runtime/lib/integers_patch.dart
@@ -74,20 +74,21 @@
   /* patch */ static int parse(String source,
                                { int radix,
                                  int onError(String str) }) {
-    if ((radix == null) && (onError == null)) return _parse(source);
+    if (radix == null) {
+      int result = _parse(source);
+      if (result == null) {
+        if (onError == null) {
+          throw new FormatException(source);
+        }
+        return onError(source);
+      }
+      return result;
+    }
     return _slowParse(source, radix, onError);
   }
 
   static int _slowParse(String source, int radix, int onError(String str)) {
     if (source is! String) throw new ArgumentError(source);
-    if (radix == null) {
-      assert(onError != null);
-      try {
-        return _parse(source);
-      } on FormatException {
-        return onError(source);
-      }
-    }
     if (radix is! int) throw new ArgumentError("Radix is not an integer");
     if (radix < 2 || radix > 36) {
       throw new RangeError("Radix $radix not in range 2..36");
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index e897ab5..17f4e94 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -238,7 +238,7 @@
   args.SetAt(4, Bool::Get(func.is_abstract()));
   args.SetAt(5, Bool::Get(func.IsGetterFunction()));
   args.SetAt(6, Bool::Get(func.IsSetterFunction()));
-  args.SetAt(7, Bool::Get(func.IsConstructor()));
+  args.SetAt(7, Bool::Get(func.kind() == RawFunction::kConstructor));
   // TODO(mlippautz): Implement different constructor kinds.
   args.SetAt(8, Bool::False());
   args.SetAt(9, Bool::False());
@@ -299,12 +299,25 @@
   }
 
   const Bool& is_generic = Bool::Get(cls.NumTypeParameters() != 0);
+  const Bool& is_mixin_typedef = Bool::Get(cls.is_mixin_typedef());
 
-  const Array& args = Array::Handle(Array::New(4));
+  // If the class is not generic, the mirror must have a non-null runtime type.
+  // If the class is generic, the mirror will have a null runtime type if it
+  // represents the declaration or a non-null runtime type if it represents an
+  // instantiation.
+  ASSERT(!(cls.NumTypeParameters() == 0) || !type.IsNull());
+
+  const Array& args = Array::Handle(Array::New(5));
   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls)));
   args.SetAt(1, type);
-  args.SetAt(2, String::Handle(cls.UserVisibleName()));
+  // We do not set the names of anonymous mixin applications because the mirrors
+  // use a different naming convention than the VM (lib.S with lib.M and S&M
+  // respectively).
+  if ((cls.mixin() == Type::null()) || cls.is_mixin_typedef()) {
+    args.SetAt(2, String::Handle(cls.UserVisibleName()));
+  }
   args.SetAt(3, is_generic);
+  args.SetAt(4, is_mixin_typedef);
   return CreateMirror(Symbols::_LocalClassMirrorImpl(), args);
 }
 
@@ -512,11 +525,7 @@
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   const Class& klass = Class::Handle(ref.GetClassReferent());
   const Library& library = Library::Handle(klass.library());
-  // TODO(rmacnak): Revisit when we decide what to do about
-  // reflectClass(dynamic).
-  if (library.IsNull()) {
-    return Instance::null();
-  }
+  ASSERT(!library.IsNull());
   return CreateLibraryMirror(library);
 }
 
@@ -541,6 +550,13 @@
 }
 
 
+DEFINE_NATIVE_ENTRY(ClassMirror_mixin, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
+  const Class& klass = Class::Handle(ref.GetClassReferent());
+  return klass.mixin();
+}
+
+
 DEFINE_NATIVE_ENTRY(ClassMirror_members, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance,
                                owner_mirror,
@@ -632,6 +648,8 @@
   Object& entry = Object::Handle();
   DictionaryIterator entries(library);
 
+  AbstractType& type = AbstractType::Handle();
+
   while (entries.HasNext()) {
     entry = entries.GetNext();
     if (entry.IsClass()) {
@@ -641,9 +659,13 @@
       if (!klass.IsCanonicalSignatureClass() &&
           !klass.IsDynamicClass() &&
           !RawObject::IsImplementationClassId(klass.id())) {
-        member_mirror = CreateClassMirror(klass,
-                                          AbstractType::Handle(),
-                                          owner_mirror);
+        if (klass.NumTypeParameters() == 0) {
+          // Include runtime type for non-generics only.
+          type = RawTypeOfClass(klass);
+        } else {
+          type = AbstractType::null();
+        }
+        member_mirror = CreateClassMirror(klass, type, owner_mirror);
         member_mirrors.Add(member_mirror);
       }
     } else if (entry.IsField()) {
@@ -713,7 +735,11 @@
 
 DEFINE_NATIVE_ENTRY(TypeVariableMirror_owner, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0));
-  return CreateClassMirror(Class::Handle(param.parameterized_class()),
+  const Class& owner = Class::Handle(param.parameterized_class());
+  // The owner of a type variable must be a generic class: pass a null runtime
+  // type to get a mirror on the declaration.
+  ASSERT(owner.NumTypeParameters() != 0);
+  return CreateClassMirror(owner,
                            AbstractType::Handle(),
                            Instance::null_instance());
 }
@@ -1278,9 +1304,13 @@
   if (owner.IsTopLevel()) {
     return CreateLibraryMirror(Library::Handle(owner.library()));
   }
-  return CreateClassMirror(owner,
-                           AbstractType::Handle(),
-                           Object::null_instance());
+
+  AbstractType& type = AbstractType::Handle();
+  if (owner.NumTypeParameters() == 0) {
+    // Include runtime type for non-generics only.
+    type = RawTypeOfClass(owner);
+  }
+  return CreateClassMirror(owner, type, Object::null_instance());
 }
 
 
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index 4d211ec..ddf05f0 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -283,6 +283,7 @@
            identical(_reflectee, other._reflectee);
   }
 
+  // TODO(12909): Use the reflectee's identity hash.
   int get hashCode => _reflectee.hashCode;
 
   _invoke(reflectee, functionName, positionalArguments)
@@ -362,12 +363,14 @@
   _LocalClassMirrorImpl(reflectee,
                         this._reflectedType,
                         String simpleName,
-                        this._isGeneric)
+                        this._isGeneric,
+                        this._isMixinTypedef)
       : this._simpleName = _s(simpleName),
         super(reflectee);
 
   final Type _reflectedType;
   final bool _isGeneric;
+  final bool _isMixinTypedef;
 
   bool get hasReflectedType => _reflectedType != null;
   Type get reflectedType {
@@ -383,7 +386,12 @@
     // dynamic, void and the function types have their names set eagerly in the
     // constructor.
     if(_simpleName == null) {
-      _simpleName = _s(_name(_reflectee));
+      var simpleString = _name(_reflectee);
+      if (simpleString.contains('&')) {
+        _simpleName = this._mixinApplicationName;
+      } else {
+        _simpleName = _s(simpleString);
+      }
     }
     return _simpleName;
   }
@@ -418,33 +426,68 @@
   bool get isClass => true;
   ClassMirror get defaultFactory => null;
 
-  ClassMirror _superclass;
-  ClassMirror get superclass {
-    if (_superclass == null) {
+  ClassMirror _trueSuperclassField;
+  ClassMirror get _trueSuperclass {
+    if (_trueSuperclassField == null) {
       Type supertype = _supertype(_reflectee);
       if (supertype == null) {
         // Object has no superclass.
         return null;
       }
-      _superclass = _Mirrors._reflectType(supertype);
+      _trueSuperclassField = _Mirrors._reflectType(supertype);
     }
-    return _superclass;
+    return _trueSuperclassField;
+  }
+  ClassMirror get superclass {
+    return _isMixinTypedef ? _trueSuperclass._trueSuperclass : _trueSuperclass;
   }
 
   var _superinterfaces;
   List<ClassMirror> get superinterfaces {
     if (_superinterfaces == null) {
       _superinterfaces = _interfaces(_reflectee)
-          .map((i) => reflectClass(i)).toList(growable:false);
+          .map((i) => _Mirrors._reflectType(i)).toList(growable:false);
     }
     return _superinterfaces;
   }
 
+  get _mixinApplicationName {
+    var mixins = new List<ClassMirror>();
+    var klass = this;
+    while (_computeMixin(klass._reflectee) != null) {
+      mixins.add(klass.mixin);
+      klass = klass.superclass;
+    }
+    return _s(
+      _n(klass.qualifiedName) 
+      + ' with '
+      + mixins.reversed.map((m)=>_n(m.qualifiedName)).join(', '));
+  }
+ 
+  var _mixin;
+  ClassMirror get mixin {
+    if (_mixin == null) {
+      if (_isMixinTypedef) {
+        _mixin = _trueSuperclass.mixin;
+      } else {
+        var mixinType = _computeMixin(_reflectee);
+        if (mixinType == null) {
+          // The reflectee is not a mixin application.
+          _mixin = this;
+        } else {
+          _mixin = _Mirrors._reflectType(mixinType);
+        }
+      }
+    }
+    return _mixin;
+  }
+
   Map<Symbol, Mirror> _members;
 
   Map<Symbol, Mirror> get members {
     if (_members == null) {
-      _members = _makeMemberMap(_computeMembers(_reflectee));
+      var whoseMembers = _isMixinTypedef ? _trueSuperclass : this;
+      _members = _makeMemberMap(mixin._computeMembers(whoseMembers._reflectee));
     }
     return _members;
   }
@@ -494,9 +537,12 @@
 
   Map<Symbol, MethodMirror> get constructors {
     if (_constructors == null) {
-      _constructors = _makeMemberMap(_computeConstructors(_reflectee));
-    }
-    return _constructors;
+      var constructorsList = _computeConstructors(_reflectee);
+      var stringName = _n(simpleName);
+      constructorsList.forEach((c) => c._patchConstructorName(stringName));
+      _constructors = _makeMemberMap(constructorsList);
+    } 
+    return _constructors;  
   }
 
   Map<Symbol, TypeVariableMirror> _typeVariables = null;
@@ -584,8 +630,7 @@
   bool operator ==(other) {
     return this.runtimeType == other.runtimeType &&
            this._reflectee == other._reflectee &&
-           (isOriginalDeclaration || 
-            this._reflectedType == other._reflectedType);
+           this._reflectedType == other._reflectedType;
   }
 
   int get hashCode => simpleName.hashCode;
@@ -602,6 +647,9 @@
   static _interfaces(reflectee)
       native "ClassMirror_interfaces";
 
+  static _computeMixin(reflectee)
+      native "ClassMirror_mixin";
+
   _computeMembers(reflectee)
       native "ClassMirror_members";
   
@@ -630,7 +678,7 @@
 class _LocalFunctionTypeMirrorImpl extends _LocalClassMirrorImpl
     implements FunctionTypeMirror {
   _LocalFunctionTypeMirrorImpl(reflectee, reflectedType)
-      : super(reflectee, reflectedType, null, false);
+      : super(reflectee, reflectedType, null, false, false);
 
   // FunctionTypeMirrors have a simpleName generated from their signature.
   Symbol _simpleName = null;
@@ -684,11 +732,12 @@
 
 abstract class _LocalDeclarationMirrorImpl extends _LocalMirrorImpl
     implements DeclarationMirror {
-  _LocalDeclarationMirrorImpl(this._reflectee, this.simpleName);
+  _LocalDeclarationMirrorImpl(this._reflectee, this._simpleName);
 
   final _reflectee;
 
-  final Symbol simpleName;
+  Symbol _simpleName;
+  Symbol get simpleName => _simpleName;
 
   Symbol _qualifiedName = null;
   Symbol get qualifiedName {
@@ -1025,6 +1074,15 @@
     return _source;
   }
 
+  void _patchConstructorName(ownerName) {
+    var cn = _n(constructorName);
+    if(cn == ''){
+      _simpleName = _s(ownerName);
+    } else {
+      _simpleName = _s(ownerName + "." + cn);
+    }
+  }
+
   String toString() => "MethodMirror on '${_n(simpleName)}'";
 
   static dynamic _MethodMirror_owner(reflectee)
diff --git a/runtime/lib/regexp_patch.dart b/runtime/lib/regexp_patch.dart
index 72b6f4b..909b801 100644
--- a/runtime/lib/regexp_patch.dart
+++ b/runtime/lib/regexp_patch.dart
@@ -3,17 +3,17 @@
 // BSD-style license that can be found in the LICENSE file.
 
 patch class RegExp {
-  /* patch */ factory RegExp(String pattern,
+  /* patch */ factory RegExp(String source,
                              {bool multiLine: false,
                               bool caseSensitive: true}) {
-    return new _JSSyntaxRegExp(pattern,
+    return new _JSSyntaxRegExp(source,
                                multiLine: multiLine,
                                caseSensitive: caseSensitive);
   }
 }
 
 class _JSRegExpMatch implements Match {
-  _JSRegExpMatch(this._regexp, this.str, this._match);
+  _JSRegExpMatch(this._regexp, this.input, this._match);
 
   int get start => _start(0);
   int get end => _end(0);
@@ -36,7 +36,7 @@
       assert(endIndex == -1);
       return null;
     }
-    return str._substringUnchecked(startIndex, endIndex);
+    return input._substringUnchecked(startIndex, endIndex);
   }
 
   String operator [](int groupIdx) {
@@ -55,8 +55,11 @@
 
   Pattern get pattern => _regexp;
 
+  // TODO(12843): Remove when grace period is over.
+  String get str => input;
+
   final RegExp _regexp;
-  final String str;
+  final String input;
   final List<int> _match;
   static const int _MATCH_PAIR = 2;
 }
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index 2d40f2d..b9ec3c9 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -600,7 +600,7 @@
 
 class _StringMatch implements Match {
   const _StringMatch(int this.start,
-                     String this.str,
+                     String this.input,
                      String this.pattern);
 
   int get end => start + pattern.length;
@@ -622,8 +622,11 @@
     return result;
   }
 
+  // TODO(12843): Remove when grace period is over.
+  String get str => input;
+
   final int start;
-  final String str;
+  final String input;
   final String pattern;
 }
 
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index e60c145..006918c 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -432,16 +432,6 @@
         "Cannot remove from a non-extendable array");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError(
-        "Cannot remove from a non-extendable array");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError(
-        "Cannot remove from a non-extendable array");
-  }
-
   void removeWhere(bool test(element)) {
     throw new UnsupportedError(
         "Cannot remove from a non-extendable array");
diff --git a/runtime/third_party/double-conversion/src/bignum.cc b/runtime/third_party/double-conversion/src/bignum.cc
index 747491a..d2c8aa9 100644
--- a/runtime/third_party/double-conversion/src/bignum.cc
+++ b/runtime/third_party/double-conversion/src/bignum.cc
@@ -755,7 +755,6 @@
     Chunk difference = bigits_[i] - borrow;
     bigits_[i] = difference & kBigitMask;
     borrow = difference >> (kChunkSize - 1);
-    ++i;
   }
   Clamp();
 }
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index 7752441..30b6123 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -2532,8 +2532,9 @@
 }
 
 
-void Assembler::CallRuntime(const RuntimeEntry& entry) {
-  entry.Call(this);
+void Assembler::CallRuntime(const RuntimeEntry& entry,
+                            intptr_t argument_count) {
+  entry.Call(this, argument_count);
 }
 
 
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index 8449603..f8917f4 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -699,7 +699,7 @@
   void EnterCallRuntimeFrame(intptr_t frame_space);
   void LeaveCallRuntimeFrame();
 
-  void CallRuntime(const RuntimeEntry& entry);
+  void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count);
 
   // Set up a Dart frame on entry with a frame pointer and PC information to
   // enable easy access to the RawInstruction object of code corresponding
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index a1dfc13..0ac2354 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -2200,8 +2200,9 @@
 }
 
 
-void Assembler::CallRuntime(const RuntimeEntry& entry) {
-  entry.Call(this);
+void Assembler::CallRuntime(const RuntimeEntry& entry,
+                            intptr_t argument_count) {
+  entry.Call(this, argument_count);
 }
 
 
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index d0972ea..4ddd90e 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -670,7 +670,7 @@
   void EnterCallRuntimeFrame(intptr_t frame_space);
   void LeaveCallRuntimeFrame();
 
-  void CallRuntime(const RuntimeEntry& entry);
+  void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count);
 
   /*
    * Loading and comparing classes of objects.
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index bb4a2c3..33ede4c 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -729,8 +729,9 @@
 }
 
 
-void Assembler::CallRuntime(const RuntimeEntry& entry) {
-  entry.Call(this);
+void Assembler::CallRuntime(const RuntimeEntry& entry,
+                            intptr_t argument_count) {
+  entry.Call(this, argument_count);
 }
 
 
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index d7e96c4..15c02d8 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -1080,7 +1080,7 @@
                                 const Address& dest,
                                 const Object& value);
 
-  void CallRuntime(const RuntimeEntry& entry);
+  void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count);
 
   // Set up a Dart frame on entry with a frame pointer and PC information to
   // enable easy access to the RawInstruction object of code corresponding
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 38fad31..0434aef 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -2372,8 +2372,9 @@
 }
 
 
-void Assembler::CallRuntime(const RuntimeEntry& entry) {
-  entry.Call(this);
+void Assembler::CallRuntime(const RuntimeEntry& entry,
+                            intptr_t argument_count) {
+  entry.Call(this, argument_count);
 }
 
 
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index fd0d70b..f4c945f 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -689,7 +689,7 @@
   void LeaveCallRuntimeFrame();
 
 
-  void CallRuntime(const RuntimeEntry& entry);
+  void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count);
 
   /*
    * Loading and comparing classes of objects.
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index babc9a9..4b40760 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -214,12 +214,11 @@
   intptr_t length() const { return nodes_.length(); }
   AstNode* NodeAt(intptr_t index) const { return nodes_[index]; }
   void SetNodeAt(intptr_t index, AstNode* node) { nodes_[index] = node; }
-  const Array& names() const {
-    return names_;
-  }
+  const Array& names() const { return names_; }
   void set_names(const Array& names) {
     names_ = names.raw();
   }
+  const GrowableArray<AstNode*>& nodes() const { return nodes_; }
 
   DECLARE_COMMON_NODE_FUNCTIONS(ArgumentListNode);
 
@@ -1604,14 +1603,16 @@
                   const LocalVariable* context_var,
                   const LocalVariable* exception_var,
                   const LocalVariable* stacktrace_var,
-                  intptr_t catch_handler_index)
+                  intptr_t catch_handler_index,
+                  bool needs_stacktrace)
       : AstNode(token_pos),
         catch_block_(catch_block),
         handler_types_(handler_types),
         context_var_(*context_var),
         exception_var_(*exception_var),
         stacktrace_var_(*stacktrace_var),
-        catch_handler_index_(catch_handler_index) {
+        catch_handler_index_(catch_handler_index),
+        needs_stacktrace_(needs_stacktrace) {
     ASSERT(catch_block_ != NULL);
     ASSERT(handler_types.IsZoneHandle());
     ASSERT(context_var != NULL);
@@ -1624,6 +1625,7 @@
   const LocalVariable& exception_var() const { return exception_var_; }
   const LocalVariable& stacktrace_var() const { return stacktrace_var_; }
   intptr_t catch_handler_index() const { return catch_handler_index_; }
+  bool needs_stacktrace() const { return needs_stacktrace_; }
 
   virtual void VisitChildren(AstNodeVisitor* visitor) const {
     catch_block_->Visit(visitor);
@@ -1638,6 +1640,7 @@
   const LocalVariable& exception_var_;
   const LocalVariable& stacktrace_var_;
   const intptr_t catch_handler_index_;
+  const bool needs_stacktrace_;
 
   DISALLOW_COPY_AND_ASSIGN(CatchClauseNode);
 };
diff --git a/runtime/vm/bigint_operations.cc b/runtime/vm/bigint_operations.cc
index 709baa2..fc54442 100644
--- a/runtime/vm/bigint_operations.cc
+++ b/runtime/vm/bigint_operations.cc
@@ -152,6 +152,7 @@
 
 RawBigint* BigintOperations::FromDecimalCString(const char* str,
                                                 Heap::Space space) {
+  Isolate* isolate = Isolate::Current();
   // Read 8 digits a time. 10^8 < 2^27.
   const int kDigitsPerIteration = 8;
   const Chunk kTenMultiplier = 100000000;
@@ -178,6 +179,7 @@
   // 'increment' to the new result.
   const Bigint& increment = Bigint::Handle(Bigint::Allocate(1));
   while (str_pos < str_length - 1) {
+    HANDLESCOPE(isolate);
     Chunk digit = 0;
     for (intptr_t i = 0; i < kDigitsPerIteration; i++) {
       char c = str[str_pos++];
@@ -329,10 +331,10 @@
       (kIntptrMax - 10) / kLog2Dividend / kDigitBitSize * kLog2Divisor;
 
   intptr_t length = bigint.Length();
+  Isolate* isolate = Isolate::Current();
   if (length >= kMaxAllowedDigitLength) {
     // Use the preallocated out of memory exception to avoid calling
     // into dart code or allocating any code.
-    Isolate* isolate = Isolate::Current();
     const Instance& exception =
         Instance::Handle(isolate->object_store()->out_of_memory());
     Exceptions::Throw(exception);
@@ -370,6 +372,7 @@
   Bigint& quotient = Bigint::Handle();
   Bigint& remainder = Bigint::Handle();
   while (!rest.IsZero()) {
+    HANDLESCOPE(isolate);
     DivideRemainder(rest, divisor, &quotient, &remainder);
     ASSERT(remainder.Length() <= 1);
     intptr_t part = (remainder.Length() == 1)
@@ -718,32 +721,55 @@
   //        1000  * (a2b1 + a1b2) +
   //        10000 * a2b2
   //
-  // Each column will be accumulated in an integer of type DoubleChunk. We
-  // must guarantee that the column-sum will not overflow.
+  // Each column will be accumulated in an integer of type DoubleChunk. We must
+  // guarantee that the column-sum will not overflow.  We achieve this by
+  // 'blocking' the sum into overflow-free sums followed by propagating the
+  // overflow.
   //
-  // In the worst case we have to accumulate k = Min(a.length, b.length)
-  // products plus the carry from the previous round.
-  // Each bigint-digit is smaller than beta = 2^kDigitBitSize.
-  // Each product is at most (beta - 1)^2.
-  // If we want to use Comba multiplication the following condition must hold:
-  // k * (beta - 1)^2 + (2^(kDoubleChunkBitSize - kDigitBitSize) - 1) <
-  //        2^kDoubleChunkBitSize.
-  const DoubleChunk square =
-      static_cast<DoubleChunk>(kDigitMaxValue) * kDigitMaxValue;
-  const DoubleChunk kDoubleChunkMaxValue = static_cast<DoubleChunk>(-1);
-  const DoubleChunk left_over_carry = kDoubleChunkMaxValue >> kDigitBitSize;
-  const intptr_t kMaxDigits = (kDoubleChunkMaxValue - left_over_carry) / square;
-  if (Utils::Minimum(a_length, b_length) > kMaxDigits) {
-    // Use the preallocated out of memory exception to avoid calling
-    // into dart code or allocating any code.
-    Isolate* isolate = Isolate::Current();
-    const Instance& exception =
-        Instance::Handle(isolate->object_store()->out_of_memory());
-    Exceptions::Throw(exception);
-    UNREACHABLE();
-  }
+  // Each bigint digit fits in kDigitBitSize bits.
+  // Each product fits in 2*kDigitBitSize bits.
+  // The accumulator is 8 * sizeof(DoubleChunk) == 2*kDigitBitSize + kCarryBits.
+  //
+  // Each time we add a product to the accumulator it could carry one bit into
+  // the carry bits, supporting kBlockSize = 2^kCarryBits - 1 addition
+  // operations before the DoubleChunk overflows.
+  //
+  // At the end of the column sum and after each batch of kBlockSize additions
+  // the high kCarryBits+kDigitBitSize of accumulator are flushed to
+  // accumulator_overflow.
+  //
+  // Diagramatically, using one char per 4 bits:
+  //
+  //  0aaaaaaa * 0bbbbbbb  ->  00pppppppppppppp   product of 2 digits
+  //                                   |
+  //                                   +          ...added to
+  //                                   v
+  //                           ccSSSSSSSsssssss   accumulator
+  //                                              ...flushed to
+  //                           000000000sssssss   accumulator
+  //                    vvvvvvvvvVVVVVVV          accumulator_overflow
+  //
+  //  'sssssss' becomes the column sum an overflow is carried to next column:
+  //
+  //                           000000000VVVVVVV   accumulator
+  //                    0000000vvvvvvvvv          accumulator_overflow
+  //
+  // accumulator_overflow supports 2^(kDigitBitSize + kCarryBits) additions of
+  // products.
+  //
+  // Since the bottom (kDigitBitSize + kCarryBits) bits of accumulator_overflow
+  // are initialized from the previous column, that uses up the capacity to
+  // absorb 2^kCarryBits additions.  The accumulator_overflow can overflow if
+  // the column has more than 2^(kDigitBitSize + kCarryBits) - 2^kCarryBits
+  // elements With current configuration that is 2^36-2^8 elements.  That is too
+  // high to happen in practice.  Comba multiplication is O(N^2) so overflow
+  // won't happen during a human lifespan.
+
+  const intptr_t kCarryBits = 8 * sizeof(DoubleChunk) - 2 * kDigitBitSize;
+  const intptr_t kBlockSize = (1 << kCarryBits) - 1;
 
   DoubleChunk accumulator = 0;  // Accumulates the result of one column.
+  DoubleChunk accumulator_overflow = 0;
   for (intptr_t i = 0; i < result_length; i++) {
     // Example: r = a2a1a0 * b2b1b0.
     //   For i == 0, compute a0b0.
@@ -758,17 +784,29 @@
     // Instead of testing for a_index >= 0 && b_index < b_length we compute the
     // number of iterations first.
     intptr_t iterations = Utils::Minimum(b_length - b_index, a_index + 1);
-    for (intptr_t j = 0; j < iterations; j++) {
-      DoubleChunk chunk_a = a.GetChunkAt(a_index);
-      DoubleChunk chunk_b = b.GetChunkAt(b_index);
-      accumulator += chunk_a * chunk_b;
-      a_index--;
-      b_index++;
+
+    // For large products we need extra bit for the overflow.  The sum is broken
+    // into blocks to avoid dealing with the overflow on each iteration.
+    for (intptr_t j_block = 0; j_block < iterations; j_block += kBlockSize) {
+      intptr_t j_end = Utils::Minimum(j_block + kBlockSize, iterations);
+      for (intptr_t j = j_block; j < j_end; j++) {
+        DoubleChunk chunk_a = a.GetChunkAt(a_index);
+        DoubleChunk chunk_b = b.GetChunkAt(b_index);
+        accumulator += chunk_a * chunk_b;
+        a_index--;
+        b_index++;
+      }
+      accumulator_overflow += (accumulator >> kDigitBitSize);
+      accumulator &= kDigitMask;
     }
-    result.SetChunkAt(i, static_cast<Chunk>(accumulator & kDigitMask));
-    accumulator >>= kDigitBitSize;
+    result.SetChunkAt(i, static_cast<Chunk>(accumulator));
+    // Overflow becomes the initial accumulator for the next column.
+    accumulator = accumulator_overflow & kDigitMask;
+    // And the overflow from the overflow becomes the new overflow.
+    accumulator_overflow = (accumulator_overflow >> kDigitBitSize);
   }
   ASSERT(accumulator == 0);
+  ASSERT(accumulator_overflow == 0);
 
   Clamp(result);
   return result.raw();
@@ -1537,7 +1575,9 @@
   Bigint& shifted_divisor =
       Bigint::Handle(DigitsShiftLeft(divisor, divisor_shift_amount));
   Chunk first_quotient_digit = 0;
+  Isolate* isolate = Isolate::Current();
   while (UnsignedCompare(dividend, shifted_divisor) >= 0) {
+    HANDLESCOPE(isolate);
     first_quotient_digit++;
     dividend = Subtract(dividend, shifted_divisor);
   }
@@ -1566,6 +1606,7 @@
     //     dividend: 56822123, and divisor: 563  (with t == 5) is bad.
     //     dividend:  6822123, and divisor: 563  (with t == 5) is ok.
 
+    HANDLESCOPE(isolate);
     // The dividend has changed. So recompute its length.
     dividend_length = dividend.Length();
     Chunk dividend_digit;
@@ -1611,6 +1652,7 @@
     target.SetChunkAt(1, ((i - 1) < 0) ? 0 : dividend.GetChunkAt(i - 1));
     target.SetChunkAt(2, dividend_digit);
     do {
+      HANDLESCOPE(isolate);
       quotient_digit = (quotient_digit - 1) & kDigitMask;
       estimation_product = MultiplyWithDigit(short_divisor, quotient_digit);
     } while (UnsignedCompareNonClamped(estimation_product, target) > 0);
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 8e01bd5..1df9edf 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -262,6 +262,7 @@
   V(ClassMirror_library, 1)                                                    \
   V(ClassMirror_supertype, 1)                                                  \
   V(ClassMirror_interfaces, 1)                                                 \
+  V(ClassMirror_mixin, 1)                                                      \
   V(ClassMirror_members, 2)                                                    \
   V(ClassMirror_constructors, 2)                                               \
   V(LibraryMirror_members, 2)                                                  \
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index cab61ef..6337826 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -5,6 +5,7 @@
 #ifndef VM_CODE_DESCRIPTORS_H_
 #define VM_CODE_DESCRIPTORS_H_
 
+#include "vm/ast.h"
 #include "vm/code_generator.h"
 #include "vm/globals.h"
 #include "vm/growable_array.h"
@@ -101,6 +102,7 @@
     intptr_t outer_try_index;  // Try block in which this try block is nested.
     intptr_t pc_offset;        // Handler PC offset value.
     const Array* handler_types;   // Catch clause guards.
+    bool needs_stacktrace;
   };
 
   ExceptionHandlerList() : list_() {}
@@ -114,13 +116,15 @@
     data.outer_try_index = -1;
     data.pc_offset = -1;
     data.handler_types = NULL;
+    data.needs_stacktrace = false;
     list_.Add(data);
   }
 
   void AddHandler(intptr_t try_index,
                   intptr_t outer_try_index,
                   intptr_t pc_offset,
-                  const Array& handler_types) {
+                  const Array& handler_types,
+                  bool needs_stacktrace) {
     ASSERT(try_index >= 0);
     while (Length() <= try_index) {
       AddPlaceHolder();
@@ -129,8 +133,31 @@
     list_[try_index].pc_offset = pc_offset;
     ASSERT(handler_types.IsZoneHandle());
     list_[try_index].handler_types = &handler_types;
+    list_[try_index].needs_stacktrace = needs_stacktrace;
   }
 
+
+  // Called by rethrows, to mark their enclosing handlers.
+  void SetNeedsStacktrace(intptr_t try_index) {
+    // Rethrows can be generated outside a try by the compiler.
+    if (try_index == CatchClauseNode::kInvalidTryIndex) {
+      return;
+    }
+    ASSERT((0 <= try_index) && (try_index < Length()));
+    list_[try_index].needs_stacktrace = true;
+  }
+
+
+  static bool ContainsDynamic(const Array& array) {
+    for (intptr_t i = 0; i < array.Length(); i++) {
+      if (array.At(i) == Type::DynamicType()) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+
   RawExceptionHandlers* FinalizeExceptionHandlers(uword entry_point) {
     intptr_t num_handlers = Length();
     const ExceptionHandlers& handlers =
@@ -138,9 +165,12 @@
     for (intptr_t i = 0; i < num_handlers; i++) {
       // Assert that every element in the array has been initialized.
       ASSERT(list_[i].handler_types != NULL);
+      bool has_catch_all = ContainsDynamic(*list_[i].handler_types);
       handlers.SetHandlerInfo(i,
                               list_[i].outer_try_index,
-                              (entry_point + list_[i].pc_offset));
+                              (entry_point + list_[i].pc_offset),
+                              list_[i].needs_stacktrace,
+                              has_catch_all);
       handlers.SetHandledTypes(i, *list_[i].handler_types);
     }
     return handlers.raw();
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index b80d822..9bfd2a5 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -62,8 +62,6 @@
 
 
 DEFINE_RUNTIME_ENTRY(TraceFunctionEntry, 1) {
-  ASSERT(arguments.ArgCount() ==
-      kTraceFunctionEntryRuntimeEntry.argument_count());
   const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
   const String& function_name = String::Handle(function.name());
   const String& class_name =
@@ -74,8 +72,6 @@
 
 
 DEFINE_RUNTIME_ENTRY(TraceFunctionExit, 1) {
-  ASSERT(arguments.ArgCount() ==
-      kTraceFunctionExitRuntimeEntry.argument_count());
   const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
   const String& function_name = String::Handle(function.name());
   const String& class_name =
@@ -92,7 +88,6 @@
 // Arg1: array type arguments, i.e. vector of 1 type, the element type.
 // Return value: newly allocated array of length arg0.
 DEFINE_RUNTIME_ENTRY(AllocateArray, 2) {
-  ASSERT(arguments.ArgCount() == kAllocateArrayRuntimeEntry.argument_count());
   const Smi& length = Smi::CheckedHandle(arguments.ArgAt(0));
   const Array& array = Array::Handle(Array::New(length.Value()));
   arguments.SetReturn(array);
@@ -113,7 +108,6 @@
 // Arg2: type arguments of the instantiator or kNoInstantiator.
 // Return value: newly allocated object.
 DEFINE_RUNTIME_ENTRY(AllocateObject, 3) {
-  ASSERT(arguments.ArgCount() == kAllocateObjectRuntimeEntry.argument_count());
   const Class& cls = Class::CheckedHandle(arguments.ArgAt(0));
   const Instance& instance = Instance::Handle(Instance::New(cls));
   arguments.SetReturn(instance);
@@ -168,8 +162,6 @@
 // Return value: newly allocated object.
 DEFINE_RUNTIME_ENTRY(AllocateObjectWithBoundsCheck, 3) {
   ASSERT(FLAG_enable_type_checks);
-  ASSERT(arguments.ArgCount() ==
-         kAllocateObjectWithBoundsCheckRuntimeEntry.argument_count());
   const Class& cls = Class::CheckedHandle(arguments.ArgAt(0));
   const Instance& instance = Instance::Handle(Instance::New(cls));
   arguments.SetReturn(instance);
@@ -219,7 +211,6 @@
 // Arg1: instantiator type arguments.
 // Return value: instantiated type.
 DEFINE_RUNTIME_ENTRY(InstantiateType, 2) {
-  ASSERT(arguments.ArgCount() == kInstantiateTypeRuntimeEntry.argument_count());
   AbstractType& type = AbstractType::CheckedHandle(arguments.ArgAt(0));
   const AbstractTypeArguments& instantiator =
       AbstractTypeArguments::CheckedHandle(arguments.ArgAt(1));
@@ -247,8 +238,6 @@
 // Arg1: instantiator type arguments.
 // Return value: instantiated type arguments.
 DEFINE_RUNTIME_ENTRY(InstantiateTypeArguments, 2) {
-  ASSERT(arguments.ArgCount() ==
-         kInstantiateTypeArgumentsRuntimeEntry.argument_count());
   AbstractTypeArguments& type_arguments =
       AbstractTypeArguments::CheckedHandle(arguments.ArgAt(0));
   const AbstractTypeArguments& instantiator =
@@ -273,7 +262,6 @@
 // Arg1: type arguments of the closure (i.e. instantiator).
 // Return value: newly allocated closure.
 DEFINE_RUNTIME_ENTRY(AllocateClosure, 2) {
-  ASSERT(arguments.ArgCount() == kAllocateClosureRuntimeEntry.argument_count());
   const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
   ASSERT(function.IsClosureFunction() && !function.IsImplicitClosureFunction());
   const AbstractTypeArguments& type_arguments =
@@ -295,8 +283,6 @@
 // Arg2: type arguments of the closure.
 // Return value: newly allocated closure.
 DEFINE_RUNTIME_ENTRY(AllocateImplicitInstanceClosure, 3) {
-  ASSERT(arguments.ArgCount() ==
-         kAllocateImplicitInstanceClosureRuntimeEntry.argument_count());
   const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
   ASSERT(function.IsImplicitInstanceClosureFunction());
   const Instance& receiver = Instance::CheckedHandle(arguments.ArgAt(1));
@@ -316,7 +302,6 @@
 // Arg0: number of variables.
 // Return value: newly allocated context.
 DEFINE_RUNTIME_ENTRY(AllocateContext, 1) {
-  ASSERT(arguments.ArgCount() == kAllocateContextRuntimeEntry.argument_count());
   const Smi& num_variables = Smi::CheckedHandle(arguments.ArgAt(0));
   arguments.SetReturn(Context::Handle(Context::New(num_variables.Value())));
 }
@@ -327,7 +312,6 @@
 // Arg0: the context to be cloned.
 // Return value: newly allocated context.
 DEFINE_RUNTIME_ENTRY(CloneContext, 1) {
-  ASSERT(arguments.ArgCount() == kCloneContextRuntimeEntry.argument_count());
   const Context& ctx = Context::CheckedHandle(arguments.ArgAt(0));
   Context& cloned_ctx = Context::Handle(Context::New(ctx.num_variables()));
   cloned_ctx.set_parent(Context::Handle(ctx.parent()));
@@ -554,7 +538,6 @@
 // Arg4: SubtypeTestCache.
 // Return value: true or false, or may throw a type error in checked mode.
 DEFINE_RUNTIME_ENTRY(Instanceof, 5) {
-  ASSERT(arguments.ArgCount() == kInstanceofRuntimeEntry.argument_count());
   const Instance& instance = Instance::CheckedHandle(arguments.ArgAt(0));
   const AbstractType& type = AbstractType::CheckedHandle(arguments.ArgAt(1));
   const Instance& instantiator = Instance::CheckedHandle(arguments.ArgAt(2));
@@ -598,7 +581,6 @@
 // Arg5: SubtypeTestCache.
 // Return value: instance if a subtype, otherwise throw a TypeError.
 DEFINE_RUNTIME_ENTRY(TypeCheck, 6) {
-  ASSERT(arguments.ArgCount() == kTypeCheckRuntimeEntry.argument_count());
   const Instance& src_instance = Instance::CheckedHandle(arguments.ArgAt(0));
   const AbstractType& dst_type =
       AbstractType::CheckedHandle(arguments.ArgAt(1));
@@ -658,8 +640,6 @@
 // Arg0: bad object.
 // Return value: none, throws a TypeError.
 DEFINE_RUNTIME_ENTRY(ConditionTypeError, 1) {
-  ASSERT(arguments.ArgCount() ==
-      kConditionTypeErrorRuntimeEntry.argument_count());
   const intptr_t location = GetCallerLocation();
   const Instance& src_instance = Instance::CheckedHandle(arguments.ArgAt(0));
   ASSERT(src_instance.IsNull() || !src_instance.IsBool());
@@ -682,8 +662,6 @@
 // Arg2: malformed type error message.
 // Return value: none, throws an exception.
 DEFINE_RUNTIME_ENTRY(MalformedTypeError, 3) {
-  ASSERT(arguments.ArgCount() ==
-      kMalformedTypeErrorRuntimeEntry.argument_count());
   const intptr_t location = GetCallerLocation();
   const Instance& src_value = Instance::CheckedHandle(arguments.ArgAt(0));
   const String& dst_name = String::CheckedHandle(arguments.ArgAt(1));
@@ -698,14 +676,12 @@
 
 
 DEFINE_RUNTIME_ENTRY(Throw, 1) {
-  ASSERT(arguments.ArgCount() == kThrowRuntimeEntry.argument_count());
   const Instance& exception = Instance::CheckedHandle(arguments.ArgAt(0));
   Exceptions::Throw(exception);
 }
 
 
 DEFINE_RUNTIME_ENTRY(ReThrow, 2) {
-  ASSERT(arguments.ArgCount() == kReThrowRuntimeEntry.argument_count());
   const Instance& exception = Instance::CheckedHandle(arguments.ArgAt(0));
   const Instance& stacktrace = Instance::CheckedHandle(arguments.ArgAt(1));
   Exceptions::ReThrow(exception, stacktrace);
@@ -715,7 +691,6 @@
 // Patches static call in optimized code with the target's entry point.
 // Compiles target if necessary.
 DEFINE_RUNTIME_ENTRY(PatchStaticCall, 0) {
-  ASSERT(arguments.ArgCount() == kPatchStaticCallRuntimeEntry.argument_count());
   DartFrameIterator iterator;
   StackFrame* caller_frame = iterator.NextFrame();
   ASSERT(caller_frame != NULL);
@@ -789,8 +764,6 @@
 // Gets called from debug stub when code reaches a breakpoint
 // set on a runtime stub call.
 DEFINE_RUNTIME_ENTRY(BreakpointRuntimeHandler, 0) {
-  ASSERT(arguments.ArgCount() ==
-         kBreakpointRuntimeHandlerRuntimeEntry.argument_count());
   ASSERT(isolate->debugger() != NULL);
   DartFrameIterator iterator;
   StackFrame* caller_frame = iterator.NextFrame();
@@ -805,8 +778,6 @@
 
 // Gets called from debug stub when code reaches a breakpoint.
 DEFINE_RUNTIME_ENTRY(BreakpointStaticHandler, 0) {
-  ASSERT(arguments.ArgCount() ==
-      kBreakpointStaticHandlerRuntimeEntry.argument_count());
   ASSERT(isolate->debugger() != NULL);
   isolate->debugger()->SignalBpReached();
   // Make sure the static function that is about to be called is
@@ -834,8 +805,6 @@
 // Gets called from debug stub when code reaches a breakpoint at a return
 // in Dart code.
 DEFINE_RUNTIME_ENTRY(BreakpointReturnHandler, 0) {
-  ASSERT(arguments.ArgCount() ==
-         kBreakpointReturnHandlerRuntimeEntry.argument_count());
   ASSERT(isolate->debugger() != NULL);
   isolate->debugger()->SignalBpReached();
 }
@@ -843,16 +812,12 @@
 
 // Gets called from debug stub when code reaches a breakpoint.
 DEFINE_RUNTIME_ENTRY(BreakpointDynamicHandler, 0) {
-  ASSERT(arguments.ArgCount() ==
-     kBreakpointDynamicHandlerRuntimeEntry.argument_count());
   ASSERT(isolate->debugger() != NULL);
   isolate->debugger()->SignalBpReached();
 }
 
 
 DEFINE_RUNTIME_ENTRY(SingleStepHandler, 0) {
-  ASSERT(arguments.ArgCount() ==
-         kSingleStepHandlerRuntimeEntry.argument_count());
   ASSERT(isolate->debugger() != NULL);
   isolate->debugger()->SingleStepCallback();
 }
@@ -920,8 +885,6 @@
 //   Returns: target function with compiled code or null.
 // Modifies the instance call to hold the updated IC data array.
 DEFINE_RUNTIME_ENTRY(InlineCacheMissHandlerOneArg, 2) {
-  ASSERT(arguments.ArgCount() ==
-      kInlineCacheMissHandlerOneArgRuntimeEntry.argument_count());
   const Instance& receiver = Instance::CheckedHandle(arguments.ArgAt(0));
   const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(1));
   GrowableArray<const Instance*> args(1);
@@ -940,8 +903,6 @@
 //   Returns: target function with compiled code or null.
 // Modifies the instance call to hold the updated IC data array.
 DEFINE_RUNTIME_ENTRY(InlineCacheMissHandlerTwoArgs, 3) {
-  ASSERT(arguments.ArgCount() ==
-      kInlineCacheMissHandlerTwoArgsRuntimeEntry.argument_count());
   const Instance& receiver = Instance::CheckedHandle(arguments.ArgAt(0));
   const Instance& other = Instance::CheckedHandle(arguments.ArgAt(1));
   const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(2));
@@ -963,8 +924,6 @@
 //   Returns: target function with compiled code or null.
 // Modifies the instance call to hold the updated IC data array.
 DEFINE_RUNTIME_ENTRY(InlineCacheMissHandlerThreeArgs, 4) {
-  ASSERT(arguments.ArgCount() ==
-      kInlineCacheMissHandlerThreeArgsRuntimeEntry.argument_count());
   const Instance& receiver = Instance::CheckedHandle(arguments.ArgAt(0));
   const Instance& arg1 = Instance::CheckedHandle(arguments.ArgAt(1));
   const Instance& arg2 = Instance::CheckedHandle(arguments.ArgAt(2));
@@ -985,8 +944,6 @@
 // Arg1: argument 1.
 // Arg2: IC data object.
 DEFINE_RUNTIME_ENTRY(StaticCallMissHandlerTwoArgs, 3) {
-  ASSERT(arguments.ArgCount() ==
-      kStaticCallMissHandlerTwoArgsRuntimeEntry.argument_count());
   const Instance& arg0 = Instance::CheckedHandle(arguments.ArgAt(0));
   const Instance& arg1 = Instance::CheckedHandle(arguments.ArgAt(1));
   const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(2));
@@ -1025,8 +982,6 @@
 // InstanceFunctionLookup stub should be used (e.g., to invoke no such
 // method and implicit closures)..
 DEFINE_RUNTIME_ENTRY(MegamorphicCacheMissHandler, 3) {
-  ASSERT(arguments.ArgCount() ==
-     kMegamorphicCacheMissHandlerRuntimeEntry.argument_count());
   const Instance& receiver = Instance::CheckedHandle(arguments.ArgAt(0));
   const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(1));
   const Array& descriptor = Array::CheckedHandle(arguments.ArgAt(2));
@@ -1074,8 +1029,6 @@
 //   Arg2: Target's name.
 //   Arg3: ICData.
 DEFINE_RUNTIME_ENTRY(UpdateICDataTwoArgs, 4) {
-  ASSERT(arguments.ArgCount() ==
-      kUpdateICDataTwoArgsRuntimeEntry.argument_count());
   const Instance& receiver = Instance::CheckedHandle(arguments.ArgAt(0));
   const Instance& arg1 = Instance::CheckedHandle(arguments.ArgAt(1));
   const String& target_name = String::CheckedHandle(arguments.ArgAt(2));
@@ -1105,8 +1058,6 @@
 // Arg2: arguments descriptor array.
 // Arg3: arguments array.
 DEFINE_RUNTIME_ENTRY(InvokeNoSuchMethodFunction, 4) {
-  ASSERT(arguments.ArgCount() ==
-         kInvokeNoSuchMethodFunctionRuntimeEntry.argument_count());
   const Instance& receiver = Instance::CheckedHandle(arguments.ArgAt(0));
   const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(1));
   const Array& orig_arguments_desc = Array::CheckedHandle(arguments.ArgAt(2));
@@ -1135,8 +1086,6 @@
 // Arg0: arguments descriptor.
 // Arg1: arguments array, including non-closure object.
 DEFINE_RUNTIME_ENTRY(InvokeNonClosure, 2) {
-  ASSERT(arguments.ArgCount() ==
-         kInvokeNonClosureRuntimeEntry.argument_count());
   const Array& args_descriptor = Array::CheckedHandle(arguments.ArgAt(0));
   const Array& function_args = Array::CheckedHandle(arguments.ArgAt(1));
 
@@ -1206,8 +1155,6 @@
 //
 // 3. There is no such method.
 DEFINE_RUNTIME_ENTRY(InstanceFunctionLookup, 4) {
-  ASSERT(arguments.ArgCount() ==
-         kInstanceFunctionLookupRuntimeEntry.argument_count());
   const Instance& receiver = Instance::CheckedHandle(arguments.ArgAt(0));
   const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(1));
   const Array& args_descriptor = Array::CheckedHandle(arguments.ArgAt(2));
@@ -1311,8 +1258,6 @@
 
 
 DEFINE_RUNTIME_ENTRY(StackOverflow, 0) {
-  ASSERT(arguments.ArgCount() ==
-         kStackOverflowRuntimeEntry.argument_count());
 #if defined(USING_SIMULATOR)
   uword stack_pos = Simulator::Current()->get_register(SPREG);
 #else
@@ -1398,8 +1343,6 @@
 
 
 DEFINE_RUNTIME_ENTRY(TraceICCall, 2) {
-  ASSERT(arguments.ArgCount() ==
-         kTraceICCallRuntimeEntry.argument_count());
   const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(0));
   const Function& function = Function::CheckedHandle(arguments.ArgAt(1));
   DartFrameIterator iterator;
@@ -1420,8 +1363,6 @@
 // The requesting function can be already optimized (reoptimization).
 // Returns the Code object where to continue execution.
 DEFINE_RUNTIME_ENTRY(OptimizeInvokedFunction, 1) {
-  ASSERT(arguments.ArgCount() ==
-         kOptimizeInvokedFunctionRuntimeEntry.argument_count());
   const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
   ASSERT(!function.IsNull());
 
@@ -1443,9 +1384,6 @@
 // The caller must be a static call in a Dart frame, or an entry frame.
 // Patch static call to point to valid code's entry point.
 DEFINE_RUNTIME_ENTRY(FixCallersTarget, 0) {
-  ASSERT(arguments.ArgCount() ==
-      kFixCallersTargetRuntimeEntry.argument_count());
-
   StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
   StackFrame* frame = iterator.NextFrame();
   while (frame != NULL && (frame->IsStubFrame() || frame->IsExitFrame())) {
@@ -1884,7 +1822,6 @@
 //   Arg0: Field object;
 //   Arg1: Value that is being stored.
 DEFINE_RUNTIME_ENTRY(UpdateFieldCid, 2) {
-  ASSERT(arguments.ArgCount() == kUpdateFieldCidRuntimeEntry.argument_count());
   const Field& field = Field::CheckedHandle(arguments.ArgAt(0));
   const Object& value = Object::Handle(arguments.ArgAt(1));
   const intptr_t cid = value.GetClassId();
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index a50bf18..1e6ce14 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -63,7 +63,6 @@
 // Compile a function. Should call only if the function has not been compiled.
 //   Arg0: function object.
 DEFINE_RUNTIME_ENTRY(CompileFunction, 1) {
-  ASSERT(arguments.ArgCount() == kCompileFunctionRuntimeEntry.argument_count());
   const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
   ASSERT(!function.HasCode());
   const Error& error = Error::Handle(Compiler::CompileFunction(function));
diff --git a/runtime/vm/debugger_api_impl.cc b/runtime/vm/debugger_api_impl.cc
index 114de52..f9bbe1c 100644
--- a/runtime/vm/debugger_api_impl.cc
+++ b/runtime/vm/debugger_api_impl.cc
@@ -514,6 +514,8 @@
     return Api::NewHandle(isolate, Instance::Cast(target).Evaluate(expr));
   } else if (target.IsClass()) {
     return Api::NewHandle(isolate, Class::Cast(target).Evaluate(expr));
+  } else if (target.IsLibrary()) {
+    return Api::NewHandle(isolate, Library::Cast(target).Evaluate(expr));
   }
   return Api::NewError("%s: unsupported target type", CURRENT_FUNC);
 }
@@ -782,6 +784,19 @@
 }
 
 
+DART_EXPORT Dart_Handle Dart_GetLibraryFromId(intptr_t library_id) {
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate != NULL);
+  DARTSCOPE(isolate);
+  const Library& lib = Library::Handle(Library::GetLibrary(library_id));
+  if (lib.IsNull()) {
+    return Api::NewError("%s: %" Pd " is not a valid library id",
+                         CURRENT_FUNC, library_id);
+  }
+  return Api::NewHandle(isolate, lib.raw());
+}
+
+
 DART_EXPORT Dart_Handle Dart_GetLibraryImports(intptr_t library_id) {
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != NULL);
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index 4b4b458..b56bc15 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -1574,6 +1574,15 @@
   EXPECT_VALID(elem);
   EXPECT(Dart_IsString(elem));
   EXPECT_STREQ("tab", ToCString(elem));
+
+  res = Dart_EvaluateExpr(script_lib, NewString("l..add(11)..add(-5)"));
+  EXPECT_VALID(res);
+  // List l now has 5 elements.
+
+  len = Dart_EvaluateExpr(script_lib, NewString("l.length + 1"));
+  EXPECT_VALID(len);
+  EXPECT(Dart_IsNumber(len));
+  EXPECT_EQ(6, ToInt64(len));
 }
 
 
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index a57a46a..3c6e44e 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -161,7 +161,7 @@
       stacktrace_.SetFunctionAtFrame(null_slot, frame_func);
       stacktrace_.SetCodeAtFrame(null_slot, frame_code);
     }
-    // Move frames one slot down so that we can accomadate the new frame.
+    // Move frames one slot down so that we can accomodate the new frame.
     for (intptr_t i = start; i < Stacktrace::kPreallocatedStackdepth; i++) {
       intptr_t prev = (i - 1);
       frame_func = stacktrace_.FunctionAtFrame(i);
@@ -188,13 +188,7 @@
 }
 
 
-// Iterate through the stack frames and try to find a frame with an
-// exception handler. Once found, set the pc, sp and fp so that execution
-// can continue in that frame.
-static bool FindExceptionHandler(uword* handler_pc,
-                                 uword* handler_sp,
-                                 uword* handler_fp,
-                                 StacktraceBuilder* builder) {
+static void BuildStackTrace(StacktraceBuilder* builder) {
   StackFrameIterator frames(StackFrameIterator::kDontValidateFrames);
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
@@ -229,13 +223,17 @@
             builder->AddFrame(func, code, offset, dart_handler_found);
           }
         }
-        if (!handler_pc_set && frame->FindExceptionHandler(handler_pc)) {
+        bool needs_stacktrace = false;
+        bool is_catch_all = false;
+        uword handler_pc = kUwordMax;
+        if (!handler_pc_set &&
+            frame->FindExceptionHandler(&handler_pc,
+                                        &needs_stacktrace,
+                                        &is_catch_all)) {
           handler_pc_set = true;
-          *handler_sp = frame->sp();
-          *handler_fp = frame->fp();
           dart_handler_found = true;
           if (!builder->FullStacktrace()) {
-            return dart_handler_found;
+            return;
           }
         }
       }
@@ -245,16 +243,58 @@
     ASSERT(frame->IsEntryFrame());
     if (!handler_pc_set) {
       handler_pc_set = true;
-      *handler_pc = frame->pc();
-      *handler_sp = frame->sp();
-      *handler_fp = frame->fp();
       if (!builder->FullStacktrace()) {
-        return dart_handler_found;
+        return;
       }
     }
     frame = frames.NextFrame();
   }
-  return dart_handler_found;
+}
+
+
+// Iterate through the stack frames and try to find a frame with an
+// exception handler. Once found, set the pc, sp and fp so that execution
+// can continue in that frame. Sets 'needs_stacktrace' if there is no
+// cath-all handler or if a stack-trace is specified in the catch.
+static bool FindExceptionHandler(uword* handler_pc,
+                                 uword* handler_sp,
+                                 uword* handler_fp,
+                                 bool* needs_stacktrace) {
+  StackFrameIterator frames(StackFrameIterator::kDontValidateFrames);
+  StackFrame* frame = frames.NextFrame();
+  ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
+  bool handler_pc_set = false;
+  *needs_stacktrace = false;
+  bool is_catch_all = false;
+  uword temp_handler_pc = kUwordMax;
+  while (!frame->IsEntryFrame()) {
+    if (frame->IsDartFrame()) {
+      if (frame->FindExceptionHandler(&temp_handler_pc,
+                                      needs_stacktrace,
+                                      &is_catch_all)) {
+        if (!handler_pc_set) {
+          handler_pc_set = true;
+          *handler_pc = temp_handler_pc;
+          *handler_sp = frame->sp();
+          *handler_fp = frame->fp();
+        }
+        if (*needs_stacktrace || is_catch_all) {
+          return true;
+        }
+      }
+    }  // if frame->IsDartFrame
+    frame = frames.NextFrame();
+    ASSERT(frame != NULL);
+  }  // while !frame->IsEntryFrame
+  ASSERT(frame->IsEntryFrame());
+  if (!handler_pc_set) {
+    *handler_pc = frame->pc();
+    *handler_sp = frame->sp();
+    *handler_fp = frame->fp();
+  }
+  // No catch-all encountered, needs stacktrace.
+  *needs_stacktrace = true;
+  return handler_pc_set;
 }
 
 
@@ -325,6 +365,10 @@
 
 
 static RawField* LookupStacktraceField(const Instance& instance) {
+  if (instance.GetClassId() < kNumPredefinedCids) {
+    // 'class Error' is not a predefined class.
+    return Field::null();
+  }
   Isolate* isolate = Isolate::Current();
   Class& error_class = Class::Handle(isolate,
                                      isolate->object_store()->error_class());
@@ -334,15 +378,18 @@
     ASSERT(!error_class.IsNull());
     isolate->object_store()->set_error_class(error_class);
   }
-  const Class& instance_class = Class::Handle(isolate, instance.clazz());
-  Error& malformed_type_error = Error::Handle(isolate);
-  if (instance_class.IsSubtypeOf(Object::null_abstract_type_arguments(),
-                                 error_class,
-                                 Object::null_abstract_type_arguments(),
-                                 &malformed_type_error)) {
-    ASSERT(malformed_type_error.IsNull());
-    return error_class.LookupInstanceField(Symbols::_stackTrace());
-  }
+  // If instance class extends 'class Error' return '_stackTrace' field.
+  Class& test_class = Class::Handle(isolate, instance.clazz());
+  AbstractType& type = AbstractType::Handle(isolate, AbstractType::null());
+  while (true) {
+    if (test_class.raw() == error_class.raw()) {
+      return error_class.LookupInstanceField(Symbols::_stackTrace());
+    }
+    type = test_class.super_type();
+    if (type.IsNull()) return Field::null();
+    test_class = type.type_class();
+  };
+  UNREACHABLE();
   return Field::null();
 }
 
@@ -364,56 +411,59 @@
   uword handler_fp = 0;
   Stacktrace& stacktrace = Stacktrace::Handle(isolate);
   bool handler_exists = false;
+  bool handler_needs_stacktrace = false;
   if (use_preallocated_stacktrace) {
     stacktrace ^= isolate->object_store()->preallocated_stack_trace();
     PreallocatedStacktraceBuilder frame_builder(stacktrace);
     handler_exists = FindExceptionHandler(&handler_pc,
                                           &handler_sp,
                                           &handler_fp,
-                                          &frame_builder);
+                                          &handler_needs_stacktrace);
+    if (handler_needs_stacktrace) {
+      BuildStackTrace(&frame_builder);
+    }
   } else {
+    // Get stacktrace field of class Error.
     const Field& stacktrace_field =
-        Field::Handle(LookupStacktraceField(exception));
+        Field::Handle(isolate, LookupStacktraceField(exception));
     bool full_stacktrace = !stacktrace_field.IsNull();
-    RegularStacktraceBuilder frame_builder(full_stacktrace);
     handler_exists = FindExceptionHandler(&handler_pc,
                                           &handler_sp,
                                           &handler_fp,
-                                          &frame_builder);
-    // Create arrays for function, code and pc_offset triplet of each frame.
-    const Array& func_array =
-        Array::Handle(isolate, Array::MakeArray(frame_builder.func_list()));
-    const Array& code_array =
-        Array::Handle(isolate, Array::MakeArray(frame_builder.code_list()));
-    const Array& pc_offset_array =
-        Array::Handle(isolate,
-                      Array::MakeArray(frame_builder.pc_offset_list()));
-    if (!stacktrace_field.IsNull()) {
-      // This is an error object and we need to capture the full stack trace
-      // here implicitly, so we set up the stack trace. The stack trace field
-      // is set only once, it is not overriden.
-      const Array& catch_func_array =
-          Array::Handle(isolate,
-                        Array::MakeArray(frame_builder.catch_func_list()));
-      const Array& catch_code_array =
-          Array::Handle(isolate,
-                        Array::MakeArray(frame_builder.catch_code_list()));
-      const Array& catch_pc_offset_array =
-          Array::Handle(isolate,
-                        Array::MakeArray(frame_builder.catch_pc_offset_list()));
-      stacktrace = Stacktrace::New(func_array, code_array, pc_offset_array);
-      stacktrace.SetCatchStacktrace(catch_func_array,
-                                    catch_code_array,
-                                    catch_pc_offset_array);
-      if (exception.GetField(stacktrace_field) == Object::null()) {
-        exception.SetField(stacktrace_field, stacktrace);
-      }
-    }
-    // TODO(5411263): At some point we can optimize by figuring out if a
-    // stack trace is needed based on whether the catch code specifies a
-    // stack trace object or there is a rethrow in the catch clause.
-    if (existing_stacktrace.IsNull()) {
+                                          &handler_needs_stacktrace);
+    Array& func_array = Array::Handle(isolate, Object::empty_array().raw());
+    Array& code_array = Array::Handle(isolate, Object::empty_array().raw());
+    Array& pc_offset_array =
+        Array::Handle(isolate, Object::empty_array().raw());
+    if (handler_needs_stacktrace || full_stacktrace) {
+      RegularStacktraceBuilder frame_builder(full_stacktrace);
+      BuildStackTrace(&frame_builder);
+
+      // Create arrays for function, code and pc_offset triplet of each frame.
+      func_array = Array::MakeArray(frame_builder.func_list());
+      code_array = Array::MakeArray(frame_builder.code_list());
+      pc_offset_array = Array::MakeArray(frame_builder.pc_offset_list());
+      if (!stacktrace_field.IsNull()) {
+        // This is an error object and we need to capture the full stack trace
+        // here implicitly, so we set up the stack trace. The stack trace field
+        // is set only once, it is not overriden.
+        const Array& catch_func_array = Array::Handle(isolate,
+            Array::MakeArray(frame_builder.catch_func_list()));
+        const Array& catch_code_array = Array::Handle(isolate,
+            Array::MakeArray(frame_builder.catch_code_list()));
+        const Array& catch_pc_offset_array = Array::Handle(isolate,
+            Array::MakeArray(frame_builder.catch_pc_offset_list()));
         stacktrace = Stacktrace::New(func_array, code_array, pc_offset_array);
+        stacktrace.SetCatchStacktrace(catch_func_array,
+                                      catch_code_array,
+                                      catch_pc_offset_array);
+        if (exception.GetField(stacktrace_field) == Object::null()) {
+          exception.SetField(stacktrace_field, stacktrace);
+        }
+      }  // if stacktrace needed.
+    }
+    if (existing_stacktrace.IsNull()) {
+      stacktrace = Stacktrace::New(func_array, code_array, pc_offset_array);
     } else {
       stacktrace ^= existing_stacktrace.raw();
       if (pc_offset_array.Length() != 0) {
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index ce28a04..7033250 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -58,6 +58,7 @@
     last_used_block_id_(0),  // 0 is used for the graph entry.
     context_level_(0),
     try_index_(CatchClauseNode::kInvalidTryIndex),
+    catch_try_index_(CatchClauseNode::kInvalidTryIndex),
     loop_depth_(0),
     graph_entry_(NULL),
     args_pushed_(0),
@@ -2753,6 +2754,7 @@
           node->token_pos(),
           node->cls(),
           getter_name,
+          NULL,  // No Arguments to getter.
           InvocationMirror::EncodeType(
               node->cls().IsTopLevel() ?
                   InvocationMirror::kTopLevel :
@@ -2802,10 +2804,13 @@
           result_is_needed);  // Save last arg if result is needed.
     } else {
       // Throw a NoSuchMethodError.
+      ArgumentListNode* arguments = new ArgumentListNode(node->token_pos());
+      arguments->Add(node->value());
       call = BuildThrowNoSuchMethodError(
           node->token_pos(),
           node->cls(),
           setter_name,
+          arguments,  // Argument is the value passed to the setter.
           InvocationMirror::EncodeType(
             node->cls().IsTopLevel() ?
                 InvocationMirror::kTopLevel :
@@ -2875,16 +2880,21 @@
 }
 
 
+static LoadLocalInstr* BuildLoadThisVar(LocalScope* scope) {
+  LocalVariable* receiver_var = scope->LookupVariable(Symbols::This(),
+                                                      true);  // Test only.
+  return new LoadLocalInstr(*receiver_var);
+}
+
+
 void EffectGraphVisitor::VisitNativeBodyNode(NativeBodyNode* node) {
   const Function& function = owner()->parsed_function()->function();
   if (!function.IsClosureFunction()) {
     MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(function);
     switch (kind) {
-      case MethodRecognizer::kStringBaseLength: {
-        LocalVariable* receiver_var =
-            node->scope()->LookupVariable(Symbols::This(),
-                                          true);  // Test only.
-        Value* receiver = Bind(new LoadLocalInstr(*receiver_var));
+      case MethodRecognizer::kStringBaseLength:
+      case MethodRecognizer::kStringBaseIsEmpty: {
+        Value* receiver = Bind(BuildLoadThisVar(node->scope()));
         // Treat length loads as mutable (i.e. affected by side effects) to
         // avoid hoisting them since we can't hoist the preceding class-check.
         // This is because of externalization of strings that affects their
@@ -2897,16 +2907,24 @@
             is_immutable);
         load->set_result_cid(kSmiCid);
         load->set_recognized_kind(MethodRecognizer::kStringBaseLength);
-        return ReturnDefinition(load);
+        if (kind == MethodRecognizer::kStringBaseLength) {
+          return ReturnDefinition(load);
+        }
+        ASSERT(kind == MethodRecognizer::kStringBaseIsEmpty);
+        Value* zero_val = Bind(new ConstantInstr(Smi::ZoneHandle(Smi::New(0))));
+        Value* load_val = Bind(load);
+        StrictCompareInstr* compare =
+            new StrictCompareInstr(node->token_pos(),
+                                   Token::kEQ_STRICT,
+                                   load_val,
+                                   zero_val);
+        return ReturnDefinition(compare);
       }
       case MethodRecognizer::kGrowableArrayLength:
       case MethodRecognizer::kObjectArrayLength:
       case MethodRecognizer::kImmutableArrayLength:
       case MethodRecognizer::kTypedDataLength: {
-        LocalVariable* receiver_var =
-            node->scope()->LookupVariable(Symbols::This(),
-                                          true);  // Test only.
-        Value* receiver = Bind(new LoadLocalInstr(*receiver_var));
+        Value* receiver = Bind(BuildLoadThisVar(node->scope()));
         const bool is_immutable =
             (kind != MethodRecognizer::kGrowableArrayLength);
         LoadFieldInstr* load = new LoadFieldInstr(
@@ -2918,6 +2936,27 @@
         load->set_recognized_kind(kind);
         return ReturnDefinition(load);
       }
+      case MethodRecognizer::kObjectCid: {
+        Value* receiver = Bind(BuildLoadThisVar(node->scope()));
+        LoadClassIdInstr* load = new LoadClassIdInstr(receiver);
+        return ReturnDefinition(load);
+      }
+      case MethodRecognizer::kGrowableArrayCapacity: {
+        Value* receiver = Bind(BuildLoadThisVar(node->scope()));
+        LoadFieldInstr* data_load = new LoadFieldInstr(
+            receiver,
+            Array::data_offset(),
+            Type::ZoneHandle(Type::DynamicType()));
+        data_load->set_result_cid(kArrayCid);
+        Value* data = Bind(data_load);
+        LoadFieldInstr* length_load = new LoadFieldInstr(
+            data,
+            Array::length_offset(),
+            Type::ZoneHandle(Type::SmiType()));
+        length_load->set_result_cid(kSmiCid);
+        length_load->set_recognized_kind(MethodRecognizer::kObjectArrayLength);
+        return ReturnDefinition(length_load);
+      }
       default:
         break;
     }
@@ -3428,7 +3467,7 @@
 void EffectGraphVisitor::VisitTryCatchNode(TryCatchNode* node) {
   InlineBailout("EffectGraphVisitor::VisitTryCatchNode (exception)");
   intptr_t original_handler_index = owner()->try_index();
-  intptr_t try_handler_index = node->try_index();
+  const intptr_t try_handler_index = node->try_index();
   ASSERT(try_handler_index != original_handler_index);
   owner()->set_try_index(try_handler_index);
 
@@ -3464,9 +3503,13 @@
       ? original_handler_index
       : catch_block->catch_handler_index();
 
+  const intptr_t prev_catch_try_index = owner()->catch_try_index();
+
   owner()->set_try_index(catch_handler_index);
+  owner()->set_catch_try_index(try_handler_index);
   EffectGraphVisitor for_catch(owner(), temp_index());
   catch_block->Visit(&for_catch);
+  owner()->set_catch_try_index(prev_catch_try_index);
 
   // NOTE: The implicit variables ':saved_context', ':exception_var'
   // and ':stacktrace_var' can never be captured variables.
@@ -3479,7 +3522,8 @@
                                catch_block->handler_types(),
                                try_handler_index,
                                catch_block->exception_var(),
-                               catch_block->stacktrace_var());
+                               catch_block->stacktrace_var(),
+                               catch_block->needs_stacktrace());
   owner()->AddCatchEntry(catch_entry);
   ASSERT(!for_catch.is_open());
   AppendFragment(catch_entry, for_catch);
@@ -3507,7 +3551,8 @@
       Value* stacktrace = for_finally.Bind(
           for_finally.BuildLoadLocal(catch_block->stacktrace_var()));
       for_finally.PushArgument(stacktrace);
-      for_finally.AddInstruction(new ReThrowInstr(catch_block->token_pos()));
+      for_finally.AddInstruction(
+          new ReThrowInstr(catch_block->token_pos(), catch_handler_index));
       for_finally.CloseFragment();
     }
     ASSERT(!for_finally.is_open());
@@ -3520,7 +3565,8 @@
                                  types,
                                  catch_handler_index,
                                  catch_block->exception_var(),
-                                 catch_block->stacktrace_var());
+                                 catch_block->stacktrace_var(),
+                                 catch_block->needs_stacktrace());
     owner()->AddCatchEntry(finally_entry);
     AppendFragment(finally_entry, for_finally);
   }
@@ -3571,6 +3617,7 @@
     intptr_t token_pos,
     const Class& function_class,
     const String& function_name,
+    ArgumentListNode* function_arguments,
     int invocation_type) {
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>();
@@ -3595,13 +3642,25 @@
       Smi::ZoneHandle(Smi::New(invocation_type))));
   arguments->Add(PushArgument(invocation_type_value));
   // List arguments.
-  // TODO(regis): Pass arguments.
-  Value* arguments_value = Bind(new ConstantInstr(Array::ZoneHandle()));
-  arguments->Add(PushArgument(arguments_value));
+  if (function_arguments == NULL) {
+    Value* arguments_value = Bind(new ConstantInstr(Array::ZoneHandle()));
+    arguments->Add(PushArgument(arguments_value));
+  } else {
+    ValueGraphVisitor array_val(owner(), temp_index());
+    ArrayNode* array =
+        new ArrayNode(token_pos, Type::ZoneHandle(Type::ArrayType()),
+                      function_arguments->nodes());
+    array->Visit(&array_val);
+    Append(array_val);
+    arguments->Add(PushArgument(array_val.value()));
+  }
   // List argumentNames.
-  Value* argument_names_value =
-      Bind(new ConstantInstr(Array::ZoneHandle()));
+  ConstantInstr* cinstr = new ConstantInstr(
+      (function_arguments == NULL) ? Array::ZoneHandle()
+                                   : function_arguments->names());
+  Value* argument_names_value = Bind(cinstr);
   arguments->Add(PushArgument(argument_names_value));
+
   // List existingArgumentNames.
   Value* existing_argument_names_value =
       Bind(new ConstantInstr(Array::ZoneHandle()));
@@ -3639,7 +3698,7 @@
     node->stacktrace()->Visit(&for_stack_trace);
     Append(for_stack_trace);
     PushArgument(for_stack_trace.value());
-    instr = new ReThrowInstr(node->token_pos());
+    instr = new ReThrowInstr(node->token_pos(), owner()->catch_try_index());
   }
   AddInstruction(instr);
 }
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 84ba8c0..4a8457b 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -128,6 +128,10 @@
   void set_try_index(intptr_t value) { try_index_ = value; }
   intptr_t try_index() const { return try_index_; }
 
+  // Manage the currently active catch-handler try index.
+  void set_catch_try_index(intptr_t value) { catch_try_index_ = value; }
+  intptr_t catch_try_index() const { return catch_try_index_; }
+
   void AddCatchEntry(CatchBlockEntryInstr* entry);
 
   intptr_t num_copied_params() const {
@@ -169,6 +173,7 @@
   intptr_t last_used_block_id_;
   intptr_t context_level_;
   intptr_t try_index_;
+  intptr_t catch_try_index_;
   intptr_t loop_depth_;
   GraphEntryInstr* graph_entry_;
 
@@ -356,10 +361,12 @@
       ArgumentListNode* method_arguments,
       bool save_last_arg);
 
-  StaticCallInstr* BuildThrowNoSuchMethodError(intptr_t token_pos,
-                                               const Class& function_class,
-                                               const String& function_name,
-                                               int invocation_type);
+  StaticCallInstr* BuildThrowNoSuchMethodError(
+      intptr_t token_pos,
+      const Class& function_class,
+      const String& function_name,
+      ArgumentListNode* function_arguments,
+      int invocation_type);
 
   void BuildStaticSetter(StaticSetterNode* node, bool result_is_needed);
   Definition* BuildStoreStaticField(StoreStaticFieldNode* node,
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index f8b752a..8c305d0 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -315,11 +315,18 @@
 void FlowGraphCompiler::AddExceptionHandler(intptr_t try_index,
                                             intptr_t outer_try_index,
                                             intptr_t pc_offset,
-                                            const Array& handler_types) {
+                                            const Array& handler_types,
+                                            bool needs_stacktrace) {
   exception_handlers_list_->AddHandler(try_index,
                                        outer_try_index,
                                        pc_offset,
-                                       handler_types);
+                                       handler_types,
+                                       needs_stacktrace);
+}
+
+
+void FlowGraphCompiler::SetNeedsStacktrace(intptr_t try_index) {
+  exception_handlers_list_->SetNeedsStacktrace(try_index);
 }
 
 
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 8847f8c..a5369ec 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -285,6 +285,7 @@
   void GenerateCallRuntime(intptr_t token_pos,
                            intptr_t deopt_id,
                            const RuntimeEntry& entry,
+                           intptr_t argument_count,
                            LocationSummary* locs);
 
   void GenerateCall(intptr_t token_pos,
@@ -401,7 +402,9 @@
   void AddExceptionHandler(intptr_t try_index,
                            intptr_t outer_try_index,
                            intptr_t pc_offset,
-                           const Array& handler_types);
+                           const Array& handler_types,
+                           bool needs_stacktrace);
+  void SetNeedsStacktrace(intptr_t try_index);
   void AddCurrentDescriptor(PcDescriptors::Kind kind,
                             intptr_t deopt_id,
                             intptr_t token_pos);
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index b8a6025..b65b83b 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -603,7 +603,7 @@
     __ PushList((1 << R1) | (1 << R2));
     __ LoadObject(R0, test_cache);
     __ Push(R0);
-    GenerateCallRuntime(token_pos, deopt_id, kInstanceofRuntimeEntry, locs);
+    GenerateCallRuntime(token_pos, deopt_id, kInstanceofRuntimeEntry, 5, locs);
     // Pop the parameters supplied to the runtime entry. The result of the
     // instanceof runtime call will be left as the result of the operation.
     __ Drop(5);
@@ -685,6 +685,7 @@
     GenerateCallRuntime(token_pos,
                         deopt_id,
                         kMalformedTypeErrorRuntimeEntry,
+                        3,
                         locs);
     // We should never return here.
     __ bkpt(0);
@@ -711,7 +712,7 @@
   __ PushObject(dst_name);  // Push the name of the destination.
   __ LoadObject(R0, test_cache);
   __ Push(R0);
-  GenerateCallRuntime(token_pos, deopt_id, kTypeCheckRuntimeEntry, locs);
+  GenerateCallRuntime(token_pos, deopt_id, kTypeCheckRuntimeEntry, 6, locs);
   // Pop the parameters supplied to the runtime entry. The result of the
   // type check runtime call is the checked value.
   __ Drop(6);
@@ -1256,8 +1257,9 @@
 void FlowGraphCompiler::GenerateCallRuntime(intptr_t token_pos,
                                             intptr_t deopt_id,
                                             const RuntimeEntry& entry,
+                                            intptr_t argument_count,
                                             LocationSummary* locs) {
-  __ CallRuntime(entry);
+  __ CallRuntime(entry, argument_count);
   AddCurrentDescriptor(PcDescriptors::kOther, deopt_id, token_pos);
   RecordSafepoint(locs);
   if (deopt_id != Isolate::kNoDeoptId) {
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 4eb2ea1..9ca6baa 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -618,6 +618,7 @@
     GenerateCallRuntime(token_pos,
                         deopt_id,
                         kInstanceofRuntimeEntry,
+                        5,
                         locs);
     // Pop the parameters supplied to the runtime entry. The result of the
     // instanceof runtime call will be left as the result of the operation.
@@ -705,6 +706,7 @@
     GenerateCallRuntime(token_pos,
                         deopt_id,
                         kMalformedTypeErrorRuntimeEntry,
+                        3,
                         locs);
     // We should never return here.
     __ int3();
@@ -731,7 +733,7 @@
   __ PushObject(dst_name);  // Push the name of the destination.
   __ LoadObject(EAX, test_cache);
   __ pushl(EAX);
-  GenerateCallRuntime(token_pos, deopt_id, kTypeCheckRuntimeEntry, locs);
+  GenerateCallRuntime(token_pos, deopt_id, kTypeCheckRuntimeEntry, 6, locs);
   // Pop the parameters supplied to the runtime entry. The result of the
   // type check runtime call is the checked value.
   __ Drop(6);
@@ -1263,8 +1265,9 @@
 void FlowGraphCompiler::GenerateCallRuntime(intptr_t token_pos,
                                             intptr_t deopt_id,
                                             const RuntimeEntry& entry,
+                                            intptr_t argument_count,
                                             LocationSummary* locs) {
-  __ CallRuntime(entry);
+  __ CallRuntime(entry, argument_count);
   AddCurrentDescriptor(PcDescriptors::kOther, deopt_id, token_pos);
   RecordSafepoint(locs);
   if (deopt_id != Isolate::kNoDeoptId) {
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index c428d74..f3bbf2f 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -607,7 +607,7 @@
     __ sw(A1, Address(SP, 1 * kWordSize));  // Push type arguments.
     __ LoadObject(A0, test_cache);
     __ sw(A0, Address(SP, 0 * kWordSize));
-    GenerateCallRuntime(token_pos, deopt_id, kInstanceofRuntimeEntry, locs);
+    GenerateCallRuntime(token_pos, deopt_id, kInstanceofRuntimeEntry, 5, locs);
     // Pop the parameters supplied to the runtime entry. The result of the
     // instanceof runtime call will be left as the result of the operation.
     __ lw(T0, Address(SP, 5 * kWordSize));
@@ -698,6 +698,7 @@
     GenerateCallRuntime(token_pos,
                         deopt_id,
                         kMalformedTypeErrorRuntimeEntry,
+                        3,
                         locs);
     // We should never return here.
     __ break_(0);
@@ -733,7 +734,7 @@
   __ LoadObject(T0, test_cache);
   __ sw(T0, Address(SP, 0 * kWordSize));
 
-  GenerateCallRuntime(token_pos, deopt_id, kTypeCheckRuntimeEntry, locs);
+  GenerateCallRuntime(token_pos, deopt_id, kTypeCheckRuntimeEntry, 6, locs);
   // Pop the parameters supplied to the runtime entry. The result of the
   // type check runtime call is the checked value.
   __ lw(A0, Address(SP, 6 * kWordSize));
@@ -1300,8 +1301,9 @@
 void FlowGraphCompiler::GenerateCallRuntime(intptr_t token_pos,
                                             intptr_t deopt_id,
                                             const RuntimeEntry& entry,
+                                            intptr_t argument_count,
                                             LocationSummary* locs) {
-  __ CallRuntime(entry);
+  __ CallRuntime(entry, argument_count);
   AddCurrentDescriptor(PcDescriptors::kOther, deopt_id, token_pos);
   RecordSafepoint(locs);
   if (deopt_id != Isolate::kNoDeoptId) {
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 71d8a9c..3d9b852d 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -615,6 +615,7 @@
     GenerateCallRuntime(token_pos,
                         deopt_id,
                         kInstanceofRuntimeEntry,
+                        5,
                         locs);
     // Pop the parameters supplied to the runtime entry. The result of the
     // instanceof runtime call will be left as the result of the operation.
@@ -699,6 +700,7 @@
     GenerateCallRuntime(token_pos,
                         deopt_id,
                         kMalformedTypeErrorRuntimeEntry,
+                        3,
                         locs);
     // We should never return here.
     __ int3();
@@ -725,7 +727,7 @@
   __ PushObject(dst_name);  // Push the name of the destination.
   __ LoadObject(RAX, test_cache);
   __ pushq(RAX);
-  GenerateCallRuntime(token_pos, deopt_id, kTypeCheckRuntimeEntry, locs);
+  GenerateCallRuntime(token_pos, deopt_id, kTypeCheckRuntimeEntry, 6, locs);
   // Pop the parameters supplied to the runtime entry. The result of the
   // type check runtime call is the checked value.
   __ Drop(6);
@@ -1258,8 +1260,9 @@
 void FlowGraphCompiler::GenerateCallRuntime(intptr_t token_pos,
                                             intptr_t deopt_id,
                                             const RuntimeEntry& entry,
+                                            intptr_t argument_count,
                                             LocationSummary* locs) {
-  __ CallRuntime(entry);
+  __ CallRuntime(entry, argument_count);
   AddCurrentDescriptor(PcDescriptors::kOther, deopt_id, token_pos);
   RecordSafepoint(locs);
   if (deopt_id != Isolate::kNoDeoptId) {
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 4558352..6ecb193 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -510,14 +510,6 @@
       return false;
     }
 
-    // Abort if the callee has an intrinsic translation.
-    if (Intrinsifier::CanIntrinsify(function) &&
-        !function.is_optimizable()) {
-      function.set_is_inlinable(false);
-      TRACE_INLINING(OS::Print("     Bailout: can intrinsify\n"));
-      return false;
-    }
-
     Isolate* isolate = Isolate::Current();
     // Save and clear deopt id.
     const intptr_t prev_deopt_id = isolate->deopt_id();
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index ff732c0..05cb407 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -1408,29 +1408,6 @@
 }
 
 
-void FlowGraphOptimizer::InlineGrowableArrayCapacityGetter(
-    InstanceCallInstr* call) {
-  AddReceiverCheck(call);
-
-  // TODO(srdjan): type of load should be GrowableObjectArrayType.
-  LoadFieldInstr* data_load = new LoadFieldInstr(
-      new Value(call->ArgumentAt(0)),
-      Array::data_offset(),
-      Type::ZoneHandle(Type::DynamicType()));
-  data_load->set_result_cid(kArrayCid);
-  InsertBefore(call, data_load, NULL, Definition::kValue);
-
-  LoadFieldInstr* length_load = new LoadFieldInstr(
-      new Value(data_load),
-      Array::length_offset(),
-      Type::ZoneHandle(Type::SmiType()));
-  length_load->set_result_cid(kSmiCid);
-  length_load->set_recognized_kind(MethodRecognizer::kObjectArrayLength);
-
-  ReplaceCall(call, length_load);
-}
-
-
 static LoadFieldInstr* BuildLoadStringLength(Definition* str) {
   // Treat length loads as mutable (i.e. affected by side effects) to avoid
   // hoisting them since we can't hoist the preceding class-check. This
@@ -1447,28 +1424,6 @@
 }
 
 
-void FlowGraphOptimizer::InlineStringIsEmptyGetter(InstanceCallInstr* call) {
-  AddReceiverCheck(call);
-
-  LoadFieldInstr* load = BuildLoadStringLength(call->ArgumentAt(0));
-  InsertBefore(call, load, NULL, Definition::kValue);
-
-  ConstantInstr* zero = flow_graph()->GetConstant(Smi::Handle(Smi::New(0)));
-  StrictCompareInstr* compare =
-      new StrictCompareInstr(call->token_pos(),
-                             Token::kEQ_STRICT,
-                             new Value(load),
-                             new Value(zero));
-  ReplaceCall(call, compare);
-}
-
-
-void FlowGraphOptimizer::InlineObjectCid(InstanceCallInstr* call) {
-  LoadClassIdInstr* load = new LoadClassIdInstr(new Value(call->ArgumentAt(0)));
-  ReplaceCall(call, load);
-}
-
-
 bool FlowGraphOptimizer::InlineFloat32x4Getter(InstanceCallInstr* call,
                                                MethodRecognizer::Kind getter) {
   if (!ShouldInlineSimd()) {
@@ -1649,20 +1604,6 @@
 
   // VM objects length getter.
   switch (recognized_kind) {
-    case MethodRecognizer::kObjectCid: {
-      InlineObjectCid(call);
-      return true;
-    }
-    case MethodRecognizer::kGrowableArrayCapacity:
-      InlineGrowableArrayCapacityGetter(call);
-      return true;
-    case MethodRecognizer::kStringBaseIsEmpty:
-      if (!ic_data.HasOneTarget()) {
-        // Target is not only StringBase_get_isEmpty.
-        return false;
-      }
-      InlineStringIsEmptyGetter(call);
-      return true;
     case MethodRecognizer::kFloat32x4ShuffleX:
     case MethodRecognizer::kFloat32x4ShuffleY:
     case MethodRecognizer::kFloat32x4ShuffleZ:
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index 117ea99..aad40dc 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -156,9 +156,6 @@
   bool InlineUint32x4BinaryOp(InstanceCallInstr* call,
                               Token::Kind op_kind);
   void InlineImplicitInstanceGetter(InstanceCallInstr* call);
-  void InlineGrowableArrayCapacityGetter(InstanceCallInstr* call);
-  void InlineStringIsEmptyGetter(InstanceCallInstr* call);
-  void InlineObjectCid(InstanceCallInstr* call);
 
   RawBool* InstanceOfAsBool(const ICData& ic_data,
                             const AbstractType& type) const;
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 0c5b53b..67b66e4 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -1516,13 +1516,15 @@
                        const Array& handler_types,
                        intptr_t catch_try_index,
                        const LocalVariable& exception_var,
-                       const LocalVariable& stacktrace_var)
+                       const LocalVariable& stacktrace_var,
+                       bool needs_stacktrace)
       : BlockEntryInstr(block_id, try_index),
         predecessor_(NULL),
         catch_handler_types_(Array::ZoneHandle(handler_types.raw())),
         catch_try_index_(catch_try_index),
         exception_var_(exception_var),
-        stacktrace_var_(stacktrace_var) { }
+        stacktrace_var_(stacktrace_var),
+        needs_stacktrace_(needs_stacktrace) { }
 
   DECLARE_INSTRUCTION(CatchBlockEntry)
 
@@ -1537,6 +1539,8 @@
   const LocalVariable& exception_var() const { return exception_var_; }
   const LocalVariable& stacktrace_var() const { return stacktrace_var_; }
 
+  bool needs_stacktrace() const { return needs_stacktrace_; }
+
   // Returns try index for the try block to which this catch handler
   // corresponds.
   intptr_t catch_try_index() const {
@@ -1563,6 +1567,7 @@
   GrowableArray<Definition*> initial_definitions_;
   const LocalVariable& exception_var_;
   const LocalVariable& stacktrace_var_;
+  const bool needs_stacktrace_;
 
   DISALLOW_COPY_AND_ASSIGN(CatchBlockEntryInstr);
 };
@@ -1981,13 +1986,17 @@
 
 class ReThrowInstr : public TemplateInstruction<0> {
  public:
-  explicit ReThrowInstr(intptr_t token_pos) : token_pos_(token_pos) { }
+  // 'catch_try_index' can be CatchClauseNode::kInvalidTryIndex if the
+  // rethrow has been artifically generated by the parser.
+  ReThrowInstr(intptr_t token_pos, intptr_t catch_try_index)
+      : token_pos_(token_pos), catch_try_index_(catch_try_index) {}
 
   DECLARE_INSTRUCTION(ReThrow)
 
   virtual intptr_t ArgumentCount() const { return 2; }
 
   intptr_t token_pos() const { return token_pos_; }
+  intptr_t catch_try_index() const { return catch_try_index_; }
 
   virtual bool CanDeoptimize() const { return true; }
 
@@ -1997,6 +2006,7 @@
 
  private:
   const intptr_t token_pos_;
+  const intptr_t catch_try_index_;
 
   DISALLOW_COPY_AND_ASSIGN(ReThrowInstr);
 };
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 01f1c16..a0cc46a 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -249,6 +249,7 @@
   compiler->GenerateCallRuntime(token_pos,
                                 deopt_id,
                                 kConditionTypeErrorRuntimeEntry,
+                                1,
                                 locs);
   // We should never return here.
   __ bkpt(0);
@@ -1799,7 +1800,7 @@
 
     __ Push(field_reg);
     __ Push(value_reg);
-    __ CallRuntime(kUpdateFieldCidRuntimeEntry);
+    __ CallRuntime(kUpdateFieldCidRuntimeEntry, 2);
     __ Drop(2);  // Drop the field and the value.
   }
 
@@ -1952,6 +1953,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kAllocateObjectWithBoundsCheckRuntimeEntry,
+                                3,
                                 locs());
   __ Drop(3);
   ASSERT(locs()->out().reg() == R0);
@@ -1999,6 +2001,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kInstantiateTypeRuntimeEntry,
+                                2,
                                 locs());
   __ Drop(2);  // Drop instantiator and uninstantiated type.
   __ Pop(result_reg);  // Pop instantiated type.
@@ -2045,6 +2048,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kInstantiateTypeArgumentsRuntimeEntry,
+                                2,
                                 locs());
   __ Drop(2);  // Drop instantiator and uninstantiated type arguments.
   __ Pop(result_reg);  // Pop instantiated type arguments.
@@ -2180,6 +2184,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kCloneContextRuntimeEntry,
+                                1,
                                 locs());
   __ Drop(1);  // Remove argument.
   __ Pop(result);  // Get result (cloned context).
@@ -2197,7 +2202,8 @@
   compiler->AddExceptionHandler(catch_try_index(),
                                 try_index(),
                                 compiler->assembler()->CodeSize(),
-                                catch_handler_types_);
+                                catch_handler_types_,
+                                needs_stacktrace());
 
   // Restore the pool pointer.
   __ LoadPoolPointer();
@@ -2250,6 +2256,7 @@
     compiler->GenerateCallRuntime(instruction_->token_pos(),
                                   instruction_->deopt_id(),
                                   kStackOverflowRuntimeEntry,
+                                  0,
                                   instruction_->locs());
 
     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
@@ -4184,7 +4191,7 @@
     // Args must be in D0 and D1, so move arg from Q1(== D3:D2) to D1.
     __ vmovd(D1, D2);
   }
-  __ CallRuntime(TargetFunction());
+  __ CallRuntime(TargetFunction(), InputCount());
   __ Bind(&skip_call);
 }
 
@@ -4433,6 +4440,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kThrowRuntimeEntry,
+                                1,
                                 locs());
   __ bkpt(0);
 }
@@ -4444,9 +4452,11 @@
 
 
 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  compiler->SetNeedsStacktrace(catch_try_index());
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kReThrowRuntimeEntry,
+                                2,
                                 locs());
   __ bkpt(0);
 }
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 31dbe54..a0aeebf 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -197,6 +197,7 @@
   compiler->GenerateCallRuntime(token_pos,
                                 deopt_id,
                                 kConditionTypeErrorRuntimeEntry,
+                                1,
                                 locs);
   // We should never return here.
   __ int3();
@@ -1887,7 +1888,7 @@
 
     __ pushl(field_reg);
     __ pushl(value_reg);
-    __ CallRuntime(kUpdateFieldCidRuntimeEntry);
+    __ CallRuntime(kUpdateFieldCidRuntimeEntry, 2);
     __ Drop(2);  // Drop the field and the value.
   }
 
@@ -2041,6 +2042,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kAllocateObjectWithBoundsCheckRuntimeEntry,
+                                3,
                                 locs());
   __ Drop(3);
   ASSERT(locs()->out().reg() == EAX);
@@ -2087,6 +2089,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kInstantiateTypeRuntimeEntry,
+                                2,
                                 locs());
   __ Drop(2);  // Drop instantiator and uninstantiated type.
   __ popl(result_reg);  // Pop instantiated type.
@@ -2134,6 +2137,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kInstantiateTypeArgumentsRuntimeEntry,
+                                2,
                                 locs());
   __ Drop(2);  // Drop instantiator and uninstantiated type arguments.
   __ popl(result_reg);  // Pop instantiated type arguments.
@@ -2271,6 +2275,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kCloneContextRuntimeEntry,
+                                1,
                                 locs());
   __ popl(result);  // Remove argument.
   __ popl(result);  // Get result (cloned context).
@@ -2288,7 +2293,8 @@
   compiler->AddExceptionHandler(catch_try_index(),
                                 try_index(),
                                 compiler->assembler()->CodeSize(),
-                                catch_handler_types_);
+                                catch_handler_types_,
+                                needs_stacktrace());
   if (HasParallelMove()) {
     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
   }
@@ -2336,6 +2342,7 @@
     compiler->GenerateCallRuntime(instruction_->token_pos(),
                                   instruction_->deopt_id(),
                                   kStackOverflowRuntimeEntry,
+                                  0,
                                   instruction_->locs());
 
     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
@@ -4242,7 +4249,7 @@
     // exp is Nan case is handled correctly in the C-library.
   }
   __ Bind(&do_call);
-  __ CallRuntime(TargetFunction());
+  __ CallRuntime(TargetFunction(), InputCount());
   __ fstpl(Address(ESP, 0));
   __ movsd(locs()->out().fpu_reg(), Address(ESP, 0));
   __ Bind(&skip_call);
@@ -4779,6 +4786,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kThrowRuntimeEntry,
+                                1,
                                 locs());
   __ int3();
 }
@@ -4790,9 +4798,11 @@
 
 
 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  compiler->SetNeedsStacktrace(catch_try_index());
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kReThrowRuntimeEntry,
+                                2,
                                 locs());
   __ int3();
 }
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 3d2f338..aa59591 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -252,6 +252,7 @@
   compiler->GenerateCallRuntime(token_pos,
                                 deopt_id,
                                 kConditionTypeErrorRuntimeEntry,
+                                1,
                                 locs);
   // We should never return here.
   __ break_(0);
@@ -1869,7 +1870,7 @@
     __ addiu(SP, SP, Immediate(-2 * kWordSize));
     __ sw(field_reg, Address(SP, 1 * kWordSize));
     __ sw(value_reg, Address(SP, 0 * kWordSize));
-    __ CallRuntime(kUpdateFieldCidRuntimeEntry);
+    __ CallRuntime(kUpdateFieldCidRuntimeEntry, 2);
     __ Drop(2);  // Drop the field and the value.
   }
 
@@ -2025,6 +2026,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kAllocateObjectWithBoundsCheckRuntimeEntry,
+                                3,
                                 locs());
   __ Drop(3);
   ASSERT(locs()->out().reg() == V0);
@@ -2077,6 +2079,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kInstantiateTypeRuntimeEntry,
+                                2,
                                 locs());
   // Pop instantiated type.
   __ lw(result_reg, Address(SP, 2 * kWordSize));
@@ -2130,6 +2133,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kInstantiateTypeArgumentsRuntimeEntry,
+                                2,
                                 locs());
   // Pop instantiated type arguments.
   __ lw(result_reg, Address(SP, 2 * kWordSize));
@@ -2272,6 +2276,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kCloneContextRuntimeEntry,
+                                1,
                                 locs());
   __ lw(result, Address(SP, 1 * kWordSize));  // Get result (cloned context).
   __ addiu(SP, SP, Immediate(2 * kWordSize));
@@ -2289,7 +2294,8 @@
   compiler->AddExceptionHandler(catch_try_index(),
                                 try_index(),
                                 compiler->assembler()->CodeSize(),
-                                catch_handler_types_);
+                                catch_handler_types_,
+                                needs_stacktrace());
   // Restore pool pointer.
   __ GetNextPC(CMPRES, TMP);
   const intptr_t object_pool_pc_dist =
@@ -2346,6 +2352,7 @@
     compiler->GenerateCallRuntime(instruction_->token_pos(),
                                   instruction_->deopt_id(),
                                   kStackOverflowRuntimeEntry,
+                                  0,
                                   instruction_->locs());
 
     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
@@ -3578,7 +3585,7 @@
   }
   __ Bind(&do_call);
   // double values are passed and returned in vfp registers.
-  __ CallRuntime(TargetFunction());
+  __ CallRuntime(TargetFunction(), InputCount());
   __ Bind(&skip_call);
 }
 
@@ -3829,6 +3836,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kThrowRuntimeEntry,
+                                1,
                                 locs());
   __ break_(0);
 }
@@ -3840,9 +3848,11 @@
 
 
 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  compiler->SetNeedsStacktrace(catch_try_index());
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kReThrowRuntimeEntry,
+                                2,
                                 locs());
   __ break_(0);
 }
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index b5cc607..8935d30 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -362,6 +362,7 @@
   compiler->GenerateCallRuntime(token_pos,
                                 deopt_id,
                                 kConditionTypeErrorRuntimeEntry,
+                                1,
                                 locs);
   // We should never return here.
   __ int3();
@@ -1832,7 +1833,7 @@
 
     __ pushq(field_reg);
     __ pushq(value_reg);
-    __ CallRuntime(kUpdateFieldCidRuntimeEntry);
+    __ CallRuntime(kUpdateFieldCidRuntimeEntry, 2);
     __ Drop(2);  // Drop the field and the value.
   }
 
@@ -1982,6 +1983,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kAllocateObjectWithBoundsCheckRuntimeEntry,
+                                3,
                                 locs());
   __ Drop(3);
   ASSERT(locs()->out().reg() == RAX);
@@ -2028,6 +2030,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kInstantiateTypeRuntimeEntry,
+                                2,
                                 locs());
   __ Drop(2);  // Drop instantiator and uninstantiated type.
   __ popq(result_reg);  // Pop instantiated type.
@@ -2075,6 +2078,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kInstantiateTypeArgumentsRuntimeEntry,
+                                2,
                                 locs());
   __ Drop(2);  // Drop instantiator and uninstantiated type arguments.
   __ popq(result_reg);  // Pop instantiated type arguments.
@@ -2212,6 +2216,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kCloneContextRuntimeEntry,
+                                1,
                                 locs());
   __ popq(result);  // Remove argument.
   __ popq(result);  // Get result (cloned context).
@@ -2229,7 +2234,8 @@
   compiler->AddExceptionHandler(catch_try_index(),
                                 try_index(),
                                 compiler->assembler()->CodeSize(),
-                                catch_handler_types_);
+                                catch_handler_types_,
+                                needs_stacktrace());
   if (HasParallelMove()) {
     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
   }
@@ -2278,6 +2284,7 @@
     compiler->GenerateCallRuntime(instruction_->token_pos(),
                                   instruction_->deopt_id(),
                                   kStackOverflowRuntimeEntry,
+                                  0,
                                   instruction_->locs());
 
     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) {
@@ -4297,7 +4304,7 @@
     // exp is Nan case is handled correctly in the C-library.
   }
   __ Bind(&do_call);
-  __ CallRuntime(TargetFunction());
+  __ CallRuntime(TargetFunction(), InputCount());
   __ movaps(locs()->out().fpu_reg(), XMM0);
   __ Bind(&skip_call);
   __ leave();
@@ -4552,6 +4559,7 @@
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kThrowRuntimeEntry,
+                                1,
                                 locs());
   __ int3();
 }
@@ -4563,9 +4571,11 @@
 
 
 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  compiler->SetNeedsStacktrace(catch_try_index());
   compiler->GenerateCallRuntime(token_pos(),
                                 deopt_id(),
                                 kReThrowRuntimeEntry,
+                                2,
                                 locs());
   __ int3();
 }
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 137eb9d..05169e6 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -146,7 +146,7 @@
 
 
 // The following functions are marked as invisible, meaning they will be hidden
-// in the stack trace.
+// in the stack trace and will be hidden from reflective access.
 // (Library, class name, method name)
 #define INVISIBLE_LIST(V)                                                      \
   V(CoreLibrary, Object, _noSuchMethod)                                        \
@@ -157,10 +157,10 @@
   V(CoreLibrary, TypeError, _throwNew)                                         \
   V(CoreLibrary, FallThroughError, _throwNew)                                  \
   V(CoreLibrary, AbstractClassInstantiationError, _throwNew)                   \
-  V(CoreLibrary, NoSuchMethodError, _throwNew)                                 \
   V(CoreLibrary, int, _throwFormatException)                                   \
   V(CoreLibrary, int, _parse)                                                  \
   V(CoreLibrary, StackTrace, _setupFullStackTrace)                             \
+  V(CoreLibrary, _OneByteString, _setAt)                                       \
 
 
 static void MarkFunctionAsInvisible(const Library& lib,
@@ -2349,6 +2349,11 @@
 }
 
 
+void Class::set_is_mixin_typedef() const {
+  set_state_bits(MixinTypedefBit::update(true, raw_ptr()->state_bits_));
+}
+
+
 void Class::set_is_finalized() const {
   ASSERT(!is_finalized());
   set_state_bits(StateBits::update(RawClass::kFinalized,
@@ -6714,15 +6719,19 @@
 RawObject* Library::LookupExport(const String& name) const {
   if (HasExports()) {
     const Array& exports = Array::Handle(this->exports());
+    // Break potential export cycle while looking up name.
+    StorePointer(&raw_ptr()->exports_, Object::empty_array().raw());
     Namespace& ns = Namespace::Handle();
     Object& obj = Object::Handle();
     for (int i = 0; i < exports.Length(); i++) {
       ns ^= exports.At(i);
       obj = ns.Lookup(name);
       if (!obj.IsNull()) {
-        return obj.raw();
+        break;
       }
     }
+    StorePointer(&raw_ptr()->exports_, exports.raw());
+    return obj.raw();
   }
   return Object::null();
 }
@@ -7237,6 +7246,20 @@
 }
 
 
+RawObject* Library::Evaluate(const String& expr) const {
+  // Make a fake top-level class and evaluate the expression
+  // as a static function of the class.
+  Script& script = Script::Handle();
+  script = Script::New(Symbols::Empty(),
+                       Symbols::Empty(),
+                       RawScript::kSourceTag);
+  Class& temp_class =
+      Class::Handle(Class::New(Symbols::TopLevel(), script, 0));
+  temp_class.set_library(*this);
+  return temp_class.Evaluate(expr);
+}
+
+
 void Library::InitNativeWrappersLibrary(Isolate* isolate) {
   static const int kNumNativeWrappersClasses = 4;
   ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10);
@@ -8117,8 +8140,7 @@
   intptr_t payload_size =
       Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte;
   if ((payload_size < 0) ||
-      (payload_size >
-           (kSmiMax - static_cast<intptr_t>(sizeof(RawStackmap))))) {
+      (payload_size > kMaxLengthInBytes)) {
     // This should be caught before we reach here.
     FATAL1("Fatal error in Stackmap::New: invalid length %" Pd "\n",
            length);
@@ -8284,21 +8306,23 @@
 
 void ExceptionHandlers::SetHandlerInfo(intptr_t try_index,
                                        intptr_t outer_try_index,
-                                       intptr_t handler_pc) const {
+                                       intptr_t handler_pc,
+                                       bool needs_stacktrace,
+                                       bool has_catch_all) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
   RawExceptionHandlers::HandlerInfo* info = &raw_ptr()->data_[try_index];
   info->outer_try_index = outer_try_index;
   info->handler_pc = handler_pc;
+  info->needs_stacktrace = needs_stacktrace;
+  info->has_catch_all = has_catch_all;
 }
 
 void ExceptionHandlers::GetHandlerInfo(
-                            intptr_t try_index,
-                            RawExceptionHandlers::HandlerInfo* info) const {
+    intptr_t try_index,
+    RawExceptionHandlers::HandlerInfo* info) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
   ASSERT(info != NULL);
-  RawExceptionHandlers::HandlerInfo* data = &raw_ptr()->data_[try_index];
-  info->outer_try_index = data->outer_try_index;
-  info->handler_pc = data->handler_pc;
+  *info = raw_ptr()->data_[try_index];
 }
 
 
@@ -8314,6 +8338,18 @@
 }
 
 
+bool ExceptionHandlers::NeedsStacktrace(intptr_t try_index) const {
+  ASSERT((try_index >= 0) && (try_index < Length()));
+  return raw_ptr()->data_[try_index].needs_stacktrace;
+}
+
+
+bool ExceptionHandlers::HasCatchAll(intptr_t try_index) const {
+  ASSERT((try_index >= 0) && (try_index < Length()));
+  return raw_ptr()->data_[try_index].has_catch_all;
+}
+
+
 void ExceptionHandlers::SetHandledTypes(intptr_t try_index,
                                         const Array& handled_types) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
@@ -8338,7 +8374,7 @@
 
 RawExceptionHandlers* ExceptionHandlers::New(intptr_t num_handlers) {
   ASSERT(Object::exception_handlers_class() != Class::null());
-  if (num_handlers < 0 || num_handlers >= kMaxHandlers) {
+  if ((num_handlers < 0) || (num_handlers >= kMaxHandlers)) {
     FATAL1("Fatal error in ExceptionHandlers::New(): "
            "invalid num_handlers %" Pd "\n",
            num_handlers);
@@ -8521,6 +8557,10 @@
 
 RawDeoptInfo* DeoptInfo::New(intptr_t num_commands) {
   ASSERT(Object::deopt_info_class() != Class::null());
+  if ((num_commands < 0) || (num_commands > kMaxElements)) {
+    FATAL1("Fatal error in DeoptInfo::New(): invalid num_commands %" Pd "\n",
+           num_commands);
+  }
   DeoptInfo& result = DeoptInfo::Handle();
   {
     uword size = DeoptInfo::InstanceSize(num_commands);
@@ -8603,6 +8643,21 @@
 }
 
 
+void Code::set_state_bits(intptr_t bits) const {
+  raw_ptr()->state_bits_ = bits;
+}
+
+
+void Code::set_is_optimized(bool value) const {
+  set_state_bits(OptimizedBit::update(value, raw_ptr()->state_bits_));
+}
+
+
+void Code::set_is_alive(bool value) const {
+  set_state_bits(AliveBit::update(value, raw_ptr()->state_bits_));
+}
+
+
 void Code::set_stackmaps(const Array& maps) const {
   ASSERT(maps.IsOld());
   StorePointer(&raw_ptr()->stackmaps_, maps.raw());
@@ -14320,13 +14375,11 @@
 RawTypedData* TypedData::New(intptr_t class_id,
                              intptr_t len,
                              Heap::Space space) {
-  // TODO(asiva): Add a check for maximum elements.
+  if (len < 0 || len > TypedData::MaxElements(class_id)) {
+    FATAL1("Fatal error in TypedData::New: invalid len %" Pd "\n", len);
+  }
   TypedData& result = TypedData::Handle();
   {
-    // The len field has already been checked by the caller, we only assert
-    // here that it is within a valid range.
-    ASSERT((len >= 0) &&
-           (len < (kSmiMax / TypedData::ElementSizeInBytes(class_id))));
     intptr_t lengthInBytes = len * ElementSizeInBytes(class_id);
     RawObject* raw = Object::Allocate(class_id,
                                       TypedData::InstanceSize(lengthInBytes),
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 79cd964..4728639 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -922,6 +922,11 @@
   bool is_const() const { return ConstBit::decode(raw_ptr()->state_bits_); }
   void set_is_const() const;
 
+  bool is_mixin_typedef() const {
+    return MixinTypedefBit::decode(raw_ptr()->state_bits_);
+  }
+  void set_is_mixin_typedef() const;
+
   int num_native_fields() const {
     return raw_ptr()->num_native_fields_;
   }
@@ -1017,6 +1022,7 @@
     kStateTagBit = 6,
     kStateTagSize = 2,
     kMarkedForParsingBit = 8,
+    kMixinTypedefBit = 9,
   };
   class ConstBit : public BitField<bool, kConstBit, 1> {};
   class ImplementedBit : public BitField<bool, kImplementedBit, 1> {};
@@ -1027,6 +1033,7 @@
   class StateBits : public BitField<RawClass::ClassState,
                                     kStateTagBit, kStateTagSize> {};  // NOLINT
   class MarkedForParsingBit : public BitField<bool, kMarkedForParsingBit, 1> {};
+  class MixinTypedefBit : public BitField<bool, kMixinTypedefBit, 1> {};
 
   void set_name(const String& value) const;
   void set_signature_function(const Function& value) const;
@@ -2343,6 +2350,8 @@
 
   static RawLibrary* New(const String& url);
 
+  RawObject* Evaluate(const String& expr) const;
+
   // Library scope name dictionary.
   //
   // TODO(turnidge): The Lookup functions are not consistent in how
@@ -2816,13 +2825,17 @@
 
   intptr_t HandlerPC(intptr_t try_index) const;
   intptr_t OuterTryIndex(intptr_t try_index) const;
+  bool NeedsStacktrace(intptr_t try_index) const;
 
   void SetHandlerInfo(intptr_t try_index,
                       intptr_t outer_try_index,
-                      intptr_t handler_pc) const;
+                      intptr_t handler_pc,
+                      bool needs_stacktrace,
+                      bool has_catch_all) const;
 
   RawArray* GetHandledTypes(intptr_t try_index) const;
   void SetHandledTypes(intptr_t try_index, const Array& handled_types) const;
+  bool HasCatchAll(intptr_t try_index) const;
 
   static intptr_t InstanceSize() {
     ASSERT(sizeof(RawExceptionHandlers) == OFFSET_OF(RawExceptionHandlers,
@@ -2940,18 +2953,15 @@
   intptr_t pointer_offsets_length() const {
     return raw_ptr()->pointer_offsets_length_;
   }
+
   bool is_optimized() const {
-    return (raw_ptr()->is_optimized_ == 1);
+    return OptimizedBit::decode(raw_ptr()->state_bits_);
   }
-  void set_is_optimized(bool value) const {
-    raw_ptr()->is_optimized_ = value ? 1 : 0;
-  }
+  void set_is_optimized(bool value) const;
   bool is_alive() const {
-    return (raw_ptr()->is_alive_ == 1);
+    return AliveBit::decode(raw_ptr()->state_bits_);
   }
-  void set_is_alive(bool value) const {
-    raw_ptr()->is_alive_ = value ? 1 : 0;
-  }
+  void set_is_alive(bool value) const;
 
   uword EntryPoint() const {
     const Instructions& instr = Instructions::Handle(instructions());
@@ -3123,6 +3133,17 @@
   RawArray* ExtractTypeFeedbackArray() const;
 
  private:
+  void set_state_bits(intptr_t bits) const;
+
+  friend class RawCode;
+  enum {
+    kOptimizedBit = 0,
+    kAliveBit = 1,
+  };
+
+  class OptimizedBit : public BitField<bool, kOptimizedBit, 1> {};
+  class AliveBit : public BitField<bool, kAliveBit, 1> {};
+
   // An object finder visitor interface.
   class FindRawCodeVisitor : public FindObjectVisitor {
    public:
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 61d9cbd..8158e58 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2385,10 +2385,12 @@
   // Add an exception handler table to the code.
   ExceptionHandlers& exception_handlers = ExceptionHandlers::Handle();
   exception_handlers ^= ExceptionHandlers::New(kNumEntries);
-  exception_handlers.SetHandlerInfo(0, -1, 20);
-  exception_handlers.SetHandlerInfo(1, 0, 30);
-  exception_handlers.SetHandlerInfo(2, -1, 40);
-  exception_handlers.SetHandlerInfo(3, 1, 150);
+  const bool kNeedsStacktrace = true;
+  const bool kNoStacktrace = false;
+  exception_handlers.SetHandlerInfo(0, -1, 20, kNeedsStacktrace, false);
+  exception_handlers.SetHandlerInfo(1, 0, 30, kNeedsStacktrace, false);
+  exception_handlers.SetHandlerInfo(2, -1, 40, kNoStacktrace, true);
+  exception_handlers.SetHandlerInfo(3, 1, 150, kNoStacktrace, true);
 
   extern void GenerateIncrement(Assembler* assembler);
   Assembler _assembler_;
@@ -2406,9 +2408,13 @@
   EXPECT_EQ(-1, handlers.OuterTryIndex(0));
   EXPECT_EQ(-1, info.outer_try_index);
   EXPECT_EQ(20, handlers.HandlerPC(0));
+  EXPECT(handlers.NeedsStacktrace(0));
+  EXPECT(!handlers.HasCatchAll(0));
   EXPECT_EQ(20, info.handler_pc);
   EXPECT_EQ(1, handlers.OuterTryIndex(3));
   EXPECT_EQ(150, handlers.HandlerPC(3));
+  EXPECT(!handlers.NeedsStacktrace(3));
+  EXPECT(handlers.HasCatchAll(3));
 }
 
 
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index e5e13fc..447c7bb 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -762,19 +762,6 @@
 }
 
 
-static bool IsInvisible(const Function& func) {
-  if (!Library::IsPrivate(String::Handle(func.name()))) return false;
-  // Check for private function in the core libraries.
-  const Class& cls = Class::Handle(func.Owner());
-  const Library& library = Library::Handle(cls.library());
-  if (library.raw() == Library::CoreLibrary()) return true;
-  if (library.raw() == Library::CollectionLibrary()) return true;
-  if (library.raw() == Library::TypedDataLibrary()) return true;
-  if (library.raw() == Library::MathLibrary()) return true;
-  return false;
-}
-
-
 RawObject* Parser::ParseFunctionParameters(const Function& func) {
   ASSERT(!func.IsNull());
   Isolate* isolate = Isolate::Current();
@@ -823,8 +810,6 @@
   ASSERT(isolate->long_jump_base()->IsSafeToJump());
   ASSERT(parsed_function != NULL);
   const Function& func = parsed_function->function();
-  // Mark private core library functions as invisible by default.
-  if (IsInvisible(func)) func.set_is_visible(false);
   const Script& script = Script::Handle(isolate, func.script());
   Parser parser(script, parsed_function, func.token_pos());
   SequenceNode* node_sequence = NULL;
@@ -2818,6 +2803,7 @@
         ThrowNoSuchMethodError(TokenPos(),
                                current_class(),
                                function_name,
+                               NULL,   // No arguments.
                                func.is_static() ?
                                    InvocationMirror::kStatic :
                                    InvocationMirror::kDynamic,
@@ -3883,6 +3869,7 @@
   }
   const Class& mixin_application =
       Class::Handle(Class::New(class_name, script_, classname_pos));
+  mixin_application.set_is_mixin_typedef();
   library_.AddClass(mixin_application);
   set_current_class(mixin_application);
   ParseTypeParameters(mixin_application);
@@ -3909,8 +3896,9 @@
   }
   type = ParseMixins(type);
 
-  // TODO(hausner): treat the mixin application as an alias, not as a base
-  // class whose super class is the mixin application!
+  // TODO(12773): Treat the mixin application as an alias, not as a base
+  // class whose super class is the mixin application! This is difficult because
+  // of issues involving subsitution of type parameters
   mixin_application.set_super_type(type);
   mixin_application.set_is_synthesized_class();
 
@@ -3918,6 +3906,9 @@
   // too early to call 'AddImplicitConstructor(mixin_application)' here,
   // because this class should be lazily compiled.
   if (CurrentToken() == Token::kIMPLEMENTS) {
+    // At this point, the mixin_application alias already has an interface, but
+    // ParseInterfaceList will add to the list and not lose the one already
+    // there.
     ParseInterfaceList(mixin_application);
   }
   ExpectSemicolon();
@@ -6554,6 +6545,7 @@
   current_block_->scope->AddLabel(end_catch_label);
   const GrowableObjectArray& handler_types =
       GrowableObjectArray::Handle(GrowableObjectArray::New());
+  bool needs_stacktrace = false;
   while ((CurrentToken() == Token::kCATCH) || IsLiteral("on")) {
     const intptr_t catch_pos = TokenPos();
     CatchParamDesc exception_param;
@@ -6614,6 +6606,7 @@
       // A stack trace variable is specified in this block, so generate code
       // to load the stack trace object (:stacktrace_var) into the stack trace
       // variable specified in this block.
+      needs_stacktrace = true;
       ArgumentListNode* no_args = new ArgumentListNode(catch_pos);
       LocalVariable* trace = LookupLocalScope(*stack_trace_param.var);
       ASSERT(catch_trace_var != NULL);
@@ -6679,9 +6672,9 @@
   }
   catch_handler_list = CloseBlock();
   TryBlocks* inner_try_block = PopTryBlock();
-  intptr_t try_index = inner_try_block->try_index();
+  const intptr_t try_index = inner_try_block->try_index();
   TryBlocks* outer_try_block = try_blocks_list_;
-  intptr_t outer_try_index = (outer_try_block != NULL)
+  const intptr_t outer_try_index = (outer_try_block != NULL)
       ? outer_try_block->try_index()
       : CatchClauseNode::kInvalidTryIndex;
 
@@ -6730,7 +6723,8 @@
                           catch_trace_var,
                           (finally_block != NULL)
                               ? AllocateTryIndex()
-                              : CatchClauseNode::kInvalidTryIndex);
+                              : CatchClauseNode::kInvalidTryIndex,
+                          needs_stacktrace);
 
   // Now create the try/catch ast node and return it. If there is a label
   // on the try/catch, close the block that's embedding the try statement
@@ -7200,13 +7194,10 @@
 }
 
 
-// TODO(regis): Providing the argument values is not always feasible, since
-// evaluating them could throw an error.
-// Should NoSuchMethodError reflect the argument count and names instead of
-// argument values? Or should the spec specify a different evaluation order?
 AstNode* Parser::ThrowNoSuchMethodError(intptr_t call_pos,
                                         const Class& cls,
                                         const String& function_name,
+                                        ArgumentListNode* function_arguments,
                                         InvocationMirror::Call im_call,
                                         InvocationMirror::Type im_type) {
   ArgumentListNode* arguments = new ArgumentListNode(call_pos);
@@ -7230,15 +7221,25 @@
   arguments->Add(new LiteralNode(call_pos, Smi::ZoneHandle(
       Smi::New(InvocationMirror::EncodeType(im_call, im_type)))));
   // List arguments.
-  arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle()));
+  if (function_arguments == NULL) {
+    arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle()));
+  } else {
+    ArrayNode* array = new ArrayNode(call_pos,
+                                     Type::ZoneHandle(Type::ArrayType()),
+                                     function_arguments->nodes());
+    arguments->Add(array);
+  }
   // List argumentNames.
-  arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle()));
+  if (function_arguments == NULL) {
+    arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle()));
+  } else {
+    arguments->Add(new LiteralNode(call_pos, function_arguments->names()));
+  }
   // List existingArgumentNames.
   // Check if there exists a function with the same name.
   Function& function =
      Function::Handle(cls.LookupStaticFunction(function_name));
   if (function.IsNull()) {
-    // TODO(srdjan): Store argument values into the argument list.
     arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle()));
   } else {
     const int total_num_parameters = function.NumParameters();
@@ -7538,6 +7539,7 @@
     result = ThrowNoSuchMethodError(original->token_pos(),
                                     current_class(),
                                     name,
+                                    NULL,  // No arguments.
                                     InvocationMirror::kStatic,
                                     InvocationMirror::kSetter);
   } else if (result->IsStoreIndexedNode() ||
@@ -7742,7 +7744,7 @@
     arguments = implicit_arguments;
   }
   const GrowableObjectArray& names =
-      GrowableObjectArray::Handle(GrowableObjectArray::New());
+      GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld));
   bool named_argument_seen = false;
   if (LookaheadToken(1) != Token::kRPAREN) {
     String& arg_name = String::Handle();
@@ -7831,6 +7833,7 @@
     return ThrowNoSuchMethodError(ident_pos,
                                   cls,
                                   func_name,
+                                  arguments,
                                   InvocationMirror::kStatic,
                                   InvocationMirror::kMethod);
   } else if (cls.IsTopLevel() &&
@@ -7931,6 +7934,7 @@
         return ThrowNoSuchMethodError(ident_pos,
                                       cls,
                                       field_name,
+                                      NULL,  // No arguments.
                                       InvocationMirror::kStatic,
                                       InvocationMirror::kField);
       }
@@ -7975,6 +7979,7 @@
           return ThrowNoSuchMethodError(ident_pos,
                                         cls,
                                         field_name,
+                                        NULL,  // No arguments.
                                         InvocationMirror::kStatic,
                                         InvocationMirror::kGetter);
         }
@@ -8014,6 +8019,7 @@
       return ThrowNoSuchMethodError(primary->token_pos(),
                                     current_class(),
                                     name,
+                                    NULL,  // No arguments.
                                     InvocationMirror::kStatic,
                                     InvocationMirror::kField);
     } else {
@@ -8185,6 +8191,7 @@
             selector = ThrowNoSuchMethodError(primary->token_pos(),
                                               current_class(),
                                               name,
+                                              NULL,  // No arguments.
                                               InvocationMirror::kStatic,
                                               InvocationMirror::kMethod);
           } else {
@@ -8198,6 +8205,7 @@
           selector = ThrowNoSuchMethodError(primary->token_pos(),
                                             current_class(),
                                             name,
+                                            NULL,  // No arguments.
                                             InvocationMirror::kStatic,
                                             InvocationMirror::kMethod);
         } else if (primary->primary().IsClass()) {
@@ -9096,6 +9104,7 @@
         resolved = ThrowNoSuchMethodError(ident_pos,
                                           current_class(),
                                           ident,
+                                          NULL,  // No arguments.
                                           InvocationMirror::kStatic,
                                           InvocationMirror::kField);
       } else {
@@ -9753,6 +9762,7 @@
       return ThrowNoSuchMethodError(call_pos,
                                     type_class,
                                     external_constructor_name,
+                                    arguments,
                                     InvocationMirror::kConstructor,
                                     InvocationMirror::kMethod);
     } else if (constructor.IsRedirectingFactory()) {
@@ -9820,6 +9830,7 @@
     return ThrowNoSuchMethodError(call_pos,
                                   type_class,
                                   external_constructor_name,
+                                  arguments,
                                   InvocationMirror::kConstructor,
                                   InvocationMirror::kMethod);
   }
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index e5e53ec..f729cc9 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -636,6 +636,7 @@
   AstNode* ThrowNoSuchMethodError(intptr_t call_pos,
                                   const Class& cls,
                                   const String& function_name,
+                                  ArgumentListNode* function_arguments,
                                   InvocationMirror::Call call,
                                   InvocationMirror::Type type);
 
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 2ec7137..c003f6e 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -429,7 +429,7 @@
 
   RawCode* obj = raw_obj->ptr();
   intptr_t length = obj->pointer_offsets_length_;
-  if (obj->is_alive_ == 1) {
+  if (Code::AliveBit::decode(obj->state_bits_)) {
     // Also visit all the embedded pointers in the corresponding instructions.
     uword entry_point = reinterpret_cast<uword>(obj->instructions_->ptr()) +
         Instructions::HeaderSize();
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 1be013c..1746366 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -837,11 +837,10 @@
   }
 
   intptr_t pointer_offsets_length_;
-  // These fields cannot be boolean because of alignment issues on x64
+  // Alive: If true, the embedded object pointers will be visited during GC.
+  // This field cannot be shorter because of alignment issues on x64
   // architectures.
-  intptr_t is_optimized_;
-  // If true, the embedded object pointers will be visited during GC.
-  intptr_t is_alive_;
+  intptr_t state_bits_;  // state, is_optimized, is_alive.
 
   // Variable length data follows here.
   int32_t data_[0];
@@ -943,8 +942,10 @@
   // The index into the ExceptionHandlers table corresponds to
   // the try_index of the handler.
   struct HandlerInfo {
-    intptr_t outer_try_index;  // Try block index of enclosing try block.
     intptr_t handler_pc;       // PC value of handler.
+    int16_t outer_try_index;   // Try block index of enclosing try block.
+    int8_t needs_stacktrace;   // True if a stacktrace is needed.
+    int8_t has_catch_all;      // Catches all exceptions.
   };
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers);
diff --git a/runtime/vm/runtime_entry.h b/runtime/vm/runtime_entry.h
index 5cdcf9b..3bb1dde 100644
--- a/runtime/vm/runtime_entry.h
+++ b/runtime/vm/runtime_entry.h
@@ -23,7 +23,7 @@
 class RuntimeEntry : public ValueObject {
  public:
   RuntimeEntry(const char* name, RuntimeFunction function,
-               int argument_count, bool is_leaf, bool is_float)
+               intptr_t argument_count, bool is_leaf, bool is_float)
       : name_(name),
         function_(function),
         argument_count_(argument_count),
@@ -33,18 +33,18 @@
 
   const char* name() const { return name_; }
   RuntimeFunction function() const { return function_; }
-  int argument_count() const { return argument_count_; }
+  intptr_t argument_count() const { return argument_count_; }
   bool is_leaf() const { return is_leaf_; }
   bool is_float() const { return is_float_; }
   uword GetEntryPoint() const { return reinterpret_cast<uword>(function()); }
 
   // Generate code to call the runtime entry.
-  void Call(Assembler* assembler) const;
+  void Call(Assembler* assembler, intptr_t argument_count) const;
 
  private:
   const char* name_;
   const RuntimeFunction function_;
-  const int argument_count_;
+  const intptr_t argument_count_;
   const bool is_leaf_;
   const bool is_float_;
 
@@ -62,6 +62,7 @@
   void DRT_##name(NativeArguments arguments) {                                 \
     CHECK_STACK_ALIGNMENT;                                                     \
     VERIFY_ON_TRANSITION;                                                      \
+    ASSERT(arguments.ArgCount() == argument_count);                            \
     if (FLAG_trace_runtime_calls) OS::Print("Runtime call: %s\n", ""#name);    \
     {                                                                          \
       StackZone zone(arguments.isolate());                                     \
diff --git a/runtime/vm/runtime_entry_arm.cc b/runtime/vm/runtime_entry_arm.cc
index 347e952..3acf589 100644
--- a/runtime/vm/runtime_entry_arm.cc
+++ b/runtime/vm/runtime_entry_arm.cc
@@ -21,7 +21,7 @@
 //   SP : points to the arguments and return value array.
 //   R5 : address of the runtime function to call.
 //   R4 : number of arguments to the call.
-void RuntimeEntry::Call(Assembler* assembler) const {
+void RuntimeEntry::Call(Assembler* assembler, intptr_t argument_count) const {
   // Compute the effective address. When running under the simulator,
   // this is a redirection address that forces the simulator to call
   // into the runtime system.
@@ -29,23 +29,26 @@
 #if defined(USING_SIMULATOR)
   // Redirection to leaf runtime calls supports a maximum of 4 arguments passed
   // in registers (maximum 2 double arguments for leaf float runtime calls).
-  ASSERT(argument_count() >= 0);
+  ASSERT(argument_count >= 0);
   ASSERT(!is_leaf() ||
-         (!is_float() && (argument_count() <= 4)) ||
-         (argument_count() <= 2));
+         (!is_float() && (argument_count <= 4)) ||
+         (argument_count <= 2));
   Simulator::CallKind call_kind =
       is_leaf() ? (is_float() ? Simulator::kLeafFloatRuntimeCall
                               : Simulator::kLeafRuntimeCall)
                 : Simulator::kRuntimeCall;
   entry =
-      Simulator::RedirectExternalReference(entry, call_kind, argument_count());
+      Simulator::RedirectExternalReference(entry, call_kind, argument_count);
 #endif
   if (is_leaf()) {
+    ASSERT(argument_count == this->argument_count());
     ExternalLabel label(name(), entry);
     __ BranchLink(&label);
   } else {
+    // Argument count is not checked here, but in the runtime entry for a more
+    // informative error message.
     __ LoadImmediate(R5, entry);
-    __ LoadImmediate(R4, argument_count());
+    __ LoadImmediate(R4, argument_count);
     __ BranchLink(&StubCode::CallToRuntimeLabel());
   }
 }
diff --git a/runtime/vm/runtime_entry_ia32.cc b/runtime/vm/runtime_entry_ia32.cc
index e0f6a59..942fad9 100644
--- a/runtime/vm/runtime_entry_ia32.cc
+++ b/runtime/vm/runtime_entry_ia32.cc
@@ -23,14 +23,17 @@
 //   EDX : number of arguments to the call.
 // For leaf calls the caller is responsible to setup the arguments
 // and look for return values based on the C calling convention.
-void RuntimeEntry::Call(Assembler* assembler) const {
-  if (!is_leaf()) {
-    __ movl(ECX, Immediate(GetEntryPoint()));
-    __ movl(EDX, Immediate(argument_count()));
-    __ call(&StubCode::CallToRuntimeLabel());
-  } else {
+void RuntimeEntry::Call(Assembler* assembler, intptr_t argument_count) const {
+  if (is_leaf()) {
+    ASSERT(argument_count == this->argument_count());
     ExternalLabel label(name(), GetEntryPoint());
     __ call(&label);
+  } else {
+    // Argument count is not checked here, but in the runtime entry for a more
+    // informative error message.
+    __ movl(ECX, Immediate(GetEntryPoint()));
+    __ movl(EDX, Immediate(argument_count));
+    __ call(&StubCode::CallToRuntimeLabel());
   }
 }
 
diff --git a/runtime/vm/runtime_entry_mips.cc b/runtime/vm/runtime_entry_mips.cc
index f9d2b2f..320b7e9 100644
--- a/runtime/vm/runtime_entry_mips.cc
+++ b/runtime/vm/runtime_entry_mips.cc
@@ -21,7 +21,7 @@
 //   SP : points to the arguments and return value array.
 //   S5 : address of the runtime function to call.
 //   S4 : number of arguments to the call.
-void RuntimeEntry::Call(Assembler* assembler) const {
+void RuntimeEntry::Call(Assembler* assembler, intptr_t argument_count) const {
   // Compute the effective address. When running under the simulator,
   // this is a redirection address that forces the simulator to call
   // into the runtime system.
@@ -29,23 +29,26 @@
 #if defined(USING_SIMULATOR)
   // Redirection to leaf runtime calls supports a maximum of 4 arguments passed
   // in registers (maximum 2 double arguments for leaf float runtime calls).
-  ASSERT(argument_count() >= 0);
+  ASSERT(argument_count >= 0);
   ASSERT(!is_leaf() ||
-         (!is_float() && (argument_count() <= 4)) ||
-         (argument_count() <= 2));
+         (!is_float() && (argument_count <= 4)) ||
+         (argument_count <= 2));
   Simulator::CallKind call_kind =
       is_leaf() ? (is_float() ? Simulator::kLeafFloatRuntimeCall
                               : Simulator::kLeafRuntimeCall)
                 : Simulator::kRuntimeCall;
   entry =
-      Simulator::RedirectExternalReference(entry, call_kind, argument_count());
+      Simulator::RedirectExternalReference(entry, call_kind, argument_count);
 #endif
   if (is_leaf()) {
+    ASSERT(argument_count == this->argument_count());
     ExternalLabel label(name(), entry);
     __ BranchLink(&label);
   } else {
+    // Argument count is not checked here, but in the runtime entry for a more
+    // informative error message.
     __ LoadImmediate(S5, entry);
-    __ LoadImmediate(S4, argument_count());
+    __ LoadImmediate(S4, argument_count);
     __ BranchLink(&StubCode::CallToRuntimeLabel());
   }
 }
diff --git a/runtime/vm/runtime_entry_test.cc b/runtime/vm/runtime_entry_test.cc
index cfd24c9..138bea7 100644
--- a/runtime/vm/runtime_entry_test.cc
+++ b/runtime/vm/runtime_entry_test.cc
@@ -36,7 +36,6 @@
 // Arg1: a smi.
 // Result: a smi representing arg0 - arg1.
 DEFINE_RUNTIME_ENTRY(TestSmiSub, 2) {
-  ASSERT(arguments.ArgCount() == kTestSmiSubRuntimeEntry.argument_count());
   const Smi& left = Smi::CheckedHandle(arguments.ArgAt(0));
   const Smi& right = Smi::CheckedHandle(arguments.ArgAt(1));
   // Ignoring overflow in the calculation below.
diff --git a/runtime/vm/runtime_entry_x64.cc b/runtime/vm/runtime_entry_x64.cc
index 346a77c..13fa2a1 100644
--- a/runtime/vm/runtime_entry_x64.cc
+++ b/runtime/vm/runtime_entry_x64.cc
@@ -20,14 +20,17 @@
 //   RSP : points to the arguments and return value array.
 //   RBX : address of the runtime function to call.
 //   R10 : number of arguments to the call.
-void RuntimeEntry::Call(Assembler* assembler) const {
-  if (!is_leaf()) {
-    __ movq(RBX, Immediate(GetEntryPoint()));
-    __ movq(R10, Immediate(argument_count()));
-    __ call(&StubCode::CallToRuntimeLabel());
-  } else {
+void RuntimeEntry::Call(Assembler* assembler, intptr_t argument_count) const {
+  if (is_leaf()) {
+    ASSERT(argument_count == this->argument_count());
     ExternalLabel label(name(), GetEntryPoint());
     __ call(&label);
+  } else {
+    // Argument count is not checked here, but in the runtime entry for a more
+    // informative error message.
+    __ movq(RBX, Immediate(GetEntryPoint()));
+    __ movq(R10, Immediate(argument_count));
+    __ call(&StubCode::CallToRuntimeLabel());
   }
 }
 
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 0a97d0b..fd9a5c9 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -154,22 +154,33 @@
 }
 
 
-bool StackFrame::FindExceptionHandler(uword* handler_pc) const {
-  const Code& code = Code::Handle(LookupDartCode());
+bool StackFrame::FindExceptionHandler(uword* handler_pc,
+                                      bool* needs_stacktrace,
+                                      bool* has_catch_all) const {
+  Isolate* isolate = Isolate::Current();
+  Code& code = Code::Handle(isolate, LookupDartCode());
   if (code.IsNull()) {
     return false;  // Stub frames do not have exception handlers.
   }
 
+  ExceptionHandlers& handlers =
+      ExceptionHandlers::Handle(isolate, code.exception_handlers());
+  if (handlers.Length() == 0) {
+    return false;
+  }
   // Find pc descriptor for the current pc.
   const PcDescriptors& descriptors =
-      PcDescriptors::Handle(code.pc_descriptors());
-  for (intptr_t i = 0; i < descriptors.Length(); i++) {
+      PcDescriptors::Handle(isolate, code.pc_descriptors());
+  const intptr_t len = descriptors.Length();
+  for (intptr_t i = 0; i < len; i++) {
     if ((static_cast<uword>(descriptors.PC(i)) == pc()) &&
         (descriptors.TryIndex(i) != -1)) {
       const intptr_t try_index = descriptors.TryIndex(i);
-      const ExceptionHandlers& handlers =
-          ExceptionHandlers::Handle(code.exception_handlers());
-      *handler_pc = handlers.HandlerPC(try_index);
+      RawExceptionHandlers::HandlerInfo handler_info;
+      handlers.GetHandlerInfo(try_index, &handler_info);
+      *handler_pc = handler_info.handler_pc;
+      *needs_stacktrace = handler_info.needs_stacktrace;
+      *has_catch_all = handler_info.has_catch_all;
       return true;
     }
   }
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index e32f242..83a93e5 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -71,7 +71,9 @@
 
   RawFunction* LookupDartFunction() const;
   RawCode* LookupDartCode() const;
-  bool FindExceptionHandler(uword* handler_pc) const;
+  bool FindExceptionHandler(uword* handler_pc,
+                            bool* needs_stacktrace,
+                            bool* is_catch_all) const;
   // Returns token_pos of the pc(), or -1 if none exists.
   intptr_t GetTokenPos() const;
 
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index b101db7..111c91a 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -113,7 +113,7 @@
 void StubCode::GeneratePrintStopMessageStub(Assembler* assembler) {
   __ EnterCallRuntimeFrame(0);
   // Call the runtime leaf function. R0 already contains the parameter.
-  __ CallRuntime(kPrintStopMessageRuntimeEntry);
+  __ CallRuntime(kPrintStopMessageRuntimeEntry, 1);
   __ LeaveCallRuntimeFrame();
   __ Ret();
 }
@@ -291,7 +291,7 @@
   // Setup space on stack for return value and preserve arguments descriptor.
   __ LoadImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
   __ PushList((1 << R0) | (1 << R4));
-  __ CallRuntime(kPatchStaticCallRuntimeEntry);
+  __ CallRuntime(kPatchStaticCallRuntimeEntry, 0);
   // Get Code object result and restore arguments descriptor array.
   __ PopList((1 << R0) | (1 << R4));
   // Remove the stub frame.
@@ -313,7 +313,7 @@
   // Setup space on stack for return value and preserve arguments descriptor.
   __ LoadImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
   __ PushList((1 << R0) | (1 << R4));
-  __ CallRuntime(kFixCallersTargetRuntimeEntry);
+  __ CallRuntime(kFixCallersTargetRuntimeEntry, 0);
   // Get Code object result and restore arguments descriptor array.
   __ PopList((1 << R0) | (1 << R4));
   // Remove the stub frame.
@@ -377,7 +377,7 @@
   // R2: Smi-tagged arguments array length.
   PushArgumentsArray(assembler);
 
-  __ CallRuntime(kInstanceFunctionLookupRuntimeEntry);
+  __ CallRuntime(kInstanceFunctionLookupRuntimeEntry, 4);
 
   // Remove arguments.
   __ Drop(4);
@@ -447,7 +447,7 @@
 
   __ mov(R0, ShifterOperand(SP));  // Pass address of saved registers block.
   __ ReserveAlignedFrameSpace(0);
-  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry);
+  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
   // Result (R0) is stack-size (FP - SP) in bytes.
 
   if (preserve_result) {
@@ -468,7 +468,7 @@
     __ Push(R1);  // Preserve result as first local.
   }
   __ ReserveAlignedFrameSpace(0);
-  __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry);  // Pass last FP in R0.
+  __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);  // Pass last FP in R0.
   if (preserve_result) {
     // Restore result into R1.
     __ ldr(R1, Address(FP, kFirstLocalSlotFromFp * kWordSize));
@@ -484,7 +484,7 @@
     __ Push(R1);  // Preserve result, it will be GC-d here.
   }
   __ PushObject(Smi::ZoneHandle());  // Space for the result.
-  __ CallRuntime(kDeoptimizeMaterializeRuntimeEntry);
+  __ CallRuntime(kDeoptimizeMaterializeRuntimeEntry, 0);
   // Result tells stub how many bytes to remove from the expression stack
   // of the bottom-most frame. They were used as materialization arguments.
   __ Pop(R1);
@@ -528,7 +528,7 @@
   // Push arguments descriptor array.
   __ LoadImmediate(IP, reinterpret_cast<intptr_t>(Object::null()));
   __ PushList((1 << R4) | (1 << R5) | (1 << R6) | (1 << IP));
-  __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry);
+  __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry, 3);
   // Remove arguments.
   __ Drop(3);
   __ Pop(R0);  // Get result into R0.
@@ -667,7 +667,7 @@
   // Setup space on stack for return value.
   // Push array length as Smi and element type.
   __ PushList((1 << R1) | (1 << R2) | (1 << IP));
-  __ CallRuntime(kAllocateArrayRuntimeEntry);
+  __ CallRuntime(kAllocateArrayRuntimeEntry, 2);
   // Pop arguments; result is popped in IP.
   __ PopList((1 << R1) | (1 << R2) | (1 << IP));  // R2 is restored.
   __ mov(R0, ShifterOperand(IP));
@@ -724,7 +724,7 @@
 
   // Preserve arguments descriptor array and read-only function object argument.
   __ PushList((1 << R2) | (1 << R4));
-  __ CallRuntime(kCompileFunctionRuntimeEntry);
+  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
   // Restore arguments descriptor array and read-only function object argument.
   __ PopList((1 << R2) | (1 << R4));
   // Restore R0.
@@ -759,7 +759,7 @@
   __ ldr(R2, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
   PushArgumentsArray(assembler);
 
-  __ CallRuntime(kInvokeNonClosureRuntimeEntry);
+  __ CallRuntime(kInvokeNonClosureRuntimeEntry, 2);
   // Remove arguments.
   __ Drop(2);
   __ Pop(R0);  // Get result into R0.
@@ -982,7 +982,7 @@
   __ LoadImmediate(R2, reinterpret_cast<intptr_t>(Object::null()));
   __ SmiTag(R1);
   __ PushList((1 << R1) | (1 << R2));
-  __ CallRuntime(kAllocateContextRuntimeEntry);  // Allocate context.
+  __ CallRuntime(kAllocateContextRuntimeEntry, 1);  // Allocate context.
   __ Drop(1);  // Pop number of context variables argument.
   __ Pop(R0);  // Pop the new context object.
   // R0: new object
@@ -1047,7 +1047,7 @@
 
   __ EnterCallRuntimeFrame(0 * kWordSize);
   __ ldr(R0, FieldAddress(CTX, Context::isolate_offset()));
-  __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry);
+  __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
   // Restore callee-saved registers, tear down frame.
   __ LeaveCallRuntimeFrame();
   __ Ret();
@@ -1212,7 +1212,7 @@
     __ LoadImmediate(R1, Smi::RawValue(StubCode::kNoInstantiator));
     __ PushList((1 << R1) | (1 << R2));
   }
-  __ CallRuntime(kAllocateObjectRuntimeEntry);  // Allocate object.
+  __ CallRuntime(kAllocateObjectRuntimeEntry, 3);  // Allocate object.
   __ Drop(3);  // Pop arguments.
   __ Pop(R0);  // Pop result (newly allocated object).
   // R0: new object
@@ -1345,11 +1345,11 @@
   __ Push(R0);  // Push type arguments of closure to be allocated or null.
 
   if (is_implicit_instance_closure) {
-    __ CallRuntime(kAllocateImplicitInstanceClosureRuntimeEntry);
+    __ CallRuntime(kAllocateImplicitInstanceClosureRuntimeEntry, 3);
     __ Drop(2);  // Pop arguments (type arguments of object and receiver).
   } else {
     ASSERT(func.IsNonImplicitClosureFunction());
-    __ CallRuntime(kAllocateClosureRuntimeEntry);
+    __ CallRuntime(kAllocateClosureRuntimeEntry, 2);
     __ Drop(1);  // Pop argument (type arguments of object).
   }
   __ Drop(1);  // Pop function object.
@@ -1387,7 +1387,7 @@
   // R2: Smi-tagged arguments array length.
   PushArgumentsArray(assembler);
 
-  __ CallRuntime(kInvokeNoSuchMethodFunctionRuntimeEntry);
+  __ CallRuntime(kInvokeNoSuchMethodFunctionRuntimeEntry, 4);
   // Remove arguments.
   __ Drop(4);
   __ Pop(R0);  // Get result into R0.
@@ -1408,7 +1408,7 @@
     __ PushList((1 << R5) | (1 << R6));  // Preserve.
     __ Push(ic_reg);  // Argument.
     __ Push(func_reg);  // Argument.
-    __ CallRuntime(kTraceICCallRuntimeEntry);
+    __ CallRuntime(kTraceICCallRuntimeEntry, 2);
     __ Drop(2);  // Discard argument;
     __ PopList((1 << R5) | (1 << R6));  // Restore.
     __ LeaveStubFrame();
@@ -1467,7 +1467,7 @@
   __ b(&not_stepping, EQ);
   __ EnterStubFrame();
   __ Push(R5);  // Preserve IC data.
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ Pop(R5);
   __ LeaveStubFrame();
   __ Bind(&not_stepping);
@@ -1552,7 +1552,7 @@
   }
   // Pass IC data object.
   __ Push(R5);
-  __ CallRuntime(handle_ic_miss);
+  __ CallRuntime(handle_ic_miss, num_args + 1);
   // Remove the call arguments pushed earlier, including the IC data object.
   __ Drop(num_args + 1);
   // Pop returned code object into R0 (null if not found).
@@ -1693,7 +1693,7 @@
   __ b(&not_stepping, EQ);
   __ EnterStubFrame();
   __ Push(R5);  // Preserve IC data.
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ Pop(R5);
   __ LeaveStubFrame();
   __ Bind(&not_stepping);
@@ -1728,7 +1728,7 @@
   // Preserve target function and IC data object.
   __ PushList((1 << R1) | (1 << R5));
   __ Push(R1);  // Pass function.
-  __ CallRuntime(kCompileFunctionRuntimeEntry);
+  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
   __ Drop(1);  // Discard argument.
   __ PopList((1 << R1) | (1 << R5));  // Restore function and IC data.
   __ LeaveStubFrame();
@@ -1766,7 +1766,7 @@
   __ LoadImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
   // Preserve arguments descriptor and make room for result.
   __ PushList((1 << R0) | (1 << R5));
-  __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry);
+  __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry, 0);
   // Pop code object result and restore arguments descriptor.
   __ PopList((1 << R0) | (1 << R5));
   __ LeaveStubFrame();
@@ -1787,7 +1787,7 @@
   // calling into the runtime.
   __ EnterStubFrame();
   __ Push(R0);
-  __ CallRuntime(kBreakpointReturnHandlerRuntimeEntry);
+  __ CallRuntime(kBreakpointReturnHandlerRuntimeEntry, 0);
   __ Pop(R0);
   __ LeaveStubFrame();
 
@@ -1805,7 +1805,7 @@
   // calling into the runtime.
   __ EnterStubFrame();
   __ Push(R5);
-  __ CallRuntime(kBreakpointDynamicHandlerRuntimeEntry);
+  __ CallRuntime(kBreakpointDynamicHandlerRuntimeEntry, 0);
   __ Pop(R5);
   __ LeaveStubFrame();
 
@@ -2032,7 +2032,7 @@
   __ PushList((1 << R0) | (1 << R1));
   __ PushObject(Symbols::EqualOperator());  // Target's name.
   __ Push(R5);  // ICData
-  __ CallRuntime(kUpdateICDataTwoArgsRuntimeEntry);  // Clobbers R4, R5.
+  __ CallRuntime(kUpdateICDataTwoArgsRuntimeEntry, 4);  // Clobbers R4, R5.
   __ Drop(2);
   __ PopList((1 << R0) | (1 << R1));
   __ b(&compute_result);
@@ -2048,7 +2048,7 @@
   __ LoadImmediate(IP, reinterpret_cast<intptr_t>(Object::null()));
   __ Push(IP);  // Setup space on stack for return value.
   __ Push(R6);
-  __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry);
+  __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry, 1);
   __ Pop(R0);  // Discard argument.
   __ Pop(R0);  // Get Code object
   __ Pop(R4);  // Restore argument descriptor.
@@ -2122,7 +2122,7 @@
   __ EnterStubFrame(0);
   __ ReserveAlignedFrameSpace(2 * kWordSize);
   __ stm(IA, SP,  (1 << R0) | (1 << R1));
-  __ CallRuntime(kBigintCompareRuntimeEntry);
+  __ CallRuntime(kBigintCompareRuntimeEntry, 2);
   // Result in R0, 0 means equal.
   __ LeaveStubFrame();
   __ cmp(R0, ShifterOperand(0));
@@ -2148,7 +2148,7 @@
   __ CompareImmediate(R1, 0);
   __ b(&not_stepping, EQ);
   __ EnterStubFrame();
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ LeaveStubFrame();
   __ Bind(&not_stepping);
 
diff --git a/runtime/vm/stub_code_arm_test.cc b/runtime/vm/stub_code_arm_test.cc
index 0a11a98..4bea65e 100644
--- a/runtime/vm/stub_code_arm_test.cc
+++ b/runtime/vm/stub_code_arm_test.cc
@@ -51,7 +51,7 @@
   __ PushObject(smi1);  // Push argument 1 smi1.
   __ PushObject(smi2);  // Push argument 2 smi2.
   ASSERT(kTestSmiSubRuntimeEntry.argument_count() == argc);
-  __ CallRuntime(kTestSmiSubRuntimeEntry);  // Call SmiSub runtime func.
+  __ CallRuntime(kTestSmiSubRuntimeEntry, argc);  // Call SmiSub runtime func.
   __ AddImmediate(SP, argc * kWordSize);
   __ Pop(R0);  // Pop return value from return slot.
   __ LeaveDartFrame();
@@ -86,7 +86,7 @@
   __ ReserveAlignedFrameSpace(0);
   __ LoadObject(R0, smi1);  // Set up argument 1 smi1.
   __ LoadObject(R1, smi2);  // Set up argument 2 smi2.
-  __ CallRuntime(kTestLeafSmiAddRuntimeEntry);  // Call SmiAdd runtime func.
+  __ CallRuntime(kTestLeafSmiAddRuntimeEntry, 2);  // Call SmiAdd runtime func.
   __ LeaveDartFrame();
   __ Ret();  // Return value is in R0.
 }
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index f5e4ed1..927f612 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -107,7 +107,7 @@
 void StubCode::GeneratePrintStopMessageStub(Assembler* assembler) {
   __ EnterCallRuntimeFrame(1 * kWordSize);
   __ movl(Address(ESP, 0), EAX);
-  __ CallRuntime(kPrintStopMessageRuntimeEntry);
+  __ CallRuntime(kPrintStopMessageRuntimeEntry, 1);
   __ LeaveCallRuntimeFrame();
   __ ret();
 }
@@ -263,7 +263,7 @@
   __ EnterStubFrame();
   __ pushl(EDX);  // Preserve arguments descriptor array.
   __ pushl(raw_null);  // Setup space on stack for return value.
-  __ CallRuntime(kPatchStaticCallRuntimeEntry);
+  __ CallRuntime(kPatchStaticCallRuntimeEntry, 0);
   __ popl(EAX);  // Get Code object result.
   __ popl(EDX);  // Restore arguments descriptor array.
   // Remove the stub frame as we are about to jump to the dart function.
@@ -286,7 +286,7 @@
   __ EnterStubFrame();
   __ pushl(EDX);  // Preserve arguments descriptor array.
   __ pushl(raw_null);  // Setup space on stack for return value.
-  __ CallRuntime(kFixCallersTargetRuntimeEntry);
+  __ CallRuntime(kFixCallersTargetRuntimeEntry, 0);
   __ popl(EAX);  // Get Code object.
   __ popl(EDX);  // Restore arguments descriptor array.
   __ movl(EAX, FieldAddress(EAX, Code::instructions_offset()));
@@ -357,7 +357,7 @@
   __ movl(EDX, EDI);  // Smi-tagged arguments array length.
   PushArgumentsArray(assembler);
 
-  __ CallRuntime(kInstanceFunctionLookupRuntimeEntry);
+  __ CallRuntime(kInstanceFunctionLookupRuntimeEntry, 4);
 
   // Remove arguments.
   __ Drop(4);
@@ -422,7 +422,7 @@
   __ movl(ECX, ESP);  // Preserve saved registers block.
   __ ReserveAlignedFrameSpace(1 * kWordSize);
   __ movl(Address(ESP, 0), ECX);  // Start of register block.
-  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry);
+  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
   // Result (EAX) is stack-size (FP - SP) in bytes.
 
   if (preserve_result) {
@@ -443,7 +443,7 @@
   }
   __ ReserveAlignedFrameSpace(1 * kWordSize);
   __ movl(Address(ESP, 0), EBP);  // Pass last FP as parameter on stack.
-  __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry);
+  __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);
   if (preserve_result) {
     // Restore result into EBX.
     __ movl(EBX, Address(EBP, kFirstLocalSlotFromFp * kWordSize));
@@ -459,7 +459,7 @@
     __ pushl(EBX);  // Preserve result, it will be GC-d here.
   }
   __ pushl(Immediate(Smi::RawValue(0)));  // Space for the result.
-  __ CallRuntime(kDeoptimizeMaterializeRuntimeEntry);
+  __ CallRuntime(kDeoptimizeMaterializeRuntimeEntry, 0);
   // Result tells stub how many bytes to remove from the expression stack
   // of the bottom-most frame. They were used as materialization arguments.
   __ popl(EBX);
@@ -511,7 +511,7 @@
   __ pushl(EAX);  // Pass receiver.
   __ pushl(ECX);  // Pass IC data.
   __ pushl(EDX);  // Pass arguments descriptor.
-  __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry);
+  __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry, 3);
   // Discard arguments.
   __ popl(EAX);
   __ popl(EAX);
@@ -662,7 +662,7 @@
   __ pushl(raw_null);  // Setup space on stack for return value.
   __ pushl(EDX);  // Array length as Smi.
   __ pushl(ECX);  // Element type.
-  __ CallRuntime(kAllocateArrayRuntimeEntry);
+  __ CallRuntime(kAllocateArrayRuntimeEntry, 2);
   __ popl(EAX);  // Pop element type argument.
   __ popl(EDX);  // Pop array length argument.
   __ popl(EAX);  // Pop return value from return slot.
@@ -719,7 +719,7 @@
 
   __ pushl(EDX);  // Preserve arguments descriptor array.
   __ pushl(ECX);  // Preserve read-only function object argument.
-  __ CallRuntime(kCompileFunctionRuntimeEntry);
+  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
   __ popl(ECX);  // Restore read-only function object argument in ECX.
   __ popl(EDX);  // Restore arguments descriptor array.
   // Restore EAX.
@@ -755,7 +755,7 @@
   __ movl(EDX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
   PushArgumentsArray(assembler);
 
-  __ CallRuntime(kInvokeNonClosureRuntimeEntry);
+  __ CallRuntime(kInvokeNonClosureRuntimeEntry, 2);
   // Remove arguments.
   __ Drop(2);
   __ popl(EAX);  // Get result into EAX.
@@ -1004,7 +1004,7 @@
   __ pushl(raw_null);  // Setup space on stack for return value.
   __ SmiTag(EDX);
   __ pushl(EDX);
-  __ CallRuntime(kAllocateContextRuntimeEntry);  // Allocate context.
+  __ CallRuntime(kAllocateContextRuntimeEntry, 1);  // Allocate context.
   __ popl(EAX);  // Pop number of context variables argument.
   __ popl(EAX);  // Pop the new context object.
   // EAX: new object
@@ -1075,7 +1075,7 @@
   __ EnterCallRuntimeFrame(1 * kWordSize);
   __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
   __ movl(Address(ESP, 0), EAX);  // Push the isolate as the only argument.
-  __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry);
+  __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
   // Restore callee-saved registers, tear down frame.
   __ LeaveCallRuntimeFrame();
   __ ret();
@@ -1245,7 +1245,7 @@
     __ pushl(raw_null);  // Push null type arguments.
     __ pushl(Immediate(Smi::RawValue(StubCode::kNoInstantiator)));
   }
-  __ CallRuntime(kAllocateObjectRuntimeEntry);  // Allocate object.
+  __ CallRuntime(kAllocateObjectRuntimeEntry, 3);  // Allocate object.
   __ popl(EAX);  // Pop argument (instantiator).
   __ popl(EAX);  // Pop argument (type arguments of object).
   __ popl(EAX);  // Pop argument (class of object).
@@ -1379,12 +1379,12 @@
     __ pushl(raw_null);  // Push null type arguments.
   }
   if (is_implicit_instance_closure) {
-    __ CallRuntime(kAllocateImplicitInstanceClosureRuntimeEntry);
+    __ CallRuntime(kAllocateImplicitInstanceClosureRuntimeEntry, 3);
     __ popl(EAX);  // Pop argument (type arguments of object).
     __ popl(EAX);  // Pop receiver.
   } else {
     ASSERT(func.IsNonImplicitClosureFunction());
-    __ CallRuntime(kAllocateClosureRuntimeEntry);
+    __ CallRuntime(kAllocateClosureRuntimeEntry, 2);
     __ popl(EAX);  // Pop argument (type arguments of object).
   }
   __ popl(EAX);  // Pop function object.
@@ -1423,7 +1423,7 @@
   // EDX: Smi-tagged arguments array length.
   PushArgumentsArray(assembler);
 
-  __ CallRuntime(kInvokeNoSuchMethodFunctionRuntimeEntry);
+  __ CallRuntime(kInvokeNoSuchMethodFunctionRuntimeEntry, 4);
 
   // Remove arguments.
   __ Drop(4);
@@ -1446,7 +1446,7 @@
     __ pushl(ic_reg);       // Preserve.
     __ pushl(ic_reg);       // Argument.
     __ pushl(func_reg);     // Argument.
-    __ CallRuntime(kTraceICCallRuntimeEntry);
+    __ CallRuntime(kTraceICCallRuntimeEntry, 2);
     __ popl(EAX);          // Discard argument;
     __ popl(EAX);          // Discard argument;
     __ popl(ic_reg);       // Restore.
@@ -1504,7 +1504,7 @@
 
   __ EnterStubFrame();
   __ pushl(ECX);
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ popl(ECX);
   __ LeaveFrame();
   __ Bind(&not_stepping);
@@ -1583,7 +1583,7 @@
     __ pushl(EBX);
   }
   __ pushl(ECX);  // Pass IC data object.
-  __ CallRuntime(handle_ic_miss);
+  __ CallRuntime(handle_ic_miss, num_args + 1);
   // Remove the call arguments pushed earlier, including the IC data object.
   for (intptr_t i = 0; i < num_args + 1; i++) {
     __ popl(EAX);
@@ -1740,7 +1740,7 @@
 
   __ EnterStubFrame();
   __ pushl(ECX);
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ popl(ECX);
   __ LeaveFrame();
   __ Bind(&not_stepping);
@@ -1772,7 +1772,7 @@
   __ pushl(EDI);  // Preserve target function.
   __ pushl(ECX);  // Preserve IC data object.
   __ pushl(EDI);  // Pass function.
-  __ CallRuntime(kCompileFunctionRuntimeEntry);
+  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
   __ popl(EAX);  // Discard argument.
   __ popl(ECX);  // Restore IC data object.
   __ popl(EDI);  // Restore target function.
@@ -1807,7 +1807,7 @@
   const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ pushl(raw_null);  // Room for result.
-  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry);
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
   __ popl(EAX);  // Address of original stub.
   __ popl(EDX);  // Restore arguments.
   __ popl(ECX);
@@ -1826,7 +1826,7 @@
   const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ pushl(raw_null);  // Room for result.
-  __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry);
+  __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry, 0);
   __ popl(EAX);  // Code object.
   __ popl(ECX);  // Restore ICData.
   __ LeaveFrame();
@@ -1850,7 +1850,7 @@
   // calling into the runtime.
   __ EnterStubFrame();
   __ pushl(EAX);
-  __ CallRuntime(kBreakpointReturnHandlerRuntimeEntry);
+  __ CallRuntime(kBreakpointReturnHandlerRuntimeEntry, 0);
   __ popl(EAX);
   __ LeaveFrame();
 
@@ -1870,7 +1870,7 @@
   // calling into the runtime.
   __ EnterStubFrame();
   __ pushl(ECX);
-  __ CallRuntime(kBreakpointDynamicHandlerRuntimeEntry);
+  __ CallRuntime(kBreakpointDynamicHandlerRuntimeEntry, 0);
   __ popl(ECX);
   __ LeaveFrame();
 
@@ -2123,7 +2123,7 @@
   __ pushl(EAX);  // arg 1
   __ PushObject(Symbols::EqualOperator());  // Target's name.
   __ pushl(ECX);  // ICData
-  __ CallRuntime(kUpdateICDataTwoArgsRuntimeEntry);
+  __ CallRuntime(kUpdateICDataTwoArgsRuntimeEntry, 4);
   __ Drop(4);
   __ LeaveFrame();
 
@@ -2141,7 +2141,7 @@
   __ pushl(EDX);
   __ pushl(raw_null);  // Setup space on stack for return value.
   __ pushl(EDI);
-  __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry);
+  __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry, 1);
   __ popl(EAX);  // Discard argument.
   __ popl(EAX);  // Get Code object
   __ popl(EDX);  // Restore argument descriptor.
@@ -2211,7 +2211,7 @@
   __ ReserveAlignedFrameSpace(2 * kWordSize);
   __ movl(Address(ESP, 1 * kWordSize), left);
   __ movl(Address(ESP, 0 * kWordSize), right);
-  __ CallRuntime(kBigintCompareRuntimeEntry);
+  __ CallRuntime(kBigintCompareRuntimeEntry, 2);
   // Result in EAX, 0 means equal.
   __ LeaveFrame();
   __ cmpl(EAX, Immediate(0));
@@ -2238,7 +2238,7 @@
   __ j(EQUAL, &not_stepping, Assembler::kNearJump);
 
   __ EnterStubFrame();
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ LeaveFrame();
   __ Bind(&not_stepping);
 
diff --git a/runtime/vm/stub_code_ia32_test.cc b/runtime/vm/stub_code_ia32_test.cc
index 6e43487..2966be2 100644
--- a/runtime/vm/stub_code_ia32_test.cc
+++ b/runtime/vm/stub_code_ia32_test.cc
@@ -51,7 +51,7 @@
   __ PushObject(smi1);  // Push argument 1 smi1.
   __ PushObject(smi2);  // Push argument 2 smi2.
   ASSERT(kTestSmiSubRuntimeEntry.argument_count() == argc);
-  __ CallRuntime(kTestSmiSubRuntimeEntry);  // Call SmiSub runtime func.
+  __ CallRuntime(kTestSmiSubRuntimeEntry, argc);  // Call SmiSub runtime func.
   __ AddImmediate(ESP, Immediate(argc * kWordSize));
   __ popl(EAX);  // Pop return value from return slot.
   __ leave();
@@ -88,7 +88,7 @@
   __ movl(Address(ESP, 0), EAX);  // Push argument 1 smi1.
   __ LoadObject(EAX, smi2);
   __ movl(Address(ESP, kWordSize), EAX);  // Push argument 2 smi2.
-  __ CallRuntime(kTestLeafSmiAddRuntimeEntry);  // Call SmiAdd runtime func.
+  __ CallRuntime(kTestLeafSmiAddRuntimeEntry, 2);  // Call SmiAdd runtime func.
   __ leave();
   __ ret();  // Return value is in EAX.
 }
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 9be9e94..ceef26f 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -125,7 +125,7 @@
 void StubCode::GeneratePrintStopMessageStub(Assembler* assembler) {
   __ EnterCallRuntimeFrame(0);
   // Call the runtime leaf function. A0 already contains the parameter.
-  __ CallRuntime(kPrintStopMessageRuntimeEntry);
+  __ CallRuntime(kPrintStopMessageRuntimeEntry, 1);
   __ LeaveCallRuntimeFrame();
   __ Ret();
 }
@@ -328,7 +328,7 @@
   __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
   __ sw(TMP, Address(SP, 0 * kWordSize));
 
-  __ CallRuntime(kPatchStaticCallRuntimeEntry);
+  __ CallRuntime(kPatchStaticCallRuntimeEntry, 0);
   __ TraceSimMsg("CallStaticFunctionStub return");
 
   // Get Code object result and restore arguments descriptor array.
@@ -357,7 +357,7 @@
   __ sw(S4, Address(SP, 1 * kWordSize));
   __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
   __ sw(TMP, Address(SP, 0 * kWordSize));
-  __ CallRuntime(kFixCallersTargetRuntimeEntry);
+  __ CallRuntime(kFixCallersTargetRuntimeEntry, 0);
   // Get Code object result and restore arguments descriptor array.
   __ lw(T0, Address(SP, 0 * kWordSize));
   __ lw(S4, Address(SP, 1 * kWordSize));
@@ -438,7 +438,7 @@
   PushArgumentsArray(assembler);
   __ TraceSimMsg("InstanceFunctionLookupStub return");
 
-  __ CallRuntime(kInstanceFunctionLookupRuntimeEntry);
+  __ CallRuntime(kInstanceFunctionLookupRuntimeEntry, 4);
 
   __ lw(V0, Address(SP, 4 * kWordSize));  // Get result into V0.
   __ addiu(SP, SP, Immediate(5 * kWordSize));    // Remove arguments.
@@ -521,7 +521,7 @@
 
   __ mov(A0, SP);  // Pass address of saved registers block.
   __ ReserveAlignedFrameSpace(1 * kWordSize);
-  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry);
+  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
   // Result (V0) is stack-size (FP - SP) in bytes, incl. the return address.
 
   if (preserve_result) {
@@ -549,7 +549,7 @@
     __ Push(T1);  // Preserve result as first local.
   }
   __ ReserveAlignedFrameSpace(1 * kWordSize);
-  __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry);  // Pass last FP in A0.
+  __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);  // Pass last FP in A0.
   if (preserve_result) {
     // Restore result into T1.
     __ lw(T1, Address(FP, kFirstLocalSlotFromFp * kWordSize));
@@ -569,7 +569,7 @@
     __ Push(T1);  // Preserve result, it will be GC-d here.
   }
   __ PushObject(Smi::ZoneHandle());  // Space for the result.
-  __ CallRuntime(kDeoptimizeMaterializeRuntimeEntry);
+  __ CallRuntime(kDeoptimizeMaterializeRuntimeEntry, 0);
   // Result tells stub how many bytes to remove from the expression stack
   // of the bottom-most frame. They were used as materialization arguments.
   __ Pop(T1);
@@ -621,7 +621,7 @@
   __ sw(S5, Address(SP, 1 * kWordSize));
   __ sw(S4, Address(SP, 0 * kWordSize));
 
-  __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry);
+  __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry, 3);
 
   __ lw(T0, Address(SP, 3 * kWordSize));  // Get result.
   __ lw(S4, Address(SP, 4 * kWordSize));  // Restore argument descriptor.
@@ -768,7 +768,7 @@
   __ sw(TMP, Address(SP, 2 * kWordSize));
   __ sw(A1, Address(SP, 1 * kWordSize));
   __ sw(A0, Address(SP, 0 * kWordSize));
-  __ CallRuntime(kAllocateArrayRuntimeEntry);
+  __ CallRuntime(kAllocateArrayRuntimeEntry, 2);
   __ TraceSimMsg("AllocateArrayStub return");
   // Pop arguments; result is popped in IP.
   __ lw(V0, Address(SP, 2 * kWordSize));
@@ -838,7 +838,7 @@
   __ addiu(SP, SP, Immediate(-2 * kWordSize));
   __ sw(S4, Address(SP, 1 * kWordSize));
   __ sw(T2, Address(SP, 0 * kWordSize));
-  __ CallRuntime(kCompileFunctionRuntimeEntry);
+  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
   __ TraceSimMsg("GenerateCallClosureFunctionStub return");
   // Restore arguments descriptor array and read-only function object argument.
   __ lw(T2, Address(SP, 0 * kWordSize));
@@ -888,7 +888,7 @@
   // TOS + 5: PC marker (0 for stub).
   // TOS + 6: Last argument of caller.
   // ....
-  __ CallRuntime(kInvokeNonClosureRuntimeEntry);
+  __ CallRuntime(kInvokeNonClosureRuntimeEntry, 2);
   __ lw(V0, Address(SP, 2 * kWordSize));  // Get result into V0.
   __ addiu(SP, SP, Immediate(3 * kWordSize));  // Remove arguments.
 
@@ -1129,7 +1129,7 @@
   __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
   __ sw(TMP, Address(SP, 1 * kWordSize));  // Store null.
   __ sw(T1, Address(SP, 0 * kWordSize));
-  __ CallRuntime(kAllocateContextRuntimeEntry);  // Allocate context.
+  __ CallRuntime(kAllocateContextRuntimeEntry, 1);  // Allocate context.
   __ lw(V0, Address(SP, 1 * kWordSize));  // Get the new context.
   __ addiu(SP, SP, Immediate(2 * kWordSize));  // Pop argument and return.
 
@@ -1206,7 +1206,7 @@
 
   __ EnterCallRuntimeFrame(1 * kWordSize);
   __ lw(A0, FieldAddress(CTX, Context::isolate_offset()));
-  __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry);
+  __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
   __ TraceSimMsg("UpdateStoreBufferStub return");
   // Restore callee-saved registers, tear down frame.
   __ LeaveCallRuntimeFrame();
@@ -1379,7 +1379,7 @@
     __ sw(T7, Address(SP, 1 * kWordSize));
     __ sw(T1, Address(SP, 0 * kWordSize));
   }
-  __ CallRuntime(kAllocateObjectRuntimeEntry);  // Allocate object.
+  __ CallRuntime(kAllocateObjectRuntimeEntry, 3);  // Allocate object.
   __ TraceSimMsg("AllocationStubForClass return");
   // Pop result (newly allocated object).
   __ lw(V0, Address(SP, 3 * kWordSize));
@@ -1518,11 +1518,11 @@
   __ sw(T2, Address(SP, 0 * kWordSize));
 
   if (is_implicit_instance_closure) {
-    __ CallRuntime(kAllocateImplicitInstanceClosureRuntimeEntry);
+    __ CallRuntime(kAllocateImplicitInstanceClosureRuntimeEntry, 3);
     __ TraceSimMsg("AllocationStubForClosure return");
   } else {
     ASSERT(func.IsNonImplicitClosureFunction());
-    __ CallRuntime(kAllocateClosureRuntimeEntry);
+    __ CallRuntime(kAllocateClosureRuntimeEntry, 2);
     __ TraceSimMsg("AllocationStubForClosure return");
   }
   __ lw(V0, Address(SP, (num_slots - 1) * kWordSize));  // Pop function object.
@@ -1565,7 +1565,7 @@
   // A1: Smi-tagged arguments array length.
   PushArgumentsArray(assembler);
 
-  __ CallRuntime(kInvokeNoSuchMethodFunctionRuntimeEntry);
+  __ CallRuntime(kInvokeNoSuchMethodFunctionRuntimeEntry, 4);
 
   __ lw(V0, Address(SP, 4 * kWordSize));  // Get result into V0.
   __ LeaveStubFrameAndReturn();
@@ -1587,7 +1587,7 @@
     __ sw(S5, Address(SP, 2 * kWordSize));
     __ sw(ic_reg, Address(SP, 1 * kWordSize));  // Argument.
     __ sw(func_reg, Address(SP, 0 * kWordSize));  // Argument.
-    __ CallRuntime(kTraceICCallRuntimeEntry);
+    __ CallRuntime(kTraceICCallRuntimeEntry, 2);
     __ lw(S5, Address(SP, 2 * kWordSize));
     __ lw(T0, Address(SP, 3 * kWordSize));
     __ addiu(SP, SP, Immediate(4 * kWordSize));  // Discard argument;
@@ -1650,7 +1650,7 @@
   __ addiu(SP, SP, Immediate(-2 * kWordSize));
   __ sw(S5, Address(SP, 1 * kWordSize));  // Preserve IC data.
   __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ lw(RA, Address(SP, 0 * kWordSize));
   __ lw(S5, Address(SP, 1 * kWordSize));
   __ addiu(SP, SP, Immediate(2 * kWordSize));
@@ -1751,7 +1751,7 @@
   }
   // Pass IC data object.
   __ sw(S5, Address(SP, (num_slots - num_args - 4) * kWordSize));
-  __ CallRuntime(handle_ic_miss);
+  __ CallRuntime(handle_ic_miss, num_args + 1);
   __ TraceSimMsg("NArgsCheckInlineCacheStub return");
   // Pop returned code object into T3 (null if not found).
   // Restore arguments descriptor array and IC data array.
@@ -1904,7 +1904,7 @@
   __ addiu(SP, SP, Immediate(-2 * kWordSize));
   __ sw(S5, Address(SP, 1 * kWordSize));  // Preserve IC data.
   __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ lw(RA, Address(SP, 0 * kWordSize));
   __ lw(S5, Address(SP, 1 * kWordSize));
   __ addiu(SP, SP, Immediate(2 * kWordSize));
@@ -1945,7 +1945,7 @@
   __ sw(S5, Address(SP, 2 * kWordSize));  // Preserve IC data.
   __ sw(T3, Address(SP, 1 * kWordSize));  // Preserve function.
   __ sw(T3, Address(SP, 0 * kWordSize));  // Function argument.
-  __ CallRuntime(kCompileFunctionRuntimeEntry);
+  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
   __ lw(T3, Address(SP, 1 * kWordSize));  // Restore function.
   __ lw(S5, Address(SP, 2 * kWordSize));  // Restore IC data.
   __ addiu(SP, SP, Immediate(3 * kWordSize));
@@ -1988,7 +1988,7 @@
   __ sw(S5, Address(SP, 1 * kWordSize));
   __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
   __ sw(TMP, Address(SP, 0 * kWordSize));
-  __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry);
+  __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry, 0);
   // Pop code object result and restore arguments descriptor.
   __ lw(T0, Address(SP, 0 * kWordSize));
   __ lw(S5, Address(SP, 1 * kWordSize));
@@ -2012,7 +2012,7 @@
   // calling into the runtime.
   __ EnterStubFrame();
   __ Push(V0);
-  __ CallRuntime(kBreakpointReturnHandlerRuntimeEntry);
+  __ CallRuntime(kBreakpointReturnHandlerRuntimeEntry, 0);
   __ Pop(V0);
   __ LeaveStubFrame();
 
@@ -2030,7 +2030,7 @@
   __ TraceSimMsg("BreakpointDynamicStub");
   __ EnterStubFrame();
   __ Push(S5);
-  __ CallRuntime(kBreakpointDynamicHandlerRuntimeEntry);
+  __ CallRuntime(kBreakpointDynamicHandlerRuntimeEntry, 0);
   __ Pop(S5);
   __ LeaveStubFrame();
 
@@ -2285,7 +2285,7 @@
   __ LoadObject(TMP1, Symbols::EqualOperator());  // Target's name.
   __ sw(TMP1, Address(SP, 1 * kWordSize));
   __ sw(T0, Address(SP, 0 * kWordSize));  // ICData.
-  __ CallRuntime(kUpdateICDataTwoArgsRuntimeEntry);
+  __ CallRuntime(kUpdateICDataTwoArgsRuntimeEntry, 4);
   __ lw(A0, Address(SP, 2 * kWordSize));
   __ lw(A1, Address(SP, 3 * kWordSize));
   __ b(&compute_result);
@@ -2305,7 +2305,7 @@
   __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
   __ sw(TMP, Address(SP, 1 * kWordSize));
   __ sw(T0, Address(SP, 0 * kWordSize));
-  __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry);
+  __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry, 1);
   __ TraceSimMsg("OptimizeFunctionStub return");
   __ lw(T0, Address(SP, 1 * kWordSize));  // Get Code object
   __ lw(S4, Address(SP, 2 * kWordSize));  // Restore argument descriptor.
@@ -2392,7 +2392,7 @@
   __ sw(right, Address(SP, 0 * kWordSize));
   __ mov(A0, left);
   __ mov(A1, right);
-  __ CallRuntime(kBigintCompareRuntimeEntry);
+  __ CallRuntime(kBigintCompareRuntimeEntry, 2);
   __ TraceSimMsg("IdenticalWithNumberCheckStub return");
   // Result in V0, 0 means equal.
   __ LeaveStubFrame();
@@ -2422,7 +2422,7 @@
   // Call single step callback in debugger.
   __ addiu(SP, SP, Immediate(-1 * kWordSize));
   __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ lw(RA, Address(SP, 0 * kWordSize));
   __ addiu(SP, SP, Immediate(1 * kWordSize));
   __ Bind(&not_stepping);
diff --git a/runtime/vm/stub_code_mips_test.cc b/runtime/vm/stub_code_mips_test.cc
index 6fdbdfd..20a425b 100644
--- a/runtime/vm/stub_code_mips_test.cc
+++ b/runtime/vm/stub_code_mips_test.cc
@@ -51,7 +51,7 @@
   __ PushObject(smi1);  // Push argument 1 smi1.
   __ PushObject(smi2);  // Push argument 2 smi2.
   ASSERT(kTestSmiSubRuntimeEntry.argument_count() == argc);
-  __ CallRuntime(kTestSmiSubRuntimeEntry);  // Call SmiSub runtime func.
+  __ CallRuntime(kTestSmiSubRuntimeEntry, argc);  // Call SmiSub runtime func.
   __ addiu(SP, SP, Immediate(argc * kWordSize));
   __ Pop(V0);  // Pop return value from return slot.
   __ LeaveDartFrameAndReturn();
@@ -85,7 +85,7 @@
   __ ReserveAlignedFrameSpace(0);
   __ LoadObject(A0, smi1);  // Set up argument 1 smi1.
   __ LoadObject(A1, smi2);  // Set up argument 2 smi2.
-  __ CallRuntime(kTestLeafSmiAddRuntimeEntry);  // Call SmiAdd runtime func.
+  __ CallRuntime(kTestLeafSmiAddRuntimeEntry, 2);  // Call SmiAdd runtime func.
   __ LeaveDartFrameAndReturn();  // Return value is in V0.
 }
 
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index a0da196..87163a7 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -109,7 +109,7 @@
 void StubCode::GeneratePrintStopMessageStub(Assembler* assembler) {
   __ EnterCallRuntimeFrame(0);
   // Call the runtime leaf function. RDI already contains the parameter.
-  __ CallRuntime(kPrintStopMessageRuntimeEntry);
+  __ CallRuntime(kPrintStopMessageRuntimeEntry, 1);
   __ LeaveCallRuntimeFrame();
   __ ret();
 }
@@ -260,7 +260,7 @@
   __ EnterStubFrame();
   __ pushq(R10);  // Preserve arguments descriptor array.
   __ pushq(raw_null);  // Setup space on stack for return value.
-  __ CallRuntime(kPatchStaticCallRuntimeEntry);
+  __ CallRuntime(kPatchStaticCallRuntimeEntry, 0);
   __ popq(RAX);  // Get Code object result.
   __ popq(R10);  // Restore arguments descriptor array.
   // Remove the stub frame as we are about to jump to the dart function.
@@ -281,7 +281,7 @@
   __ EnterStubFrame();
   __ pushq(R10);  // Preserve arguments descriptor array.
   __ pushq(raw_null);  // Setup space on stack for return value.
-  __ CallRuntime(kFixCallersTargetRuntimeEntry);
+  __ CallRuntime(kFixCallersTargetRuntimeEntry, 0);
   __ popq(RAX);  // Get Code object.
   __ popq(R10);  // Restore arguments descriptor array.
   __ movq(RAX, FieldAddress(RAX, Code::instructions_offset()));
@@ -350,7 +350,7 @@
   __ movq(R10, R13);  // Smi-tagged arguments array length.
   PushArgumentsArray(assembler);
 
-  __ CallRuntime(kInstanceFunctionLookupRuntimeEntry);
+  __ CallRuntime(kInstanceFunctionLookupRuntimeEntry, 4);
 
   // Remove arguments.
   __ Drop(4);
@@ -414,7 +414,7 @@
 
   __ movq(RDI, RSP);  // Pass address of saved registers block.
   __ ReserveAlignedFrameSpace(0);
-  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry);
+  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
   // Result (RAX) is stack-size (FP - SP) in bytes.
 
   if (preserve_result) {
@@ -435,7 +435,7 @@
   }
   __ ReserveAlignedFrameSpace(0);
   __ movq(RDI, RBP);  // Pass last FP as parameter in RDI.
-  __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry);
+  __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);
   if (preserve_result) {
     // Restore result into RBX.
     __ movq(RBX, Address(RBP, kFirstLocalSlotFromFp * kWordSize));
@@ -451,7 +451,7 @@
     __ pushq(RBX);  // Preserve result, it will be GC-d here.
   }
   __ pushq(Immediate(Smi::RawValue(0)));  // Space for the result.
-  __ CallRuntime(kDeoptimizeMaterializeRuntimeEntry);
+  __ CallRuntime(kDeoptimizeMaterializeRuntimeEntry, 0);
   // Result tells stub how many bytes to remove from the expression stack
   // of the bottom-most frame. They were used as materialization arguments.
   __ popq(RBX);
@@ -503,7 +503,7 @@
   __ pushq(RAX);  // Receiver.
   __ pushq(RBX);  // IC data.
   __ pushq(R10);  // Arguments descriptor.
-  __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry);
+  __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry, 3);
   // Discard arguments.
   __ popq(RAX);
   __ popq(RAX);
@@ -648,7 +648,7 @@
   __ pushq(raw_null);  // Setup space on stack for return value.
   __ pushq(R10);  // Array length as Smi.
   __ pushq(RBX);  // Element type.
-  __ CallRuntime(kAllocateArrayRuntimeEntry);
+  __ CallRuntime(kAllocateArrayRuntimeEntry, 2);
   __ popq(RAX);  // Pop element type argument.
   __ popq(R10);  // Pop array length argument.
   __ popq(RAX);  // Pop return value from return slot.
@@ -704,7 +704,7 @@
 
   __ pushq(R10);  // Preserve arguments descriptor array.
   __ pushq(RBX);  // Preserve read-only function object argument.
-  __ CallRuntime(kCompileFunctionRuntimeEntry);
+  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
   __ popq(RBX);  // Restore read-only function object argument in RBX.
   __ popq(R10);  // Restore arguments descriptor array.
   // Restore RAX.
@@ -740,7 +740,7 @@
   __ movq(R10, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
   PushArgumentsArray(assembler);
 
-  __ CallRuntime(kInvokeNonClosureRuntimeEntry);
+  __ CallRuntime(kInvokeNonClosureRuntimeEntry, 2);
 
   // Remove arguments.
   __ Drop(2);
@@ -991,7 +991,7 @@
   __ pushq(raw_null);  // Setup space on stack for the return value.
   __ SmiTag(R10);
   __ pushq(R10);  // Push number of context variables.
-  __ CallRuntime(kAllocateContextRuntimeEntry);  // Allocate context.
+  __ CallRuntime(kAllocateContextRuntimeEntry, 1);  // Allocate context.
   __ popq(RAX);  // Pop number of context variables argument.
   __ popq(RAX);  // Pop the new context object.
   // RAX: new object
@@ -1057,7 +1057,7 @@
   // Setup frame, push callee-saved registers.
   __ EnterCallRuntimeFrame(0);
   __ movq(RDI, FieldAddress(CTX, Context::isolate_offset()));
-  __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry);
+  __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
   __ LeaveCallRuntimeFrame();
   __ ret();
 }
@@ -1227,7 +1227,7 @@
     __ pushq(raw_null);  // Push null type arguments.
     __ pushq(Immediate(Smi::RawValue(StubCode::kNoInstantiator)));
   }
-  __ CallRuntime(kAllocateObjectRuntimeEntry);  // Allocate object.
+  __ CallRuntime(kAllocateObjectRuntimeEntry, 3);  // Allocate object.
   __ popq(RAX);  // Pop argument (instantiator).
   __ popq(RAX);  // Pop argument (type arguments of object).
   __ popq(RAX);  // Pop argument (class of object).
@@ -1363,12 +1363,12 @@
     __ pushq(raw_null);  // Push null type arguments.
   }
   if (is_implicit_instance_closure) {
-    __ CallRuntime(kAllocateImplicitInstanceClosureRuntimeEntry);
+    __ CallRuntime(kAllocateImplicitInstanceClosureRuntimeEntry, 3);
     __ popq(RAX);  // Pop type arguments.
     __ popq(RAX);  // Pop receiver.
   } else {
     ASSERT(func.IsNonImplicitClosureFunction());
-    __ CallRuntime(kAllocateClosureRuntimeEntry);
+    __ CallRuntime(kAllocateClosureRuntimeEntry, 2);
     __ popq(RAX);  // Pop type arguments.
   }
   __ popq(RAX);  // Pop the function object.
@@ -1405,7 +1405,7 @@
   __ movq(R10, R13);  // Smi-tagged arguments array length.
   PushArgumentsArray(assembler);
 
-  __ CallRuntime(kInvokeNoSuchMethodFunctionRuntimeEntry);
+  __ CallRuntime(kInvokeNoSuchMethodFunctionRuntimeEntry, 4);
 
   // Remove arguments.
   __ Drop(4);
@@ -1428,7 +1428,7 @@
     __ pushq(ic_reg);       // Preserve.
     __ pushq(ic_reg);       // Argument.
     __ pushq(func_reg);     // Argument.
-    __ CallRuntime(kTraceICCallRuntimeEntry);
+    __ CallRuntime(kTraceICCallRuntimeEntry, 2);
     __ popq(RAX);          // Discard argument;
     __ popq(RAX);          // Discard argument;
     __ popq(ic_reg);       // Restore.
@@ -1485,7 +1485,7 @@
   __ j(EQUAL, &not_stepping, Assembler::kNearJump);
   __ EnterStubFrame();
   __ pushq(RBX);
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ popq(RBX);
   __ LeaveFrame();
   __ Bind(&not_stepping);
@@ -1561,7 +1561,7 @@
     __ pushq(RCX);
   }
   __ pushq(RBX);  // Pass IC data object.
-  __ CallRuntime(handle_ic_miss);
+  __ CallRuntime(handle_ic_miss, num_args + 1);
   // Remove the call arguments pushed earlier, including the IC data object.
   for (intptr_t i = 0; i < num_args + 1; i++) {
     __ popq(RAX);
@@ -1716,7 +1716,7 @@
   __ j(EQUAL, &not_stepping, Assembler::kNearJump);
   __ EnterStubFrame();
   __ pushq(RBX);  // Preserve IC data object.
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ popq(RBX);
   __ LeaveFrame();
   __ Bind(&not_stepping);
@@ -1750,7 +1750,7 @@
   __ pushq(R13);  // Preserve target function.
   __ pushq(RBX);  // Preserve IC data object.
   __ pushq(R13);  // Pass function.
-  __ CallRuntime(kCompileFunctionRuntimeEntry);
+  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
   __ popq(RAX);  // Discard argument.
   __ popq(RBX);  // Restore IC data object.
   __ popq(R13);  // Restore target function.
@@ -1786,7 +1786,7 @@
   const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ pushq(raw_null);  // Room for result.
-  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry);
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
   __ popq(RAX);  // Address of original.
   __ popq(R10);  // Restore arguments.
   __ popq(RBX);
@@ -1803,7 +1803,7 @@
   __ EnterStubFrame();
   __ pushq(RBX);  // Preserve IC data for unoptimized call.
   __ pushq(raw_null);  // Room for result.
-  __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry);
+  __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry, 0);
   __ popq(RAX);  // Code object.
   __ popq(RBX);  // Restore IC data.
   __ LeaveFrame();
@@ -1822,7 +1822,7 @@
 void StubCode::GenerateBreakpointReturnStub(Assembler* assembler) {
   __ EnterStubFrame();
   __ pushq(RAX);
-  __ CallRuntime(kBreakpointReturnHandlerRuntimeEntry);
+  __ CallRuntime(kBreakpointReturnHandlerRuntimeEntry, 0);
   __ popq(RAX);
   __ LeaveFrame();
 
@@ -1837,7 +1837,7 @@
 void StubCode::GenerateBreakpointDynamicStub(Assembler* assembler) {
   __ EnterStubFrame();
   __ pushq(RBX);
-  __ CallRuntime(kBreakpointDynamicHandlerRuntimeEntry);
+  __ CallRuntime(kBreakpointDynamicHandlerRuntimeEntry, 0);
   __ popq(RBX);
   __ LeaveFrame();
 
@@ -2089,7 +2089,7 @@
   __ pushq(RAX);  // arg 1
   __ PushObject(Symbols::EqualOperator());  // Target's name.
   __ pushq(RBX);  // ICData
-  __ CallRuntime(kUpdateICDataTwoArgsRuntimeEntry);
+  __ CallRuntime(kUpdateICDataTwoArgsRuntimeEntry, 4);
   __ Drop(4);
   __ LeaveFrame();
 
@@ -2106,7 +2106,7 @@
   __ pushq(R10);
   __ pushq(raw_null);  // Setup space on stack for return value.
   __ pushq(RDI);
-  __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry);
+  __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry, 1);
   __ popq(RAX);  // Disard argument.
   __ popq(RAX);  // Get Code object.
   __ popq(R10);  // Restore argument descriptor.
@@ -2171,7 +2171,7 @@
   __ ReserveAlignedFrameSpace(0);
   __ movq(RDI, left);
   __ movq(RSI, right);
-  __ CallRuntime(kBigintCompareRuntimeEntry);
+  __ CallRuntime(kBigintCompareRuntimeEntry, 2);
   // Result in RAX, 0 means equal.
   __ LeaveFrame();
   __ cmpq(RAX, Immediate(0));
@@ -2197,7 +2197,7 @@
   __ cmpq(RAX, Immediate(0));
   __ j(EQUAL, &not_stepping, Assembler::kNearJump);
   __ EnterStubFrame();
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ LeaveFrame();
   __ Bind(&not_stepping);
 
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index b73a0b4..769134d 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -51,7 +51,7 @@
   __ PushObject(smi1);  // Push argument 1 smi1.
   __ PushObject(smi2);  // Push argument 2 smi2.
   ASSERT(kTestSmiSubRuntimeEntry.argument_count() == argc);
-  __ CallRuntime(kTestSmiSubRuntimeEntry);  // Call SmiSub runtime func.
+  __ CallRuntime(kTestSmiSubRuntimeEntry, argc);  // Call SmiSub runtime func.
   __ AddImmediate(RSP, Immediate(argc * kWordSize));
   __ popq(RAX);  // Pop return value from return slot.
   __ leave();
@@ -86,7 +86,7 @@
   __ ReserveAlignedFrameSpace(0);
   __ LoadObject(RDI, smi1);  // Set up argument 1 smi1.
   __ LoadObject(RSI, smi2);  // Set up argument 2 smi2.
-  __ CallRuntime(kTestLeafSmiAddRuntimeEntry);  // Call SmiAdd runtime func.
+  __ CallRuntime(kTestLeafSmiAddRuntimeEntry, 2);  // Call SmiAdd runtime func.
   __ leave();
   __ ret();  // Return value is in RAX.
 }
diff --git a/sdk/lib/_collection_dev/iterable.dart b/sdk/lib/_collection_dev/iterable.dart
index 7013272..99659ac 100644
--- a/sdk/lib/_collection_dev/iterable.dart
+++ b/sdk/lib/_collection_dev/iterable.dart
@@ -7,7 +7,7 @@
 
 // This is a hack to make @deprecated work in dart:io. Don't remove or use this,
 // unless coordinated with either me or the core library team. Thanks!
-// TODO(ajohnsen): Remove at the 11th of Auguest 2013.
+// TODO(ajohnsen): Remove at the 11th of August 2013.
 // TODO(ajohnsen): Remove hide in:
 //    tools/dom/templates/html/dart2js/html_dart2js.darttemplate
 //    tools/dom/templates/html/dart2js/svg_dart2js.darttemplate
@@ -19,6 +19,7 @@
 //    tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
 //    tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
 //    tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
+//    sdk/lib/core/regexp.dart
 
 const deprecated = 0;
 
diff --git a/sdk/lib/_collection_dev/list.dart b/sdk/lib/_collection_dev/list.dart
index 1008dc1..f5db3bb 100644
--- a/sdk/lib/_collection_dev/list.dart
+++ b/sdk/lib/_collection_dev/list.dart
@@ -40,16 +40,6 @@
         "Cannot remove from a fixed-length list");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
   void removeWhere(bool test(E element)) {
     throw new UnsupportedError(
         "Cannot remove from a fixed-length list");
@@ -93,7 +83,7 @@
  * This mixin is intended to be mixed in on top of [ListMixin] on
  * unmodifiable lists.
  */
-abstract class UnmodifiableListMixin<E> {
+abstract class UnmodifiableListMixin<E> implements List<E> {
 
   void operator []=(int index, E value) {
     throw new UnsupportedError(
@@ -135,16 +125,6 @@
         "Cannot remove from an unmodifiable list");
   }
 
-  void removeAll(Iterable elements) {
-    throw new UnsupportedError(
-        "Cannot remove from an unmodifiable list");
-  }
-
-  void retainAll(Iterable elements) {
-    throw new UnsupportedError(
-        "Cannot remove from an unmodifiable list");
-  }
-
   void removeWhere(bool test(E element)) {
     throw new UnsupportedError(
         "Cannot remove from an unmodifiable list");
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 91ee72a..7e543d0 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -211,6 +211,14 @@
    */
   void registerRuntimeType(Enqueuer enqueuer, TreeElements elements) {}
 
+  /**
+   * Call this method to enable [noSuchMethod] handling in the
+   * backend.
+   */
+  void enableNoSuchMethod(Enqueuer enqueuer) {
+    enqueuer.registerInvocation(compiler.noSuchMethodSelector);
+  }
+
   void registerRequiredType(DartType type, Element enclosingElement) {}
   void registerClassUsingVariableExpression(ClassElement cls) {}
 
@@ -398,6 +406,9 @@
   /// Initialized when dart:mirrors is loaded.
   LibraryElement mirrorsLibrary;
 
+  /// Initialized when dart:typed_data is loaded.
+  LibraryElement typedDataLibrary;
+
   ClassElement objectClass;
   ClassElement closureClass;
   ClassElement boundClosureClass;
@@ -414,6 +425,7 @@
   ClassElement mapClass;
   ClassElement symbolClass;
   ClassElement stackTraceClass;
+  ClassElement typedDataClass;
 
   // Initialized after mirrorSystemClass has been resolved.
   FunctionElement symbolConstructor;
@@ -446,7 +458,6 @@
   Element identicalFunction;
   Element functionApplyMethod;
   Element invokeOnMethod;
-  Element createInvocationMirrorElement;
 
   Element get currentElement => _currentElement;
 
@@ -633,9 +644,7 @@
 
   bool get compileAll => false;
 
-  bool get disableTypeInference {
-    return disableTypeInferenceFlag || disableTypeInferenceForMirrors;
-  }
+  bool get disableTypeInference => disableTypeInferenceFlag;
 
   int getNextFreeClassId() => nextFreeClassId++;
 
@@ -711,7 +720,8 @@
       return spanFromElement(node);
     } else if (node is MetadataAnnotation) {
       MetadataAnnotation annotation = node;
-      return spanFromTokens(annotation.beginToken, annotation.endToken);
+      uri = annotation.annotatedElement.getCompilationUnit().script.uri;
+      return spanFromTokens(annotation.beginToken, annotation.endToken, uri);
     } else {
       throw 'No error location.';
     }
@@ -769,6 +779,10 @@
           findRequiredElement(library, const SourceString('MirrorSystem'));
       mirrorsUsedClass =
           findRequiredElement(library, const SourceString('MirrorsUsed'));
+    } else if (uri == new Uri(scheme: 'dart', path: 'typed_data')) {
+      typedDataLibrary = library;
+      typedDataClass =
+          findRequiredElement(library, const SourceString('TypedData'));
     } else if (uri == new Uri(scheme: 'dart', path: '_collection-dev')) {
       symbolImplementationClass =
           findRequiredElement(library, const SourceString('Symbol'));
@@ -1029,8 +1043,7 @@
       enqueuer.codegen.registerGetOfStaticFunction(mainApp.find(MAIN));
     }
     if (enabledNoSuchMethod) {
-      enqueuer.codegen.registerInvocation(noSuchMethodSelector);
-      enqueuer.codegen.addToWorkList(createInvocationMirrorElement);
+      backend.enableNoSuchMethod(enqueuer.codegen);
     }
     if (compileAll) {
       libraries.forEach((_, lib) => fullyEnqueueLibrary(lib, enqueuer.codegen));
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index 05c1d46..22f8351 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -653,11 +653,7 @@
 
     Selector selector = compiler.noSuchMethodSelector;
     compiler.enabledNoSuchMethod = true;
-    registerInvocation(selector);
-
-    compiler.createInvocationMirrorElement =
-        compiler.findHelper(Compiler.CREATE_INVOCATION_MIRROR);
-    addToWorkList(compiler.createInvocationMirrorElement);
+    compiler.backend.enableNoSuchMethod(this);
   }
 
   void forEach(f(WorkItem work)) {
diff --git a/sdk/lib/_internal/compiler/implementation/js/builder.dart b/sdk/lib/_internal/compiler/implementation/js/builder.dart
index a1d4f41..b0424c6 100644
--- a/sdk/lib/_internal/compiler/implementation/js/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/builder.dart
@@ -114,7 +114,9 @@
   }
 
   Expression toExpression(expression) {
-    if (expression is Expression) {
+    if (expression == null) {
+      return null;
+    } else if (expression is Expression) {
       return expression;
     } else if (expression is String) {
       return this(expression);
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index 8b6f872..a067322 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -221,9 +221,6 @@
   Element dispatchPropertyName;
   Element getNativeInterceptorMethod;
   Element defineNativeMethodsFinishMethod;
-  Element getDispatchPropertyMethod;
-  Element setDispatchPropertyMethod;
-  Element initializeDispatchPropertyMethod;
   bool needToInitializeDispatchProperty = false;
 
   bool seenAnyClass = false;
@@ -369,9 +366,12 @@
     if (element.isParameter()
         || element.isFieldParameter()
         || element.isField()) {
-      element = element.enclosingElement;
+      if (!canBeUsedForGlobalOptimizations(element.enclosingElement)) {
+        return false;
+      }
     }
-    return !helpersUsed.contains(element.declaration);
+    element = element.declaration;
+    return !isNeededForReflection(element) && !helpersUsed.contains(element);
   }
 
   bool isInterceptorClass(ClassElement element) {
@@ -478,22 +478,13 @@
         compiler.findInterceptor(const SourceString('mapTypeToInterceptor'));
     dispatchPropertyName =
         compiler.findInterceptor(const SourceString('dispatchPropertyName'));
-    getDispatchPropertyMethod =
-        compiler.findInterceptor(const SourceString('getDispatchProperty'));
-    setDispatchPropertyMethod =
-        compiler.findInterceptor(const SourceString('setDispatchProperty'));
     getNativeInterceptorMethod =
         compiler.findInterceptor(const SourceString('getNativeInterceptor'));
-    initializeDispatchPropertyMethod =
-        compiler.findInterceptor(
-            new SourceString(emitter.nameOfDispatchPropertyInitializer));
     defineNativeMethodsFinishMethod =
         compiler.findHelper(const SourceString('defineNativeMethodsFinish'));
 
     // These methods are overwritten with generated versions.
     inlineCache.markAsNonInlinable(getInterceptorMethod, insideLoop: true);
-    inlineCache.markAsNonInlinable(getDispatchPropertyMethod, insideLoop: true);
-    inlineCache.markAsNonInlinable(setDispatchPropertyMethod, insideLoop: true);
 
     List<ClassElement> classes = [
       jsInterceptorClass =
@@ -566,6 +557,9 @@
     objectEquals = compiler.lookupElementIn(
         compiler.objectClass, const SourceString('=='));
 
+    jsIndexingBehaviorInterface =
+        compiler.findHelper(const SourceString('JavaScriptIndexingBehavior'));
+
     specialOperatorEqClasses
         ..add(compiler.objectClass)
         ..add(jsInterceptorClass)
@@ -667,7 +661,6 @@
         // native classes.
         enqueue(enqueuer, getNativeInterceptorMethod, elements);
         enqueue(enqueuer, defineNativeMethodsFinishMethod, elements);
-        enqueue(enqueuer, initializeDispatchPropertyMethod, elements);
         enqueueClass(enqueuer, jsInterceptorClass, compiler.globalDependencies);
       }
     }
@@ -737,6 +730,18 @@
       addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, elements);
     } else if (Elements.isNativeOrExtendsNative(cls)) {
       addInterceptorsForNativeClassMembers(cls, enqueuer);
+    } else if (cls == jsIndexingBehaviorInterface) {
+      // These two helpers are used by the emitter and the codegen.
+      // Because we cannot enqueue elements at the time of emission,
+      // we make sure they are always generated.
+      enqueue(
+          enqueuer,
+          compiler.findHelper(const SourceString('isJsIndexable')),
+          elements);
+      enqueue(
+          enqueuer,
+          compiler.findInterceptor(const SourceString('dispatchPropertyName')),
+          elements);
     }
   }
 
@@ -746,7 +751,6 @@
     TreeElements elements = compiler.globalDependencies;
     enqueue(enqueuer, getNativeInterceptorMethod, elements);
     enqueue(enqueuer, defineNativeMethodsFinishMethod, elements);
-    enqueue(enqueuer, initializeDispatchPropertyMethod, elements);
     enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, elements);
     needToInitializeDispatchProperty = true;
   }
@@ -756,21 +760,11 @@
   }
 
   void enqueueHelpers(ResolutionEnqueuer world, TreeElements elements) {
-    jsIndexingBehaviorInterface =
-        compiler.findHelper(const SourceString('JavaScriptIndexingBehavior'));
-    if (jsIndexingBehaviorInterface != null) {
-      world.registerIsCheck(jsIndexingBehaviorInterface.computeType(compiler),
-                            elements);
-      enqueue(
-          world,
-          compiler.findHelper(const SourceString('isJsIndexable')),
-          elements);
-      enqueue(
-          world,
-          compiler.findInterceptor(const SourceString('dispatchPropertyName')),
-          elements);
-    }
-
+    // TODO(ngeoffray): Not enqueuing those two classes currently make
+    // the compiler potentially crash. However, any reasonable program
+    // will instantiate those two classes.
+    addInterceptors(jsBoolClass, world, elements);
+    addInterceptors(jsNullClass, world, elements);
     if (compiler.enableTypeAssertions) {
       // Unconditionally register the helper that checks if the
       // expression in an if/while/for is a boolean.
@@ -948,6 +942,11 @@
     enqueueInResolution(getFallThroughError(), elements);
   }
 
+  void enableNoSuchMethod(Enqueuer world) {
+    enqueue(world, getCreateInvocationMirror(), compiler.globalDependencies);
+    world.registerInvocation(compiler.noSuchMethodSelector);
+  }
+
   void registerSuperNoSuchMethod(TreeElements elements) {
     enqueueInResolution(getCreateInvocationMirror(), elements);
     enqueueInResolution(
@@ -1438,13 +1437,7 @@
       if (mustRetainMetadata) return;
       compiler.log('Retaining metadata.');
       mustRetainMetadata = true;
-      for (LibraryElement library in compiler.libraries.values) {
-        if (retainMetadataOf(library)) {
-          for (Link link = library.metadata; !link.isEmpty; link = link.tail) {
-            link.head.ensureResolved(compiler);
-          }
-        }
-      }
+      compiler.libraries.values.forEach(retainMetadataOf);
       for (Dependency dependency in metadataInstantiatedTypes) {
         registerMetadataInstantiatedType(dependency.type, dependency.user);
       }
@@ -1488,7 +1481,8 @@
     if (mustRetainMetadata) hasRetainedMetadata = true;
     if (mustRetainMetadata && isNeededForReflection(element)) {
       for (MetadataAnnotation metadata in element.metadata) {
-        metadata.value.accept(new ConstantCopier(compiler.constantHandler));
+        metadata.ensureResolved(compiler)
+            .value.accept(new ConstantCopier(compiler.constantHandler));
       }
       return true;
     }
@@ -1555,6 +1549,25 @@
     if (metaTargets != null) metaTargetsUsed.addAll(metaTargets);
   }
 
+  /**
+   * Returns `true` if [element] can be accessed through reflection, that is,
+   * is in the set of elements covered by a `MirrorsUsed` annotation.
+   *
+   * This property is used to tag emitted elements with a marker which is
+   * checked by the runtime system to throw an exception if an element is
+   * accessed (invoked, get, set) that is not accessible for the reflective
+   * system.
+   */
+  bool isAccessibleByReflection(Element element) {
+    if (hasInsufficientMirrorsUsed) return true;
+    return isNeededForReflection(element);
+  }
+
+  /**
+   * Returns `true` if the emitter must emit the element even though there
+   * is no direct use in the program, but because the reflective system may
+   * need to access it.
+   */
   bool isNeededForReflection(Element element) {
     if (hasInsufficientMirrorsUsed) return isTreeShakingDisabled;
     /// Record the name of [element] in [symbolsUsed]. Return true for
@@ -1591,6 +1604,34 @@
 
     return false;
   }
+
+  jsAst.Call generateIsJsIndexableCall(jsAst.Expression use1,
+                                       jsAst.Expression use2) {
+    Element dispatchProperty =
+        compiler.findInterceptor(const SourceString('dispatchPropertyName'));
+    String dispatchPropertyName = namer.isolateAccess(dispatchProperty);
+
+    // We pass the dispatch property record to the isJsIndexable
+    // helper rather than reading it inside the helper to increase the
+    // chance of making the dispatch record access monomorphic.
+    jsAst.PropertyAccess record = new jsAst.PropertyAccess(
+        use2, new jsAst.VariableUse(dispatchPropertyName));
+
+    List<jsAst.Expression> arguments = <jsAst.Expression>[use1, record];
+    FunctionElement helper =
+        compiler.findHelper(const SourceString('isJsIndexable'));
+    String helperName = namer.isolateAccess(helper);
+    return new jsAst.Call(new jsAst.VariableUse(helperName), arguments);
+  }
+
+  bool isTypedArray(TypeMask mask) {
+    // Just checking for [:TypedData:] is not sufficient, as it is an
+    // abstract class any user-defined class can implement. So we also
+    // check for the interface [JavaScriptIndexingBehavior].
+    return compiler.typedDataClass != null
+        && mask.satisfies(compiler.typedDataClass, compiler)
+        && mask.satisfies(jsIndexingBehaviorInterface, compiler);
+  }
 }
 
 /// Records that [type] is used by [user.element].
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
index f1b83d9..ae5c1f0 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
@@ -299,6 +299,12 @@
   }
 
   jsAst.Expression visitConstructed(ConstructedConstant constant) {
+    Element element = constant.type.element;
+    if (element.isForeign(compiler)
+        && element.name == const SourceString('JS_CONST')) {
+      StringConstant str = constant.fields[0];
+      return new jsAst.LiteralExpression(str.value.slowToString());
+    }
     jsAst.New instantiation = new jsAst.New(
         new jsAst.VariableUse(getJsConstructor(constant.type.element)),
         _array(constant.fields));
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index e7eb3ce..2b3fe3a 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -287,6 +287,7 @@
   static const RANGE2_LAST = 0x7e;
   static const RANGE3_FIRST = 0x25;   //  %&'()*+  encodes 10..16
   static const RANGE3_LAST = 0x2b;
+  static const REFLECTION_MARKER = 0x2d;
 
   jsAst.FunctionDeclaration get generateAccessorFunction {
     const RANGE1_SIZE = RANGE1_LAST - RANGE1_FIRST + 1;
@@ -298,11 +299,19 @@
 
     String receiverParamName = compiler.enableMinification ? "r" : "receiver";
     String valueParamName = compiler.enableMinification ? "v" : "value";
+    String reflectableField = namer.reflectableField;
 
     // function generateAccessor(field, prototype) {
     jsAst.Fun fun = js.fun(['field', 'prototype'], [
       js('var len = field.length'),
       js('var code = field.charCodeAt(len - 1)'),
+      js('var reflectable = false'),
+      js.if_('code == $REFLECTION_MARKER', [
+          js('len--'),
+          js('code = field.charCodeAt(len - 1)'),
+          js('field = field.substring(0, len)'),
+          js('reflectable = true')
+      ]),
       js('code = ((code >= $RANGE1_FIRST) && (code <= $RANGE1_LAST))'
           '    ? code - $RANGE1_ADJUST'
           '    : ((code >= $RANGE2_FIRST) && (code <= $RANGE2_LAST))'
@@ -329,7 +338,10 @@
           js('var receiver = (getterCode & 1) ? "this" : "$receiverParamName"'),
           js('var body = "return " + receiver + "." + field'),
           js('prototype["${namer.getterPrefix}" + accessorName] = '
-                 'new Function(args, body)')
+                 'new Function(args, body)'),
+          js.if_('!reflectable', [
+                 js('prototype["${namer.getterPrefix}" + accessorName].'
+                    '$reflectableField = false')])
         ]),
 
         // if (needsSetter) {
@@ -340,7 +352,10 @@
           js('var receiver = (setterCode & 1) ? "this" : "$receiverParamName"'),
           js('var body = receiver + "." + field + "$_=$_$valueParamName"'),
           js('prototype["${namer.setterPrefix}" + accessorName] = '
-                 'new Function(args, body)')
+                 'new Function(args, body)'),
+          js.if_('!reflectable', [
+                 js('prototype["${namer.setterPrefix}" + accessorName].'
+                    '$reflectableField = false')])
         ]),
 
       ]),
@@ -570,7 +585,7 @@
     // Object class to catch noSuchMethod invocations.
     ClassElement objectClass = compiler.objectClass;
     String createInvocationMirror = namer.getName(
-        compiler.createInvocationMirrorElement);
+        backend.getCreateInvocationMirror());
     String noSuchMethodName = namer.publicInstanceMethodNameByArity(
         Compiler.NO_SUCH_METHOD, Compiler.NO_SUCH_METHOD_ARG_COUNT);
     var type = 0;
@@ -857,8 +872,6 @@
     return js.fun('oldIsolate', [
       js('var isolateProperties = oldIsolate.${namer.isolatePropertiesName}'),
 
-      js(r'isolateProperties.$currentScript = null'),
-
       js('var isolatePrototype = oldIsolate.prototype'),
       js('var str = "{\\n"'),
       js('str += "var properties = '
@@ -1099,7 +1112,9 @@
 
     String reflectionName = getReflectionName(selector, invocationName);
     if (reflectionName != null) {
-      defineStub('+$reflectionName', js('0'));
+      var reflectable =
+          js(backend.isAccessibleByReflection(member) ? '1' : '0');
+      defineStub('+$reflectionName', reflectable);
     }
   }
 
@@ -1239,13 +1254,6 @@
     return field is ClosureFieldElement;
   }
 
-  String compiledFieldName(Element member) {
-    assert(member.isField());
-    return member.hasFixedBackendName()
-        ? member.fixedBackendName()
-        : namer.getName(member);
-  }
-
   /**
    * Documentation wanted -- johnniwinther
    *
@@ -1270,7 +1278,9 @@
       builder.addProperty(name, code);
       String reflectionName = getReflectionName(member, name);
       if (reflectionName != null) {
-        builder.addProperty('+$reflectionName', js('0'));
+        var reflectable =
+            js(backend.isAccessibleByReflection(member) ? '1' : '0');
+        builder.addProperty('+$reflectionName', reflectable);
       }
       code = backend.generatedBailoutCode[member];
       if (code != null) {
@@ -1325,7 +1335,10 @@
       String getter = '${namer.getterPrefix}$base';
       mangledFieldNames[getter] = name;
       recordedMangledNames.add(getter);
-      return null;
+      // TODO(karlklose,ahe): we do not actually need to store information
+      // about the name of this setter in the output, but it is needed for
+      // marking the function as invokable by reflection.
+      return '$name=';
     }
     if (elementOrSelector is Selector
         || elementOrSelector.isFunction()
@@ -1861,6 +1874,9 @@
               buffer.write(FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE]);
             }
           }
+          if (backend.isAccessibleByReflection(field)) {
+            buffer.write(new String.fromCharCode(REFLECTION_MARKER));
+          }
         }
       });
     }
@@ -2300,7 +2316,8 @@
       emitStaticFunction(buffer, name, code);
       String reflectionName = getReflectionName(element, name);
       if (reflectionName != null) {
-        buffer.write(',$n$n"+$reflectionName":${_}0');
+        var reflectable = backend.isAccessibleByReflection(element) ? 1 : 0;
+        buffer.write(',$n$n"+$reflectionName":${_}$reflectable');
       }
       jsAst.Expression bailoutCode = backend.generatedBailoutCode[element];
       if (bailoutCode != null) {
@@ -2809,8 +2826,7 @@
     String noSuchMethodName = namer.publicInstanceMethodNameByArity(
         Compiler.NO_SUCH_METHOD, Compiler.NO_SUCH_METHOD_ARG_COUNT);
 
-    Element createInvocationMirrorElement =
-        compiler.findHelper(const SourceString("createInvocationMirror"));
+    Element createInvocationMirrorElement = backend.getCreateInvocationMirror();
     String createInvocationMirrorName =
         namer.getName(createInvocationMirrorElement);
 
@@ -2871,7 +2887,7 @@
       }
 
       String createInvocationMirror = namer.getName(
-          compiler.createInvocationMirrorElement);
+          backend.getCreateInvocationMirror());
 
       assert(backend.isInterceptedName(Compiler.NO_SUCH_METHOD));
       jsAst.Expression expression = js('this.$noSuchMethodName')(
@@ -2907,18 +2923,15 @@
     return "${namer.isolateAccess(isolateMain)}($mainAccess)";
   }
 
-  String get nameOfDispatchPropertyInitializer => 'initializeDispatchProperty';
-
   jsAst.Expression generateDispatchPropertyInitialization() {
-    String ref(Element element) {
-      return '${namer.CURRENT_ISOLATE}.${namer.getName(element)}';
-    }
-
-    return js(ref(backend.initializeDispatchPropertyMethod))([
-        js.fun(['a'], [ js('${ref(backend.getDispatchPropertyMethod)} = a')]),
-        js.string(generateDispatchPropertyName(0)),
-        js('${ref(backend.jsPlainJavaScriptObjectClass)}.prototype')
-      ]);
+    return js('!#', js.fun([], [
+        js('var objectProto = Object.prototype'),
+        js.for_('var i = 0', null, 'i++', [
+            js('var property = "${generateDispatchPropertyName(0)}"'),
+            js.if_('i > 0', js('property = rootProperty + "_" + i')),
+            js.if_('!(property in  objectProto)',
+                   js.return_(
+                       js('init.dispatchPropertyName = property')))])])());
   }
 
   String generateDispatchPropertyName(int seed) {
@@ -2970,8 +2983,7 @@
     scripts[i].addEventListener("load", onLoad, false);
   }
 })(function(currentScript) {
-  ${namer.isolateName}.${namer.isolatePropertiesName}.\$currentScript =
-      currentScript;
+  init.currentScript = currentScript;
 
   if (typeof console !== "undefined" && typeof document !== "undefined" &&
       document.readyState == "loading") {
@@ -3380,6 +3392,10 @@
       //    }
       bool containsArray = classes.contains(backend.jsArrayClass);
       bool containsString = classes.contains(backend.jsStringClass);
+      bool containsJsIndexable = classes.any((cls) {
+        return compiler.world.isSubtype(
+            backend.jsIndexingBehaviorInterface, cls);
+      });
       // The index set operator requires a check on its set value in
       // checked mode, so we don't optimize the interceptor if the
       // compiler has type assertions enabled.
@@ -3393,26 +3409,42 @@
       jsAst.Expression isIntAndAboveZero = js('a0 >>> 0 === a0');
       jsAst.Expression belowLength = js('a0 < receiver.length');
       jsAst.Expression arrayCheck = js('receiver.constructor == Array');
+      jsAst.Expression indexableCheck =
+          backend.generateIsJsIndexableCall(js('receiver'), js('receiver'));
+
+      jsAst.Expression orExp(left, right) {
+        return left == null ? right : left.binary('||', right);
+      }
 
       if (selector.isIndex()) {
         jsAst.Expression stringCheck = js('typeof receiver == "string"');
         jsAst.Expression typeCheck;
         if (containsArray) {
-          if (containsString) {
-            typeCheck = arrayCheck.binary('||', stringCheck);
-          } else {
-            typeCheck = arrayCheck;
-          }
-        } else {
-          assert(containsString);
-          typeCheck = stringCheck;
+          typeCheck = arrayCheck;
+        }
+
+        if (containsString) {
+          typeCheck = orExp(typeCheck, stringCheck);
+        }
+
+        if (containsJsIndexable) {
+          typeCheck = orExp(typeCheck, indexableCheck);
         }
 
         return js.if_(typeCheck,
                       js.if_(isIntAndAboveZero.binary('&&', belowLength),
                              js.return_(js('receiver[a0]'))));
       } else {
-        jsAst.Expression isImmutableArray = arrayCheck.binary(
+        jsAst.Expression typeCheck;
+        if (containsArray) {
+          typeCheck = arrayCheck;
+        }
+
+        if (containsJsIndexable) {
+          typeCheck = orExp(typeCheck, indexableCheck);
+        }
+
+        jsAst.Expression isImmutableArray = typeCheck.binary(
             '&&', js(r'!receiver.immutable$list'));
         return js.if_(isImmutableArray.binary(
                       '&&', isIntAndAboveZero.binary('&&', belowLength)),
@@ -4030,6 +4062,7 @@
   // TODO(ahe): This code should be integrated in finishClasses.
   String getReflectionDataParser() {
     String metadataField = '"${namer.metadataField}"';
+    String reflectableField = namer.reflectableField;
     return '''
 (function (reflectionData) {
 '''
@@ -4078,7 +4111,9 @@
         var previousProperty;
         if (firstChar === "+") {
           mangledGlobalNames[previousProperty] = property.substring(1);
-          if (element && element.length) ''' // Breaking long line.
+          descriptor[previousProperty].''' // Break long line.
+'''$reflectableField = (descriptor[property] == 1);
+          if (element && element.length) ''' // Break long line.
 '''init.interfaces[previousProperty] = element;
         } else if (firstChar === "@") {
           property = property.substring(1);
@@ -4097,6 +4132,8 @@
               processStatics(init.statics[property] = element[prop]);
             } else if (firstChar === "+") {
               mangledNames[previousProp] = prop.substring(1);
+              element[previousProp].''' // Break long line.
+'''$reflectableField = (element[prop] == 1);
             } else if (firstChar === "@" && prop !== "@") {
               newDesc[prop.substring(1)][$metadataField] = element[prop];
             } else {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart
index 64d0cda..325ad0a 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart
@@ -154,30 +154,4 @@
       js('Isolate.${namer.isolatePropertiesName} = isolateProperties'),
       js.return_('Isolate')]);
   }
-
-  String get nameOfDispatchPropertyInitializer =>
-      'initializeDispatchPropertyCSP';
-
-  jsAst.Expression generateDispatchPropertyInitialization() {
-    String ref(Element topLevelElement) {
-      return '${namer.CURRENT_ISOLATE}.${namer.getName(topLevelElement)}';
-    }
-
-    jsAst.Expression makeGetter(int seed) {
-      return js.fun('a',
-          js.return_(js('a.${generateDispatchPropertyName(seed)}')));
-    }
-
-    List<jsAst.Expression> getters = <jsAst.Expression>[
-        makeGetter(3),
-        makeGetter(2),
-        makeGetter(1),
-        makeGetter(0)];
-
-    return js(ref(backend.initializeDispatchPropertyMethod))([
-        js.fun(['a'], [ js('${ref(backend.getDispatchPropertyMethod)} = a')]),
-        new jsAst.ArrayInitializer.from(getters),
-        js('${ref(backend.jsPlainJavaScriptObjectClass)}.prototype')
-      ]);
-  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index e1246bf..cfb179c 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -182,6 +182,7 @@
   final String setterPrefix = r'set$';
   final String metadataField = '@';
   final String callCatchAllName = r'call$catchAll';
+  final String reflectableField = r'$reflectable';
 
   /**
    * Map from top-level or static elements to their unique identifiers provided
@@ -243,6 +244,7 @@
       case 'GETTER_PREFIX': return getterPrefix;
       case 'SETTER_PREFIX': return setterPrefix;
       case 'CALL_CATCH_ALL': return callCatchAllName;
+      case 'REFLECTABLE': return reflectableField;
       default:
         compiler.reportError(
             node, MessageKind.GENERIC,
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index 9b3ac22..c5ccf96 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -429,25 +429,19 @@
     jsAst.Expression receiver;
     List<jsAst.Expression> arguments;
 
-    if (!nativeMethods.contains(member)) {
-      // When calling a method that has a native body, we call it with our
-      // calling conventions.
-      target = backend.namer.getName(member);
-      arguments = argumentsBuffer;
-    } else {
-      // When calling a JS method, we call it with the native name, and only the
-      // arguments up until the last one provided.
-      target = member.fixedBackendName();
+    assert(invariant(member, nativeMethods.contains(member)));
+    // When calling a JS method, we call it with the native name, and only the
+    // arguments up until the last one provided.
+    target = member.fixedBackendName();
 
-      if (isInterceptedMethod) {
-        receiver = argumentsBuffer[0];
-        arguments = argumentsBuffer.sublist(1,
-            indexOfLastOptionalArgumentInParameters + 1);
-      } else {
-        receiver = js('this');
-        arguments = argumentsBuffer.sublist(0,
-            indexOfLastOptionalArgumentInParameters + 1);
-      }
+    if (isInterceptedMethod) {
+      receiver = argumentsBuffer[0];
+      arguments = argumentsBuffer.sublist(1,
+          indexOfLastOptionalArgumentInParameters + 1);
+    } else {
+      receiver = js('this');
+      arguments = argumentsBuffer.sublist(0,
+          indexOfLastOptionalArgumentInParameters + 1);
     }
     statements.add(new jsAst.Return(receiver[target](arguments)));
 
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
index 144f395..98707c6 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
@@ -562,6 +562,10 @@
   Element findLocalMemberIn(Element element, SourceString name) {
     if (element is ScopeContainerElement) {
       ScopeContainerElement scope = element;
+      if (element.isClass()) {
+        ClassElement cls = element;
+        cls.ensureResolved(compiler);
+      }
       return scope.localLookup(name);
     }
     return null;
diff --git a/sdk/lib/_internal/compiler/implementation/patch_parser.dart b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
index 5ae5779..d21e842 100644
--- a/sdk/lib/_internal/compiler/implementation/patch_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
@@ -401,6 +401,7 @@
         origin.isConstructor() ||
         origin.isFunction() ||
         origin.isAbstractField())) {
+    // TODO(ahe): Remove this error when the parser rejects all bad modifiers.
     listener.reportError(origin, leg.MessageKind.PATCH_NONPATCHABLE);
     return;
   }
@@ -415,6 +416,7 @@
   } else if(patch.isFunction()) {
     tryPatchFunction(listener, origin, patch);
   } else {
+    // TODO(ahe): Remove this error when the parser rejects all bad modifiers.
     listener.reportError(patch, leg.MessageKind.PATCH_NONPATCHABLE);
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index ab20f51..314e8d7 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -595,6 +595,22 @@
   void error(String message, Token token) {
     throw new ParserError("$message @ ${token.charOffset}");
   }
+
+  void reportError(Spannable spannable,
+                   MessageKind errorCode,
+                   [Map arguments = const {}]) {
+    String message = errorCode.error(arguments, true).toString();
+    Token token;
+    Node node;
+    if (spannable is Token) {
+      token = spannable;
+    } else if (spannable is Node) {
+      node = spannable;
+    } else {
+      throw new ParserError(message);
+    }
+    recoverableError(message, token: token, node: node);
+  }
 }
 
 class ParserError {
@@ -1122,6 +1138,12 @@
     }
     pushNode(accumulator);
   }
+
+  void reportError(Spannable spannable,
+                   MessageKind errorCode,
+                   [Map arguments = const {}]) {
+    listener.reportError(spannable, errorCode, arguments);
+  }
 }
 
 class NodeListener extends ElementListener {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
index 327d1f2..064136f 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
@@ -48,7 +48,8 @@
   Token parseTopLevelDeclaration(Token token) {
     token = parseMetadataStar(token);
     final String value = token.stringValue;
-    if ((identical(value, 'abstract')) || (identical(value, 'class'))) {
+    if ((identical(value, 'abstract') && optional('class', token.next))
+        || identical(value, 'class')) {
       return parseClass(token);
     } else if (identical(value, 'typedef')) {
       return parseTypedef(token);
@@ -613,14 +614,8 @@
         identifiers = identifiers.tail;
       }
     }
-    parseModifierList(identifiers.reverse());
-    if (type == null) {
-      listener.handleNoType(token);
-    } else {
-      parseReturnTypeOpt(type);
-    }
-    token = parseIdentifier(name);
 
+    token = name.next;
     bool isField;
     while (true) {
       // Loop to allow the listener to rewrite the token stream for
@@ -645,32 +640,173 @@
         break;
       } else {
         token = listener.unexpected(token);
-        if (identical(token.kind, EOF_TOKEN)) {
-          // TODO(ahe): This is a hack. It would be better to tell the
-          // listener more explicitly that it must pop an identifier.
-          listener.endTopLevelFields(1, start, token);
-          return token;
-        }
+        if (identical(token.kind, EOF_TOKEN)) return token;
       }
     }
-    if (isField) {
-      int fieldCount = 1;
-      token = parseVariableInitializerOpt(token);
-      while (optional(',', token)) {
-        token = parseIdentifier(token.next);
-        token = parseVariableInitializerOpt(token);
-        ++fieldCount;
+    var modifiers = identifiers.reverse();
+    return isField
+        ? parseFields(start, modifiers, type, getOrSet, name, true)
+        : parseTopLevelMethod(start, modifiers, type, getOrSet, name);
+  }
+
+  bool isVarFinalOrConst(Token token) {
+    String value = token.stringValue;
+    return identical('var', value)
+        || identical('final', value)
+        || identical('const', value);
+  }
+
+  Token expectVarFinalOrConst(Link<Token> modifiers,
+                              bool hasType,
+                              bool allowStatic) {
+    int modifierCount = 0;
+    Token staticModifier;
+    if (allowStatic && !modifiers.isEmpty
+        && optional('static', modifiers.head)) {
+      staticModifier = modifiers.head;
+      modifierCount++;
+      parseModifier(staticModifier);
+      modifiers = modifiers.tail;
+    }
+    if (modifiers.isEmpty) {
+      listener.handleModifiers(modifierCount);
+      return null;
+    }
+    if (modifiers.tail.isEmpty) {
+      Token modifier = modifiers.head;
+      if (isVarFinalOrConst(modifier)) {
+        modifierCount++;
+        parseModifier(modifier);
+        listener.handleModifiers(modifierCount);
+        // TODO(ahe): The caller checks for "var Type name", perhaps we should
+        // check here instead.
+        return modifier;
       }
-      expectSemicolon(token);
+    }
+
+    // Slow case to report errors.
+    List<Token> modifierList = modifiers.toList();
+    Token varFinalOrConst =
+        modifierList.firstWhere(isVarFinalOrConst, orElse: () => null);
+    if (allowStatic && staticModifier == null) {
+      staticModifier =
+          modifierList.firstWhere(
+              (modifier) => optional('static', modifier), orElse: () => null);
+      if (staticModifier != null) {
+        modifierCount++;
+        parseModifier(staticModifier);
+        modifierList.remove(staticModifier);
+      }
+    }
+    bool hasTypeOrModifier = hasType;
+    if (varFinalOrConst != null) {
+      parseModifier(varFinalOrConst);
+      modifierCount++;
+      hasTypeOrModifier = true;
+      modifierList.remove(varFinalOrConst);
+    }
+    listener.handleModifiers(modifierCount);
+    var kind = hasTypeOrModifier
+        ? MessageKind.EXTRANEOUS_MODIFIER
+        : MessageKind.EXTRANEOUS_MODIFIER_REPLACE;
+    for (Token modifier in modifierList) {
+      listener.reportError(modifier, kind, {'modifier': modifier});
+    }
+    return null;
+  }
+
+  Token parseFields(Token start,
+                    Link<Token> modifiers,
+                    Token type,
+                    Token getOrSet,
+                    Token name,
+                    bool isTopLevel) {
+    bool hasType = type != null;
+    Token varFinalOrConst =
+        expectVarFinalOrConst(modifiers, hasType, !isTopLevel);
+    bool isVar = false;
+    bool hasModifier = false;
+    if (varFinalOrConst != null) {
+      hasModifier = true;
+      isVar = optional('var', varFinalOrConst);
+    }
+
+    if (getOrSet != null) {
+      var kind = (hasModifier || hasType)
+          ? MessageKind.EXTRANEOUS_MODIFIER
+          : MessageKind.EXTRANEOUS_MODIFIER_REPLACE;
+      listener.reportError(getOrSet, kind, {'modifier': getOrSet});
+    }
+
+    if (!hasType) {
+      listener.handleNoType(name);
+    } else if (optional('void', type)) {
+      listener.handleNoType(name);
+      // TODO(ahe): This error is reported twice, second time is from
+      // [parseVariablesDeclarationMaybeSemicolon] via
+      // [PartialFieldListElement.parseNode].
+      listener.reportError(type, MessageKind.VOID_NOT_ALLOWED);
+    } else {
+      parseType(type);
+      if (isVar) {
+        listener.reportError(
+            modifiers.head, MessageKind.EXTRANEOUS_MODIFIER,
+            {'modifier': modifiers.head});
+      }
+    }
+
+    Token token = parseIdentifier(name);
+
+    int fieldCount = 1;
+    token = parseVariableInitializerOpt(token);
+    while (optional(',', token)) {
+      token = parseIdentifier(token.next);
+      token = parseVariableInitializerOpt(token);
+      ++fieldCount;
+    }
+    expectSemicolon(token);
+    if (isTopLevel) {
       listener.endTopLevelFields(fieldCount, start, token);
     } else {
-      token = parseFormalParametersOpt(token);
-      token = parseFunctionBody(token, false);
-      listener.endTopLevelMethod(start, getOrSet, token);
+      listener.endFields(fieldCount, start, token);
     }
     return token.next;
   }
 
+  Token parseTopLevelMethod(Token start,
+                            Link<Token> modifiers,
+                            Token type,
+                            Token getOrSet,
+                            Token name) {
+    Token externalModifier;
+    for (Token modifier in modifiers) {
+      if (externalModifier == null && optional('external', modifier)) {
+        externalModifier = modifier;
+      } else {
+        listener.reportError(
+            modifier, MessageKind.EXTRANEOUS_MODIFIER, {'modifier': modifier});
+      }
+    }
+    if (externalModifier != null) {
+      parseModifier(externalModifier);
+      listener.handleModifiers(1);
+    } else {
+      listener.handleModifiers(0);
+    }
+
+    if (type == null) {
+      listener.handleNoType(name);
+    } else {
+      parseReturnTypeOpt(type);
+    }
+    Token token = parseIdentifier(name);
+
+    token = parseFormalParametersOpt(token);
+    token = parseFunctionBody(token, false, externalModifier != null);
+    listener.endTopLevelMethod(start, getOrSet, token);
+    return token.next;
+  }
+
   Link<Token> findMemberName(Token token) {
     Token start = token;
     Link<Token> identifiers = const Link<Token>();
@@ -877,6 +1013,7 @@
       return listener.unexpected(start);
     }
     Token name = identifiers.head;
+    Token afterName = name.next;
     identifiers = identifiers.tail;
     if (!identifiers.isEmpty) {
       if (optional('operator', identifiers.head)) {
@@ -898,18 +1035,8 @@
         identifiers = identifiers.tail;
       }
     }
-    parseModifierList(identifiers.reverse());
-    if (type == null) {
-      listener.handleNoType(token);
-    } else {
-      parseReturnTypeOpt(type);
-    }
 
-    if (optional('operator', name)) {
-      token = parseOperatorName(name);
-    } else {
-      token = parseIdentifier(name);
-    }
+    token = afterName;
     bool isField;
     while (true) {
       // Loop to allow the listener to rewrite the token stream for
@@ -941,38 +1068,96 @@
         }
       }
     }
-    if (isField) {
-      int fieldCount = 1;
-      token = parseVariableInitializerOpt(token);
-      if (getOrSet != null) {
-        listener.recoverableError("unexpected", token: getOrSet);
-      }
-      while (optional(',', token)) {
-        // TODO(ahe): Count these.
-        token = parseIdentifier(token.next);
-        token = parseVariableInitializerOpt(token);
-        ++fieldCount;
-      }
-      expectSemicolon(token);
-      listener.endFields(fieldCount, start, token);
-    } else {
-      token = parseQualifiedRestOpt(token);
-      token = parseFormalParametersOpt(token);
-      token = parseInitializersOpt(token);
-      if (optional('=', token)) {
-        token = parseRedirectingFactoryBody(token);
+
+    var modifiers = identifiers.reverse();
+    return isField
+        ? parseFields(start, modifiers, type, getOrSet, name, false)
+        : parseMethod(start, modifiers, type, getOrSet, name);
+
+  }
+
+  Token parseMethod(Token start,
+                    Link<Token> modifiers,
+                    Token type,
+                    Token getOrSet,
+                    Token name) {
+    Token externalModifier;
+    Token staticModifier;
+    Token constModifier;
+    int modifierCount = 0;
+    int allowedModifierCount = 1;
+    for (Token modifier in modifiers) {
+      if (externalModifier == null && optional('external', modifier)) {
+        modifierCount++;
+        externalModifier = modifier;
+        if (modifierCount != allowedModifierCount) {
+          listener.reportError(
+              modifier,
+              MessageKind.EXTRANEOUS_MODIFIER, {'modifier': modifier});
+        }
+        allowedModifierCount++;
+      } else if (staticModifier == null && optional('static', modifier)) {
+        modifierCount++;
+        staticModifier = modifier;
+        if (modifierCount != allowedModifierCount) {
+          listener.reportError(
+              modifier,
+              MessageKind.EXTRANEOUS_MODIFIER, {'modifier': modifier});
+        }
+      } else if (constModifier == null && optional('const', modifier)) {
+        modifierCount++;
+        constModifier = modifier;
+        if (modifierCount != allowedModifierCount) {
+          listener.reportError(
+              modifier,
+              MessageKind.EXTRANEOUS_MODIFIER, {'modifier': modifier});
+        }
       } else {
-        token = parseFunctionBody(token, false);
+        listener.reportError(
+            modifier, MessageKind.EXTRANEOUS_MODIFIER, {'modifier': modifier});
       }
-      listener.endMethod(getOrSet, start, token);
     }
+    parseModifierList(modifiers);
+
+    if (type == null) {
+      listener.handleNoType(name);
+    } else {
+      parseReturnTypeOpt(type);
+    }
+    Token token;
+    if (optional('operator', name)) {
+      token = parseOperatorName(name);
+      if (staticModifier != null) {
+        // TODO(ahe): Consider a more specific error message.
+        listener.reportError(
+            staticModifier, MessageKind.EXTRANEOUS_MODIFIER,
+            {'modifier': staticModifier});
+      }
+    } else {
+      token = parseIdentifier(name);
+    }
+
+    token = parseQualifiedRestOpt(token);
+    token = parseFormalParametersOpt(token);
+    token = parseInitializersOpt(token);
+    if (optional('=', token)) {
+      token = parseRedirectingFactoryBody(token);
+    } else {
+      token = parseFunctionBody(
+          token, false, staticModifier == null || externalModifier != null);
+    }
+    listener.endMethod(getOrSet, start, token);
     return token.next;
   }
 
   Token parseFactoryMethod(Token token) {
     assert(isFactoryDeclaration(token));
     Token start = token;
-    if (identical(token.stringValue, 'external')) token = token.next;
+    Token externalModifier;
+    if (identical(token.stringValue, 'external')) {
+      externalModifier = token;
+      token = token.next;
+    }
     Token constKeyword = null;
     if (optional('const', token)) {
       constKeyword = token;
@@ -986,7 +1171,7 @@
     if (optional('=', token)) {
       token = parseRedirectingFactoryBody(token);
     } else {
-      token = parseFunctionBody(token, false);
+      token = parseFunctionBody(token, false, externalModifier != null);
     }
     listener.endFactoryMethod(start, token);
     return token.next;
@@ -1029,7 +1214,7 @@
     if (optional('=', token)) {
       token = parseRedirectingFactoryBody(token);
     } else {
-      token = parseFunctionBody(token, false);
+      token = parseFunctionBody(token, false, true);
     }
     listener.endFunction(getOrSet, token);
     return token.next;
@@ -1039,7 +1224,7 @@
     listener.beginUnamedFunction(token);
     token = parseFormalParameters(token);
     bool isBlock = optional('{', token);
-    token = parseFunctionBody(token, true);
+    token = parseFunctionBody(token, true, false);
     listener.endUnamedFunction(token);
     return isBlock ? token.next : token;
   }
@@ -1061,7 +1246,7 @@
     token = parseFormalParameters(token);
     listener.handleNoInitializers();
     bool isBlock = optional('{', token);
-    token = parseFunctionBody(token, true);
+    token = parseFunctionBody(token, true, false);
     listener.endFunction(null, token);
     return isBlock ? token.next : token;
   }
@@ -1092,8 +1277,11 @@
     return token;
   }
 
-  Token parseFunctionBody(Token token, bool isExpression) {
+  Token parseFunctionBody(Token token, bool isExpression, bool allowAbstract) {
     if (optional(';', token)) {
+      if (!allowAbstract) {
+        listener.reportError(token, MessageKind.BODY_EXPECTED);
+      }
       listener.endFunctionBody(0, null, token);
       return token;
     } else if (optional('=>', token)) {
@@ -1825,6 +2013,7 @@
   }
 
   Token parseVariablesDeclarationNoSemicolon(Token token) {
+    // Only called when parsing a for loop, so this is for parsing locals.
     return parseVariablesDeclarationMaybeSemicolon(token, false);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
index 3b666ae..8054487 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
@@ -95,10 +95,13 @@
     return endGroup;
   }
 
-  Token parseFunctionBody(Token token, bool isExpression) {
+  Token parseFunctionBody(Token token, bool isExpression, bool allowAbstract) {
     assert(!isExpression);
     String value = token.stringValue;
     if (identical(value, ';')) {
+      if (!allowAbstract) {
+        listener.reportError(token, MessageKind.BODY_EXPECTED);
+      }
       // No body.
     } else if (identical(value, '=>')) {
       token = parseExpression(token.next);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index a9113e1..4c175a7 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -1664,7 +1664,21 @@
       // We're accessing a native JavaScript property called 'length'
       // on a JS String or a JS array. Therefore, the name of that
       // property should not be mangled.
-      push(new js.PropertyAccess.field(pop(), 'length'), node);
+      if (backend.isTypedArray(
+            node.receiver.instructionType.computeMask(compiler))) {
+        // TODO(12929): Remove this custom code for typed arrays once V8
+        // optimizes their length access.
+        // Do a call to `fetchLength` instead of accessing `length`
+        // directly. Because `fetchLength` is a constant we use its
+        // constant value instead.
+        Element element = compiler.findRequiredElement(
+            compiler.typedDataLibrary, const SourceString('fetchLength'));
+        Constant constant = compiler.constantHandler.compileConstant(element);
+        var jsConstant = backend.emitter.constantReference(constant);
+        push(new js.Call(jsConstant, [pop()]), node);
+      } else {
+        push(new js.PropertyAccess.field(pop(), 'length'), node);
+      }
     } else {
       String name = _fieldPropertyName(element);
       push(new js.PropertyAccess.field(pop(), name), node);
@@ -2190,30 +2204,19 @@
     push(new js.Binary('!=', pop(), new js.LiteralNull()));
   }
 
-  void checkIndexingBehavior(HInstruction input, {bool negative: false}) {
+  bool checkIndexingBehavior(HInstruction input, {bool negative: false}) {
+    if (!compiler.enqueuer.resolution.seenClasses.contains(
+          backend.jsIndexingBehaviorInterface)) {
+      return false;
+    }
+
     use(input);
-    js.Expression object = pop();
-
-    Element dispatchProperty =
-        compiler.findInterceptor(const SourceString('dispatchPropertyName'));
-    String dispatchPropertyName =
-        backend.namer.isolateAccess(dispatchProperty);
-    world.registerStaticUse(dispatchProperty);
-
-    // We pass the dispatch property record to the isJsIndexable
-    // helper rather than reading it inside the helper to increase the
-    // chance of making the dispatch record access monomorphic.
+    js.Expression object1 = pop();
     use(input);
-    js.PropertyAccess record = new js.PropertyAccess(
-        pop(), new js.VariableUse(dispatchPropertyName));
-
-    List<js.Expression> arguments = <js.Expression>[object, record];
-    FunctionElement helper =
-        compiler.findHelper(const SourceString('isJsIndexable'));
-    world.registerStaticUse(helper);
-    String helperName = backend.namer.isolateAccess(helper);
-    push(new js.Call(new js.VariableUse(helperName), arguments));
+    js.Expression object2 = pop();
+    push(backend.generateIsJsIndexableCall(object1, object2));
     if (negative) push(new js.Prefix('!', pop()));
+    return true;
   }
 
   void checkType(HInstruction input, HInstruction interceptor,
@@ -2447,8 +2450,10 @@
       js.Expression arrayTest = pop();
       checkImmutableArray(input);
       js.Binary notArrayOrImmutable = new js.Binary('||', arrayTest, pop());
-      checkIndexingBehavior(input, negative: true);
-      js.Binary notIndexing = new js.Binary('&&', notArrayOrImmutable, pop());
+      
+      js.Binary notIndexing = checkIndexingBehavior(input, negative: true)
+          ? new js.Binary('&&', notArrayOrImmutable, pop())
+          : notArrayOrImmutable;
       test = new js.Binary('||', objectTest, notIndexing);
     } else if (node.isReadableArray(compiler)) {
       // input is !Object
@@ -2457,8 +2462,10 @@
       js.Expression objectTest = pop();
       checkArray(input, '!==');
       js.Expression arrayTest = pop();
-      checkIndexingBehavior(input, negative: true);
-      js.Expression notIndexing = new js.Binary('&&', arrayTest, pop());
+      
+      js.Expression notIndexing = checkIndexingBehavior(input, negative: true)
+          ? new js.Binary('&&', arrayTest, pop())
+          : arrayTest;
       test = new js.Binary('||', objectTest, notIndexing);
     } else if (node.isIndexablePrimitive(compiler)) {
       // input is !String
@@ -2470,8 +2477,10 @@
       js.Expression objectTest = pop();
       checkArray(input, '!==');
       js.Expression arrayTest = pop();
-      checkIndexingBehavior(input, negative: true);
-      js.Binary notIndexingTest = new js.Binary('&&', arrayTest, pop());
+      
+      js.Binary notIndexingTest = checkIndexingBehavior(input, negative: true)
+          ? new js.Binary('&&', arrayTest, pop())
+          : arrayTest;
       js.Binary notObjectOrIndexingTest =
           new js.Binary('||', objectTest, notIndexingTest);
       test = new js.Binary('&&', stringTest, notObjectOrIndexingTest);
diff --git a/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
index a549a6e..e7061a9 100644
--- a/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
@@ -12,7 +12,7 @@
 import '../elements/elements.dart';
 import '../native_handler.dart' as native;
 import '../tree/tree.dart';
-import '../util/util.dart' show Link;
+import '../util/util.dart' show Link, Spannable;
 import 'types.dart'
     show TypesInferrer, FlatTypeMask, TypeMask, ContainerTypeMask,
          ElementTypeMask, TypeSystem, MinimalInferrerEngine;
@@ -168,7 +168,7 @@
    * Assignments on the element and the types inferred at
    * these assignments.
    */
-  Map<Node, TypeMask> get assignments => null;
+  Map<Spannable, TypeMask> get assignments => null;
 
   /**
    * Callers of an element.
@@ -204,7 +204,7 @@
     }
   }
 
-  void addAssignment(Node node, TypeMask mask) {
+  void addAssignment(Spannable node, TypeMask mask) {
     assignments[node] = mask;
   }
 
@@ -223,7 +223,7 @@
 }
 
 class ParameterTypeInformation extends TypeInformation {
-  Map<Node, TypeMask> assignments = new Map<Node, TypeMask>();
+  Map<Spannable, TypeMask> assignments = new Map<Spannable, TypeMask>();
   TypeMask type;
   TypeMask defaultType;
 
@@ -235,7 +235,7 @@
 class FieldTypeInformation extends TypeInformation {
   TypeMask type;
   Map<Element, int> callers = new Map<Element, int>();
-  Map<Node, TypeMask> assignments = new Map<Node, TypeMask>();
+  Map<Spannable, TypeMask> assignments = new Map<Spannable, TypeMask>();
   int analyzeCount = 0;
 
   void clear() {
@@ -384,7 +384,7 @@
    * [constraint] is a field assignment constraint, as described in
    * [InternalSimpleTypesInferrer].
    */
-  void recordTypeOfNonFinalField(Node node,
+  void recordTypeOfNonFinalField(Spannable node,
                                  Element field,
                                  T type,
                                  CallSite constraint);
@@ -407,7 +407,7 @@
   void recordReturnType(Element element, T type);
 
   /**
-   * Registers that [caller] calls [callee] at node [node], with
+   * Registers that [caller] calls [callee] at location [node], with
    * [selector], and [arguments]. Note that [selector] is null for
    * forwarding constructors.
    *
@@ -419,7 +419,7 @@
    *
    * [inLoop] tells whether the call happens in a loop.
    */
-  void registerCalledElement(Node node,
+  void registerCalledElement(Spannable node,
                              Selector selector,
                              Element caller,
                              Element callee,
@@ -626,7 +626,7 @@
    * returns that type.
    *
    */
-  Map<Node, CallSite> setterConstraints = new Map<Node, CallSite>();
+  Map<Spannable, CallSite> setterConstraints = new Map<Spannable, CallSite>();
 
   /**
    * The work list of the inferrer.
@@ -1184,7 +1184,7 @@
     typeInformationOf(callee).addCaller(caller);
   }
 
-  bool addArguments(Node node,
+  bool addArguments(Spannable node,
                     FunctionElement element,
                     ArgumentsTypes arguments) {
     FunctionTypeInformation info = typeInformationOf(element);
@@ -1232,7 +1232,7 @@
 
     ParameterTypeInformation info = typeInformationOf(parameter);
     TypeMask elementType;
-    info.assignments.forEach((Node node, TypeMask mask) {
+    info.assignments.forEach((Spannable node, TypeMask mask) {
       if (mask == null) {
         // Now that we know we have analyzed the function holding
         // [parameter], we have a default type for that [parameter].
@@ -1259,7 +1259,7 @@
    * [arguments]. [constraint] is a setter constraint (see
    * [setterConstraints] documentation).
    */
-  void registerCalledElement(Node node,
+  void registerCalledElement(Spannable node,
                              Selector selector,
                              Element caller,
                              Element callee,
@@ -1329,7 +1329,7 @@
     typeInformationOf(callee).removeCall(caller);
     if (callee.isField()) {
       if (selector.isSetter()) {
-        Map<Node, TypeMask> assignments = typeInformationOf(callee).assignments;
+        Map<Spannable, TypeMask> assignments = typeInformationOf(callee).assignments;
         if (assignments == null || !assignments.containsKey(node)) return;
         assignments.remove(node);
         if (hasAnalyzedAll) updateNonFinalFieldType(callee);
@@ -1339,7 +1339,7 @@
     } else {
       FunctionElement element = callee;
       element.computeSignature(compiler).forEachParameter((Element parameter) {
-        Map<Node, TypeMask> assignments =
+        Map<Spannable, TypeMask> assignments =
             typeInformationOf(parameter).assignments;
         if (assignments == null || !assignments.containsKey(node)) return;
         assignments.remove(node);
@@ -1438,7 +1438,7 @@
    * Records an assignment to [element] with the given
    * [argumentType].
    */
-  void recordTypeOfNonFinalField(Node node,
+  void recordTypeOfNonFinalField(Spannable node,
                                  Element element,
                                  TypeMask argumentType,
                                  CallSite constraint) {
@@ -1457,10 +1457,10 @@
   }
 
   TypeMask computeTypeWithConstraints(Element element,
-                                      Map<Node, TypeMask> assignments) {
+                                      Map<Spannable, TypeMask> assignments) {
     List<CallSite> constraints = <CallSite>[];
     TypeMask elementType;
-    assignments.forEach((Node node, TypeMask mask) {
+    assignments.forEach((Spannable node, TypeMask mask) {
       CallSite constraint = setterConstraints[node];
       if (constraint != null) {
         // If this update has a constraint, we collect it and don't
@@ -1516,7 +1516,7 @@
     assert(hasAnalyzedAll);
 
     TypeInformation info = typeInformationOf(element);
-    Map<Node, TypeMask> assignments = info.assignments;
+    Map<Spannable, TypeMask> assignments = info.assignments;
     if (assignments.isEmpty) return;
 
     TypeMask fieldType = computeTypeWithConstraints(element, assignments);
@@ -1675,14 +1675,12 @@
                 parameterType,
                 null);
           }
-        } else {
-          locals.update(element, parameterType, node);
         }
+        locals.update(element, parameterType, node);
       });
       if (analyzedElement.isSynthesized) {
-        // Use the enclosing class of the synthesized constructor as
-        // the location for the initialized fields.
-        node = analyzedElement.enclosingElement.parseNode(compiler);
+        node = analyzedElement;
+        synthesizeForwardingCall(node, analyzedElement.targetConstructor);
       } else {
         visitingInitializers = true;
         visit(node.initializers);
@@ -2237,40 +2235,45 @@
     returnType = inferrer.addReturnTypeFor(analyzedElement, returnType, type);
   }
 
+  void synthesizeForwardingCall(Spannable node, FunctionElement element) {
+    element = element.implementation;
+    FunctionElement function = analyzedElement;
+    FunctionSignature signature = function.computeSignature(compiler);
+    List<T> unnamed = <T>[];
+    Map<SourceString, T> named = new Map<SourceString, T>();
+    signature.forEachRequiredParameter((Element element) {
+      assert(locals.use(element) != null);
+      unnamed.add(locals.use(element));
+    });
+    signature.forEachOptionalParameter((Element element) {
+      if (signature.optionalParametersAreNamed) {
+        named[element.name] = locals.use(element);
+      } else {
+        unnamed.add(locals.use(element));
+      }
+    });
+    ArgumentsTypes arguments = new ArgumentsTypes<T>(unnamed, named);
+    inferrer.registerCalledElement(node,
+                                   null,
+                                   outermostElement,
+                                   element,
+                                   arguments,
+                                   null,
+                                   sideEffects,
+                                   inLoop);
+  }
+
   T visitReturn(Return node) {
     if (node.isRedirectingFactoryBody) {
       Element element = elements[node.expression];
       if (Elements.isErroneousElement(element)) {
         recordReturnType(types.dynamicType);
       } else {
-        element = element.implementation;
         // We don't create a selector for redirecting factories, and
         // the send is just a property access. Therefore we must
         // manually create the [ArgumentsTypes] of the call, and
         // manually register [analyzedElement] as a caller of [element].
-        FunctionElement function = analyzedElement;
-        FunctionSignature signature = function.computeSignature(compiler);
-        List<T> unnamed = <T>[];
-        Map<SourceString, T> named = new Map<SourceString, T>();
-        signature.forEachRequiredParameter((Element element) {
-          unnamed.add(locals.use(element));
-        });
-        signature.forEachOptionalParameter((Element element) {
-          if (signature.optionalParametersAreNamed) {
-            named[element.name] = locals.use(element);
-          } else {
-            unnamed.add(locals.use(element));
-          }
-        });
-        ArgumentsTypes arguments = new ArgumentsTypes<T>(unnamed, named);
-        inferrer.registerCalledElement(node.expression,
-                                       null,
-                                       outermostElement,
-                                       element,
-                                       arguments,
-                                       null,
-                                       sideEffects,
-                                       inLoop);
+        synthesizeForwardingCall(node.expression, element);
         recordReturnType(inferrer.returnTypeOfElement(element));
       }
     } else {
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index 7edacfa..2fe05d7 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -4,6 +4,8 @@
 
 part of dart2js;
 
+const DONT_KNOW_HOW_TO_FIX = "";
+
 /**
  * The messages in this file should meet the following guide lines:
  *
@@ -540,7 +542,13 @@
       warning: const MessageKind('Warning: Cannot resolve setter.'));
 
   static const MessageKind VOID_NOT_ALLOWED = const MessageKind(
-      'Error: Type "void" is only allowed in a return type.');
+      "Error: Type 'void' can't be used here because it isn't a return type.",
+      howToFix: "Try removing 'void' keyword or replace it with 'var', 'final',"
+          " or a type.",
+      examples: const [
+          "void x; main() {}",
+          "foo(void x) {} main() { foo(null); }",
+      ]);
 
   static const MessageKind BEFORE_TOP_LEVEL = const MessageKind(
       'Error: Part header must come before top-level definitions.');
@@ -659,7 +667,7 @@
       howToFix: "Did you forget to add quotes?",
       examples: const [
           """
-// 'main' is a method, not a class.
+// 'Foo' is a type literal, not a string.
 @MirrorsUsed(symbols: const [Foo])
 import 'dart:mirrors';
 
@@ -754,6 +762,8 @@
 
   static const MessageKind READ_SCRIPT_ERROR = const MessageKind(
       "Error: Can't read '#{uri}' (#{exception}).",
+      // Don't know how to fix since the underlying error is unknown.
+      howToFix: DONT_KNOW_HOW_TO_FIX,
       examples: const [
           """
 // 'foo.dart' does not exist.
@@ -762,6 +772,47 @@
 main() {}
 """]);
 
+  static const MessageKind EXTRANEOUS_MODIFIER = const MessageKind(
+      "Error: Can't have modifier '#{modifier}' here.",
+      howToFix: "Try removing '#{modifier}'.",
+      examples: const [
+          "var String foo; main(){}",
+          // "var get foo; main(){}",
+          "var set foo; main(){}",
+          "var final foo; main(){}",
+          "var var foo; main(){}",
+          "var const foo; main(){}",
+          "var abstract foo; main(){}",
+          "var static foo; main(){}",
+          "var external foo; main(){}",
+          "get var foo; main(){}",
+          "set var foo; main(){}",
+          "final var foo; main(){}",
+          "var var foo; main(){}",
+          "const var foo; main(){}",
+          "abstract var foo; main(){}",
+          "static var foo; main(){}",
+          "external var foo; main(){}"]);
+
+  static const MessageKind EXTRANEOUS_MODIFIER_REPLACE = const MessageKind(
+      "Error: Can't have modifier '#{modifier}' here.",
+      howToFix: "Try replacing modifier '#{modifier}' with 'var', 'final',"
+          " or a type.",
+      examples: const [
+          // "get foo; main(){}",
+          "set foo; main(){}",
+          "abstract foo; main(){}",
+          "static foo; main(){}",
+          "external foo; main(){}"]);
+
+  static const MessageKind BODY_EXPECTED = const MessageKind(
+      "Error: Expected a function body or '=>'.",
+      // TODO(ahe): In some scenarios, we can suggest removing the 'static'
+      // keyword.
+      howToFix: "Try adding {}.",
+      examples: const [
+          "main();"]);
+
   static const MessageKind COMPILER_CRASHED = const MessageKind(
       'Error: The compiler crashed when compiling this element.');
 
@@ -844,6 +895,8 @@
   static const MessageKind PATCH_NON_EXISTING = const MessageKind(
       'Error: Origin does not exist for patch "#{name}".');
 
+  // TODO(ahe): Eventually, this error should be removed as it will be handled
+  // by the regular parser.
   static const MessageKind PATCH_NONPATCHABLE = const MessageKind(
       'Error: Only classes and functions can be patched.');
 
@@ -886,6 +939,8 @@
   CompilationError error([Map arguments = const {}, bool terse = false]) {
     return new CompilationError(this, arguments, terse);
   }
+
+  bool get hasHowToFix => howToFix != null && howToFix != DONT_KNOW_HOW_TO_FIX;
 }
 
 class DualKind {
@@ -916,7 +971,7 @@
           CURRENT_ELEMENT_SPANNABLE,
           !message.contains(new RegExp(r'#\{.+\}')),
           message: 'Missing arguments in error message: "$message"'));
-      if (!terse && kind.howToFix != null) {
+      if (!terse && kind.hasHowToFix) {
         String howToFix = kind.howToFix;
         arguments.forEach((key, value) {
           String string = slowToString(value);
diff --git a/sdk/lib/_internal/compiler/implementation/world.dart b/sdk/lib/_internal/compiler/implementation/world.dart
index 2382113..4d25945 100644
--- a/sdk/lib/_internal/compiler/implementation/world.dart
+++ b/sdk/lib/_internal/compiler/implementation/world.dart
@@ -174,6 +174,11 @@
         : false;
   }
 
+  bool isSubtype(ClassElement supertype, ClassElement test) {
+    Set<ClassElement> subtypes = subtypesOf(supertype);
+    return subtypes != null && subtypes.contains(test.declaration);
+  }
+
   void registerUsedElement(Element element) {
     if (element.isInstanceMember() && !element.isAbstract(compiler)) {
       allFunctions.add(element);
diff --git a/sdk/lib/_internal/compiler/samples/jsonify/jsonify.dart b/sdk/lib/_internal/compiler/samples/jsonify/jsonify.dart
index 82232c9..931e24b 100644
--- a/sdk/lib/_internal/compiler/samples/jsonify/jsonify.dart
+++ b/sdk/lib/_internal/compiler/samples/jsonify/jsonify.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:io';
-import 'dart:json';
+import 'dart:convert';
 
 // TODO(ahe): Should be dart:mirrors.
 import '../../implementation/mirrors/mirrors.dart';
@@ -92,7 +92,7 @@
 library dart.sdk_sources;
 
 const Map<String, String> SDK_SOURCES = const <String, String>''');
-  output.writeStringSync(stringify(map).replaceAll(r'$', r'\$'));
+  output.writeStringSync(JSON.encode(map).replaceAll(r'$', r'\$'));
   output.writeStringSync(';\n');
   output.closeSync();
 }
diff --git a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
index f005351..1f94af6 100644
--- a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
@@ -17,9 +17,9 @@
 library dartdoc;
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:io';
 import 'dart:isolate';
-import 'dart:json' as json;
 import 'dart:math';
 
 import 'package:path/path.dart' as path;
@@ -778,7 +778,7 @@
    */
   void docNavigationJson() {
     startFile('nav.json');
-    writeln(json.stringify(createNavigationInfo()));
+    writeln(JSON.encode(createNavigationInfo()));
     endFile();
   }
   /// Whether dartdoc is running from within the Dart SDK or the
@@ -802,7 +802,7 @@
     if (!tmpDir.existsSync()) {
         tmpDir.createSync();
     }
-    String jsonString = json.stringify(createNavigationInfo());
+    String jsonString = JSON.encode(createNavigationInfo());
     String dartString = jsonString.replaceAll(r"$", r"\$");
     var filePath = path.join(tmpPath, 'client.dart');
 
diff --git a/sdk/lib/_internal/dartdoc/lib/src/client/client-live-nav.dart b/sdk/lib/_internal/dartdoc/lib/src/client/client-live-nav.dart
index 9d52c49..958fcb1 100644
--- a/sdk/lib/_internal/dartdoc/lib/src/client/client-live-nav.dart
+++ b/sdk/lib/_internal/dartdoc/lib/src/client/client-live-nav.dart
@@ -6,7 +6,7 @@
 library client;
 
 import 'dart:html';
-import 'dart:json' as jsonlib;
+import 'dart:convert';
 // TODO(rnystrom): Use "package:" URL (#4968).
 import '../../classify.dart';
 import '../../markdown.dart' as md;
@@ -20,7 +20,7 @@
 
   // Request the navigation data so we can build the HTML for it.
   HttpRequest.getString('${prefix}nav.json').then((text) {
-    var json = jsonlib.parse(text);
+    var json = JSON.decode(text);
     buildNavigation(json);
     setupSearch(json);
   });
diff --git a/sdk/lib/_internal/dartdoc/lib/src/json_serializer.dart b/sdk/lib/_internal/dartdoc/lib/src/json_serializer.dart
index 9f9915ab..8bfa7bb 100755
--- a/sdk/lib/_internal/dartdoc/lib/src/json_serializer.dart
+++ b/sdk/lib/_internal/dartdoc/lib/src/json_serializer.dart
@@ -10,8 +10,8 @@
 library json_serializer;
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:mirrors';
-import 'dart:json' as json;
 
 String serialize(Object o) {
   var printer = new JsonPrinter();
@@ -207,7 +207,7 @@
     } else {
       // Convenient hack to remove the pretty printing this serializer adds by
       // default.
-      return json.stringify(json.parse(_sb.toString()));
+      return JSON.encode(JSON.decode(_sb.toString()));
     }
   }
 
diff --git a/sdk/lib/_internal/lib/async_patch.dart b/sdk/lib/_internal/lib/async_patch.dart
index 78ce9cd..850d4e6 100644
--- a/sdk/lib/_internal/lib/async_patch.dart
+++ b/sdk/lib/_internal/lib/async_patch.dart
@@ -40,39 +40,56 @@
   // TODO(ahe): Validate libraryName.  Kasper points out that you want
   // to be able to experiment with the effect of toggling @DeferLoad,
   // so perhaps we should silently ignore "bad" library names.
-  Completer completer = new Completer<bool>();
   Future<bool> future = _loadedLibraries[libraryName];
   if (future != null) {
-    future.then((_) { completer.complete(false); });
-    return completer.future;
-  }
-  _loadedLibraries[libraryName] = completer.future;
-
-  if (uri == null) {
-    uri = IsolateNatives.thisScript;
-    int index = uri.lastIndexOf('/');
-    uri = '${uri.substring(0, index + 1)}part.js';
+    return future.then((_) => false);
   }
 
-  if (_hasDocument) {
+  if (IsolateNatives.isJsshell) {
+    // TODO(ahe): Move this code to a JavaScript command helper script that is
+    // not included in generated output.
+    return _loadedLibraries[libraryName] = new Future<bool>(() {
+      if (uri == null) uri = 'part.js';
+      // Create a new function to avoid getting access to current function
+      // context.
+      JS('void', '(new Function(#))()', 'loadRelativeToScript("$uri")');
+      return true;
+    });
+  } else if (IsolateNatives.isD8) {
+    // TODO(ahe): Move this code to a JavaScript command helper script that is
+    // not included in generated output.
+    return _loadedLibraries[libraryName] = new Future<bool>(() {
+      if (uri == null) {
+        uri = IsolateNatives.computeThisScriptD8();
+        int index = uri.lastIndexOf('/');
+        uri = '${uri.substring(0, index + 1)}part.js';
+      }
+      // Create a new function to avoid getting access to current function
+      // context.
+      JS('void', '(new Function(#))()', 'load("$uri")');
+      return true;
+    });
+  }
+
+  return _loadedLibraries[libraryName] = new Future<bool>(() {
+    Completer completer = new Completer<bool>();
+    if (uri == null) {
+      uri = IsolateNatives.thisScript;
+      int index = uri.lastIndexOf('/');
+      uri = '${uri.substring(0, index + 1)}part.js';
+    }
+
     // Inject a script tag.
     var script = JS('', 'document.createElement("script")');
     JS('', '#.type = "text/javascript"', script);
-    JS('', '#.async = "async"', script);
     JS('', '#.src = #', script, uri);
     var onLoad = JS('', '#.bind(null, #)',
                     DART_CLOSURE_TO_JS(_onDeferredLibraryLoad), completer);
     JS('', '#.addEventListener("load", #, false)', script, onLoad);
     JS('', 'document.body.appendChild(#)', script);
-  } else if (JS('String', 'typeof load') == 'function') {
-    Timer.run(() {
-      JS('void', 'load(#)', uri);
-      completer.complete(true);
-    });
-  } else {
-    throw new UnsupportedError('load not supported');
-  }
-  return completer.future;
+
+    return completer.future;
+  });
 }
 
 /// Used to implement deferred loading. Used as callback on "load"
diff --git a/sdk/lib/_internal/lib/core_patch.dart b/sdk/lib/_internal/lib/core_patch.dart
index 3a4f7ac..aaa8164 100644
--- a/sdk/lib/_internal/lib/core_patch.dart
+++ b/sdk/lib/_internal/lib/core_patch.dart
@@ -35,9 +35,9 @@
   patch dynamic noSuchMethod(Invocation invocation) {
     throw new NoSuchMethodError(
         this,
-        _symbolToString(invocation.memberName),
+        invocation.memberName,
         invocation.positionalArguments,
-        _symbolMapToStringMap(invocation.namedArguments));
+        invocation.namedArguments);
   }
 
   patch Type get runtimeType => getRuntimeType(this);
@@ -221,10 +221,10 @@
 }
 
 patch class RegExp {
-  patch factory RegExp(String pattern,
+  patch factory RegExp(String source,
                        {bool multiLine: false,
                         bool caseSensitive: true})
-    => new JSSyntaxRegExp(pattern,
+    => new JSSyntaxRegExp(source,
                           multiLine: multiLine,
                           caseSensitive: caseSensitive);
 }
@@ -276,11 +276,11 @@
       }
     }
     if (_namedArguments != null) {
-      _namedArguments.forEach((String key, var value) {
+      _namedArguments.forEach((Symbol key, var value) {
         if (i > 0) {
           sb.write(", ");
         }
-        sb.write(key);
+        sb.write(_symbolToString(key));
         sb.write(": ");
         sb.write(Error.safeToString(value));
         i++;
diff --git a/sdk/lib/_internal/lib/foreign_helper.dart b/sdk/lib/_internal/lib/foreign_helper.dart
index 9ba05eb..a45d9bf 100644
--- a/sdk/lib/_internal/lib/foreign_helper.dart
+++ b/sdk/lib/_internal/lib/foreign_helper.dart
@@ -255,3 +255,17 @@
  * externally initialized elements.
  */
 void JS_EFFECT(Function code) { code(null); }
+
+/**
+ * Use this class for creating constants that hold JavaScript code.
+ * For example:
+ *
+ * const constant = JS_CONST('typeof window != "undefined");
+ *
+ * This code will generate:
+ * $.JS_CONST_1 = typeof window != "undefined";
+ */
+class JS_CONST {
+  String code;
+  const JS_CONST(this.code);
+}
diff --git a/sdk/lib/_internal/lib/interceptors.dart b/sdk/lib/_internal/lib/interceptors.dart
index c40b797..149814b 100644
--- a/sdk/lib/_internal/lib/interceptors.dart
+++ b/sdk/lib/_internal/lib/interceptors.dart
@@ -66,21 +66,11 @@
 var dispatchPropertyName = null;
 
 getDispatchProperty(object) {
-  // This is a magic method: the compiler replaces it with a runtime generated
-  // function
-  //
-  //     function(object){return object._zzyzx;}
-  //
-  // where `_zzyzx` is replaced with the actual [dispatchPropertyName].
-  //
-  // The CSP compliant version replaces this function with one of a few
-  // pre-compiled accessors, unless the pre-compiled versions are all in use,
-  // when it falls back on this code.
-  return JS('', '#[#]', object, dispatchPropertyName);
+  return JS('', '#[#]', object, JS('String', 'init.dispatchPropertyName'));
 }
 
 setDispatchProperty(object, value) {
-  defineProperty(object, dispatchPropertyName, value);
+  defineProperty(object, JS('String', 'init.dispatchPropertyName'), value);
 }
 
 makeDispatchRecord(interceptor, proto, extension, indexability) {
@@ -159,86 +149,6 @@
   return getNativeInterceptor(object);
 }
 
-/**
- * Initializes the [getDispatchProperty] function and [dispatchPropertyName]
- * variable.  Each isolate running in a web page needs a different
- * [dispatchPropertyName], so if a given dispatch property name is in use by
- * some other program loaded into the web page, another name is chosen.
- *
- * The non-CSP version is called like this:
- *
- *     initializeDispatchProperty(
- *         function(x){$.getDispatchProperty=x},
- *         '_f4$Dxv7S',
- *         $.Interceptor);
- *
- * The [getDispatchProperty] function is generated from the chosen name of the
- * property.
- *
- * The CSP version can't create functions via `new Function(...)`, so it is
- * given a fixed set of functions to choose from.  If all the property names in
- * the fixed set of functions are in use, it falls back on the definition of
- * [getDispatchProperty] above.
- *
- *     initializeDispatchPropertyCSP(
- *         function(x){$.getDispatchProperty=x},
- *         [function(a){return a._f4$Dxv7S},
- *          function(a){return a._Q2zpL9iY}],
- *         $.Interceptor);
- */
-void initializeDispatchProperty(
-    setGetDispatchPropertyFn, rootProperty, jsObjectInterceptor) {
-  // We must be extremely careful to avoid any language feature that needs an
-  // interceptor.  Avoid type annotations since they might generate type checks.
-  var objectProto = JS('=Object', 'Object.prototype');
-  for (var i = 0; ; i = JS('int', '# + 1', i)) {
-    var property = rootProperty;
-    if (JS('bool', '# > 0', i)) {
-      property = JS('String', '# + "_" + #', rootProperty, i);
-    }
-    if (JS('bool', 'typeof #[#] === "undefined"', objectProto, property)) {
-      dispatchPropertyName = property;
-      var getter = JS('', 'new Function("a", "return a." + #)', property);
-      JS('void', '#(#)', setGetDispatchPropertyFn, getter);
-      setDispatchProperty(
-          objectProto,
-          makeDispatchRecord(jsObjectInterceptor, objectProto, null, null));
-      return;
-    }
-  }
-}
-
-void initializeDispatchPropertyCSP(
-    setGetDispatchPropertyFn, getterFunctions, jsObjectInterceptor) {
-  // We must be extremely careful to avoid any language feature that needs an
-  // interceptor.  Avoid type annotations since they might generate type checks.
-  var objectProto = JS('=Object', 'Object.prototype');
-  var property = null;
-  var getter = null;
-  var rootProperty = null;
-  for (var i = 0; ; i = JS('int', '# + 1', i)) {
-    if (JS('bool', '# < #.length', i, getterFunctions)) {
-      getter = JS('', '#[#]', getterFunctions, i);
-      var fnText = JS('String', '"" + #', getter);
-      property =
-          JS('String', '#.match(#)[1]', fnText, JS('', r'/\.([^;}]*)/'));
-      rootProperty = property;
-    } else {
-      getter = null;
-      property = JS('String', '# + "_" + #', rootProperty, i);
-    }
-    if (JS('bool', 'typeof #[#] === "undefined"', objectProto, property)) {
-      dispatchPropertyName = property;
-      if (!identical(getter, null)) {
-        JS('void', '#(#)', setGetDispatchPropertyFn, getter);
-      }
-      setDispatchProperty(
-          objectProto,
-          makeDispatchRecord(jsObjectInterceptor, objectProto, null, null));
-      return;
-    }
-  }
-}
 
 /**
  * If [JSInvocationMirror._invokeOn] is being used, this variable
@@ -338,9 +248,9 @@
   dynamic noSuchMethod(Invocation invocation) {
     throw new NoSuchMethodError(
         this,
-        _symbolToString(invocation.memberName),
+        invocation.memberName,
         invocation.positionalArguments,
-        _symbolMapToStringMap(invocation.namedArguments));
+        invocation.namedArguments);
   }
 
   Type get runtimeType => getRuntimeType(this);
diff --git a/sdk/lib/_internal/lib/isolate_helper.dart b/sdk/lib/_internal/lib/isolate_helper.dart
index d59dbb8..9fe12b0 100644
--- a/sdk/lib/_internal/lib/isolate_helper.dart
+++ b/sdk/lib/_internal/lib/isolate_helper.dart
@@ -424,29 +424,49 @@
   /// Associates an ID with a native worker object.
   static final Expando<int> workerIds = new Expando<int>();
 
+  static bool get isD8 {
+    return JS('bool',
+              'typeof version == "function"'
+              ' && typeof os == "object" && "system" in os');
+  }
+
+  static bool get isJsshell {
+    return JS('bool',
+              'typeof version == "function" && typeof system == "function"');
+  }
+
   /**
    * The src url for the script tag that loaded this code. Used to create
    * JavaScript workers.
    */
   static String computeThisScript() {
-    var currentScript = JS('', r'#.$currentScript', JS_CURRENT_ISOLATE());
+    var currentScript = JS('', r'init.currentScript');
     if (currentScript != null) {
       return JS('String', 'String(#.src)', currentScript);
     }
+    if (isD8) return computeThisScriptD8();
+    if (isJsshell) return computeThisScriptJsshell();
+    return null;
+  }
 
-    // TODO(ahe): The following is for supporting command-line engines
-    // such as d8 and jsshell. We should move this code to a helper
-    // library that is only loaded when testing on those engines.
+  static String computeThisScriptJsshell() {
+    return JS('String|Null', 'thisFilename()');
+  }
+
+  static String computeThisScriptD8() {
+    // TODO(ahe): The following is for supporting D8.  We should move this code
+    // to a helper library that is only loaded when testing on D8.
 
     var stack = JS('String|Null', 'new Error().stack');
     if (stack == null) {
       // According to Internet Explorer documentation, the stack
       // property is not set until the exception is thrown. The stack
       // property was not provided until IE10.
-      stack = JS('String',
+      stack = JS('String|Null',
                  '(function() {'
                  'try { throw new Error() } catch(e) { return e.stack }'
                  '})()');
+      if (stack == null) throw new UnsupportedError('No stack trace');
     }
     var pattern, matches;
 
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index 412c9b4..4374eae 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -86,6 +86,11 @@
                                 argumentNames);
 }
 
+void throwInvalidReflectionError(Symbol memberName) {
+  throw new UnsupportedError('invalid reflective use of ${memberName}, '
+      'which is not included by a @MirrorsUsed annotation');
+}
+
 class JSInvocationMirror implements Invocation {
   static const METHOD = 0;
   static const GETTER = 1;
@@ -99,7 +104,7 @@
   final List _arguments;
   final List _namedArgumentNames;
   /** Map from argument name to index in _arguments. */
-  Map<String,dynamic> _namedIndices = null;
+  Map<String, dynamic> _namedIndices = null;
 
   JSInvocationMirror(this._memberName,
                      this._internalName,
@@ -135,7 +140,7 @@
     return makeLiteralListConst(list);
   }
 
-  Map<Symbol,dynamic> get namedArguments {
+  Map<Symbol, dynamic> get namedArguments {
     // TODO: Make maps const (issue 10471)
     if (isAccessor) return <Symbol, dynamic>{};
     int namedArgumentCount = _namedArgumentNames.length;
@@ -170,6 +175,9 @@
     }
     var method = JS('var', '#[#]', receiver, name);
     if (JS('String', 'typeof #', method) == 'function') {
+      if (JS('bool', '#[#] == false', method, JS_GET_NAME("REFLECTABLE"))) {
+        throwInvalidReflectionError(memberName);
+      }
       return new CachedInvocation(method, isIntercepted, interceptor);
     } else {
       // In this case, receiver doesn't implement name.  So we should
@@ -346,10 +354,9 @@
         }
         if (radix < 10 || match[decimalIndex] == null) {
           // We know that the characters must be ASCII as otherwise the
-          // regexp wouldn't have matched. Calling toLowerCase is thus
-          // guaranteed to be a safe operation. If it wasn't ASCII, then
-          // "İ" would become "i", and we would accept it for radices greater
-          // than 18.
+          // regexp wouldn't have matched. Lowercasing by doing `| 0x20` is thus
+          // guaranteed to be a safe operation, since it preserves digits
+          // and lower-cases ASCII letters.
           int maxCharCode;
           if (radix <= 10) {
             // Allow all digits less than the radix. For example 0, 1, 2 for
@@ -357,15 +364,16 @@
             // "0".codeUnitAt(0) + radix - 1;
             maxCharCode = 0x30 + radix - 1;
           } else {
-            // Characters are located after the digits in ASCII. Therefore we
+            // Letters are located after the digits in ASCII. Therefore we
             // only check for the character code. The regexp above made already
             // sure that the string does not contain anything but digits or
-            // characters.
-            // "0".codeUnitAt(0) + radix - 1;
+            // letters.
+            // "a".codeUnitAt(0) + (radix - 10) - 1;
             maxCharCode = 0x61 + radix - 10 - 1;
           }
-          String digitsPart = match[digitsIndex].toLowerCase();
+          String digitsPart = match[digitsIndex];
           for (int i = 0; i < digitsPart.length; i++) {
+            int characterCode = digitsPart.codeUnitAt(0) | 0x20;
             if (digitsPart.codeUnitAt(i) > maxCharCode) {
               return handleError(source);
             }
@@ -1923,7 +1931,9 @@
  * resolved cannot be found.
  */
 void throwNoSuchMethod(obj, name, arguments, expectedArgumentNames) {
-  throw new NoSuchMethodError(obj, name, arguments, const {},
+  Symbol memberName = new _symbol_dev.Symbol.unvalidated(name);
+  throw new NoSuchMethodError(obj, memberName, arguments,
+                              new Map<Symbol, dynamic>(),
                               expectedArgumentNames);
 }
 
diff --git a/sdk/lib/_internal/lib/js_mirrors.dart b/sdk/lib/_internal/lib/js_mirrors.dart
index 52aca10..d8408a6 100644
--- a/sdk/lib/_internal/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/lib/js_mirrors.dart
@@ -25,6 +25,7 @@
     createRuntimeType,
     createUnmangledInvocationMirror,
     getMangledTypeName,
+    throwInvalidReflectionError,
     runtimeTypeToString;
 import 'dart:_interceptors' show
     Interceptor,
@@ -90,7 +91,7 @@
       var fields = data[5];
       bool isRoot = data[6];
       List metadata = (metadataFunction == null)
-          ? null : JS('List', '#()', metadataFunction);
+          ? const [] : JS('List', '#()', metadataFunction);
       var libraries = result.putIfAbsent(name, () => <LibraryMirror>[]);
       libraries.add(
           new JsLibraryMirror(
@@ -103,7 +104,7 @@
 abstract class JsMirror implements Mirror {
   const JsMirror();
 
-  abstract String get _prettyName;
+  String get _prettyName;
 
   String toString() => _prettyName;
 
@@ -243,7 +244,7 @@
     if (mirror == null) mirror = variables[fieldName];
     if (mirror == null) {
       // TODO(ahe): What receiver to use?
-      throw new NoSuchMethodError(this, '${n(fieldName)}=', [arg], null);
+      throw new NoSuchMethodError(this, setterSymbol(fieldName), [arg], null);
     }
     mirror._setField(this, arg);
     return reflect(arg);
@@ -253,24 +254,28 @@
     JsMirror mirror = members[fieldName];
     if (mirror == null) {
       // TODO(ahe): What receiver to use?
-      throw new NoSuchMethodError(this, '${n(fieldName)}', [], null);
+      throw new NoSuchMethodError(this, fieldName, [], null);
     }
     return reflect(mirror._getField(this));
   }
 
   InstanceMirror invoke(Symbol memberName,
                         List positionalArguments,
-                        [Map<Symbol,dynamic> namedArguments]) {
+                        [Map<Symbol, dynamic> namedArguments]) {
     if (namedArguments != null && !namedArguments.isEmpty) {
       throw new UnsupportedError('Named arguments are not implemented.');
     }
     JsDeclarationMirror mirror = members[memberName];
     if (mirror == null) {
-      // TODO(ahe): Pass namedArguments when NoSuchMethodError has been
-      // fixed to use Symbol.
       // TODO(ahe): What receiver to use?
       throw new NoSuchMethodError(
-          this, '${n(memberName)}', positionalArguments, null);
+          this, memberName, positionalArguments, namedArguments);
+    }
+    if (mirror is JsMethodMirror) {
+      JsMethodMirror method = mirror;
+      if (!method.canInvokeReflectively()) {
+        throwInvalidReflectionError(memberName);
+      }
     }
     return reflect(mirror._invoke(positionalArguments, namedArguments));
   }
@@ -287,14 +292,19 @@
 
   List<JsMethodMirror> get _functionMirrors {
     if (_cachedFunctionMirrors != null) return _cachedFunctionMirrors;
-    var result = new List<JsMethodMirror>(_functions.length);
+    var result = new List<JsMethodMirror>();
     for (int i = 0; i < _functions.length; i++) {
       String name = _functions[i];
       // TODO(ahe): Create accessor for accessing $.  It is also
       // used in js_helper.
       var jsFunction = JS('', '#[#]', JS_CURRENT_ISOLATE(), name);
       String unmangledName = mangledGlobalNames[name];
-      if (unmangledName == null) unmangledName = name;
+      if (unmangledName == null) {
+        // If there is no unmangledName, [jsFunction] is either a synthetic
+        // implementation detail, or something that is excluded
+        // by @MirrorsUsed.
+        continue;
+      }
       bool isConstructor = unmangledName.startsWith('new ');
       bool isStatic = !isConstructor; // Top-level functions are static, but
                                       // constructors are not.
@@ -304,7 +314,7 @@
       JsMethodMirror mirror =
           new JsMethodMirror.fromUnmangledName(
               unmangledName, jsFunction, isStatic, isConstructor);
-      result[i] = mirror;
+      result.add(mirror);
       mirror._owner = this;
     }
     return _cachedFunctionMirrors = result;
@@ -385,6 +395,8 @@
   return new _symbol_dev.Symbol.unvalidated(name);
 }
 
+Symbol setterSymbol(Symbol symbol) => s("${n(symbol)}=");
+
 final JsMirrorSystem currentJsMirrorSystem = new JsMirrorSystem();
 
 InstanceMirror reflect(Object reflectee) {
@@ -507,20 +519,19 @@
       Symbol memberName,
       List positionalArguments,
       [Map<Symbol,dynamic> namedArguments]) {
-    // TODO(ahe): Pass namedArguments when NoSuchMethodError has
-    // been fixed to use Symbol.
     // TODO(ahe): What receiver to use?
-    throw new NoSuchMethodError(this, n(memberName), positionalArguments, null);
+    throw new NoSuchMethodError(this, memberName,
+                                positionalArguments, namedArguments);
   }
 
   InstanceMirror getField(Symbol fieldName) {
     // TODO(ahe): What receiver to use?
-    throw new NoSuchMethodError(this, n(fieldName), null, null);
+    throw new NoSuchMethodError(this, fieldName, null, null);
   }
 
   InstanceMirror setField(Symbol fieldName, Object arg) {
     // TODO(ahe): What receiver to use?
-    throw new NoSuchMethodError(this, '${n(fieldName)}=', [arg], null);
+    throw new NoSuchMethodError(this, setterSymbol(fieldName), [arg], null);
   }
 
   List<ClassMirror> get superinterfaces => [mixin];
@@ -748,6 +759,7 @@
     int length = keys.length;
     for (int i = 0; i < length; i++) {
       String mangledName = keys[i];
+      if (mangledName == '') continue; // Skip static field descriptor.
       String unmangledName = mangledName;
       // TODO(ahe): Create accessor for accessing $.  It is also
       // used in js_helper.
@@ -889,7 +901,7 @@
       return reflect(arg);
     }
     // TODO(ahe): What receiver to use?
-    throw new NoSuchMethodError(this, '${n(fieldName)}=', [arg], null);
+    throw new NoSuchMethodError(this, setterSymbol(fieldName), [arg], null);
   }
 
   InstanceMirror getField(Symbol fieldName) {
@@ -907,7 +919,7 @@
       }
     }
     // TODO(ahe): What receiver to use?
-    throw new NoSuchMethodError(this, n(fieldName), null, null);
+    throw new NoSuchMethodError(this, fieldName, null, null);
   }
 
   InstanceMirror newInstance(Symbol constructorName,
@@ -922,11 +934,9 @@
       mirror = constructors.values.firstWhere(
           (m) => m.constructorName == constructorName,
           orElse: () {
-            // TODO(ahe): Pass namedArguments when NoSuchMethodError has been
-            // fixed to use Symbol.
             // TODO(ahe): What receiver to use?
             throw new NoSuchMethodError(
-                owner, n(constructorName), positionalArguments, null);
+                owner, constructorName, positionalArguments, namedArguments);
           });
       JsCache.update(_jsConstructorCache, n(constructorName), mirror);
     }
@@ -1004,11 +1014,12 @@
     }
     JsMethodMirror mirror = methods[memberName];
     if (mirror == null || !mirror.isStatic) {
-      // TODO(ahe): Pass namedArguments when NoSuchMethodError has
-      // been fixed to use Symbol.
       // TODO(ahe): What receiver to use?
       throw new NoSuchMethodError(
-          this, n(memberName), positionalArguments, null);
+          this, memberName, positionalArguments, namedArguments);
+    }
+    if (!mirror.canInvokeReflectively()) {
+      throwInvalidReflectionError(memberName);
     }
     return reflect(mirror._invoke(positionalArguments, namedArguments));
   }
@@ -1039,6 +1050,8 @@
 }
 
 class JsVariableMirror extends JsDeclarationMirror implements VariableMirror {
+  static final int REFLECTION_MARKER = 45;
+
   // TODO(ahe): The values in these fields are virtually untested.
   final String _jsName;
   final bool isFinal;
@@ -1061,6 +1074,16 @@
                                 bool isStatic) {
     int length = descriptor.length;
     var code = fieldCode(descriptor.codeUnitAt(length - 1));
+    if (code == REFLECTION_MARKER) {
+      // If the field descriptor has a reflection marker, remove it by
+      // changing length and getting the real getter/setter code.  The
+      // descriptor will be truncated below.
+      length--;
+      code = fieldCode(descriptor.codeUnitAt(length - 1));
+    } else {
+      // The field is not available for reflection.
+      return null;
+    }
     bool isFinal = false;
     if (code == 0) return null; // Inherited field.
     bool hasGetter = (code & 3) != 0;
@@ -1072,7 +1095,7 @@
     int divider = descriptor.indexOf(':');
     if (divider > 0) {
       accessorName = accessorName.substring(0, divider);
-      jsName = accessorName.substring(divider + 1);
+      jsName = descriptor.substring(divider + 1);
     }
     var unmangledName;
     if (isStatic) {
@@ -1113,6 +1136,7 @@
   }
 
   static int fieldCode(int code) {
+    if (code == REFLECTION_MARKER) return code;
     if (code >= 60 && code <= 64) return code - 59;
     if (code >= 123 && code <= 126) return code - 117;
     if (code >= 37 && code <= 43) return code - 27;
@@ -1123,7 +1147,7 @@
 
   void _setField(JsMirror receiver, Object arg) {
     if (isFinal) {
-      throw new NoSuchMethodError(this, '${n(simpleName)}=', [arg], null);
+      throw new NoSuchMethodError(this, setterSymbol(simpleName), [arg], null);
     }
     receiver._storeField(_jsName, arg);
   }
@@ -1248,6 +1272,10 @@
     return _parameters;
   }
 
+  bool canInvokeReflectively() {
+    return JS('bool', '#[#] != false', _jsFunction, JS_GET_NAME("REFLECTABLE"));
+  }
+
   DeclarationMirror get owner => _owner;
 
   TypeMirror get returnType {
@@ -1298,11 +1326,9 @@
       throw new RuntimeError('Cannot invoke instance method without receiver.');
     }
     if (_parameterCount != positionalArguments.length || _jsFunction == null) {
-      // TODO(ahe): Pass namedArguments when NoSuchMethodError has
-      // been fixed to use Symbol.
       // TODO(ahe): What receiver to use?
       throw new NoSuchMethodError(
-          owner, n(simpleName), positionalArguments, null);
+          owner, simpleName, positionalArguments, namedArguments);
     }
     return JS('', r'#.apply(#, #)', _jsFunction, JS_CURRENT_ISOLATE(),
               new List.from(positionalArguments));
@@ -1321,7 +1347,7 @@
     if (isSetter) {
       return _invoke([arg], null);
     } else {
-      throw new NoSuchMethodError(this, '${n(simpleName)}=', [], null);
+      throw new NoSuchMethodError(this, setterSymbol(simpleName), [], null);
     }
   }
 
diff --git a/sdk/lib/_internal/lib/regexp_helper.dart b/sdk/lib/_internal/lib/regexp_helper.dart
index 94b015f..bec8253 100644
--- a/sdk/lib/_internal/lib/regexp_helper.dart
+++ b/sdk/lib/_internal/lib/regexp_helper.dart
@@ -150,7 +150,9 @@
     assert(JS("var", "#.index", _match) is int);
   }
 
-  String get str => JS("String", "#.input", _match);
+  // TODO(12843): Remove when grace period is over.
+  String get str => input;
+  String get input => JS("String", "#.input", _match);
   int get start => JS("int", "#.index", _match);
   int get end => start + _match[0].length;
 
diff --git a/sdk/lib/_internal/lib/string_helper.dart b/sdk/lib/_internal/lib/string_helper.dart
index ba03364..fa046d5 100644
--- a/sdk/lib/_internal/lib/string_helper.dart
+++ b/sdk/lib/_internal/lib/string_helper.dart
@@ -6,7 +6,7 @@
 
 class StringMatch implements Match {
   const StringMatch(int this.start,
-                    String this.str,
+                    String this.input,
                     String this.pattern);
 
   int get end => start + pattern.length;
@@ -28,8 +28,11 @@
     return result;
   }
 
+  // TODO(12843): Remove when grace period is over.
+  String get str => input;
+
   final int start;
-  final String str;
+  final String input;
   final String pattern;
 }
 
diff --git a/sdk/lib/_internal/pub/lib/src/command/cache.dart b/sdk/lib/_internal/pub/lib/src/command/cache.dart
index 24c5124..122ee1c 100644
--- a/sdk/lib/_internal/pub/lib/src/command/cache.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/cache.dart
@@ -5,8 +5,8 @@
 library pub.command.cache;
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 
 import '../command.dart';
 import '../exit_codes.dart' as exit_codes;
@@ -43,7 +43,7 @@
 
     // TODO(keertip): Add support for non-JSON format
     // and check for --format flag
-    log.message(json.stringify({'packages': packagesObj}));
+    log.message(JSON.encode({'packages': packagesObj}));
   }
 }
 
diff --git a/sdk/lib/_internal/pub/lib/src/command/lish.dart b/sdk/lib/_internal/pub/lib/src/command/lish.dart
index 4a7b2ac..fb65fc3 100644
--- a/sdk/lib/_internal/pub/lib/src/command/lish.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/lish.dart
@@ -106,7 +106,7 @@
       // Show the package contents so the user can verify they look OK.
       var package = entrypoint.root;
       log.message(
-          'Publishing "${package.name}" ${package.version}:\n'
+          'Publishing "${package.name}" ${package.version} to $server:\n'
           '${generateTree(files, baseDir: entrypoint.root.dir)}');
 
       return createTarGz(files, baseDir: entrypoint.root.dir);
diff --git a/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart b/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
index fc05630..f16ad65 100644
--- a/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
@@ -5,8 +5,8 @@
 library pub.command.list_package_dirs;
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 
 import 'package:path/path.dart' as path;
 
@@ -28,7 +28,7 @@
 
   Future onRun() {
     if (!entrypoint.lockFileExists) {
-      log.error(json.stringify(
+      log.error(JSON.encode(
           'Package "myapp" has no lockfile. Please run "pub install" first.'));
       exit(exit_codes.NO_INPUT);
     }
@@ -55,7 +55,7 @@
     output["input_files"] = [entrypoint.lockFilePath];
 
     return Future.wait(futures).then((_) {
-      log.message(json.stringify(output));
+      log.message(JSON.encode(output));
     });
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/http.dart b/sdk/lib/_internal/pub/lib/src/http.dart
index a54f02f..9fc338e 100644
--- a/sdk/lib/_internal/pub/lib/src/http.dart
+++ b/sdk/lib/_internal/pub/lib/src/http.dart
@@ -6,8 +6,8 @@
 library pub.http;
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 
 import 'package:http/http.dart' as http;
 
@@ -203,7 +203,7 @@
 Map parseJsonResponse(http.Response response) {
   var value;
   try {
-    value = json.parse(response.body);
+    value = JSON.decode(response.body);
   } on FormatException catch (e) {
     invalidServerResponse(response);
   }
diff --git a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
index 2dc215e..eb2fc63 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
@@ -5,7 +5,7 @@
 library pub.solver.version_solver;
 
 import 'dart:async';
-import 'dart:json' as json;
+import "dart:convert";
 
 import '../lock_file.dart';
 import '../log.dart' as log;
@@ -293,6 +293,6 @@
 
   String _describeDependency(PackageDep dep) {
     // TODO(nweiz): Dump descriptions to YAML when that's supported.
-    return "depends on it with description ${json.stringify(dep.description)}";
+    return "depends on it with description ${JSON.encode(dep.description)}";
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/source/hosted.dart b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
index 7a0409f..b2c1647 100644
--- a/sdk/lib/_internal/pub/lib/src/source/hosted.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
@@ -6,7 +6,7 @@
 
 import 'dart:async';
 import 'dart:io' as io;
-import 'dart:json' as json;
+import "dart:convert";
 
 import 'package:http/http.dart' as http;
 import 'package:path/path.dart' as path;
@@ -46,7 +46,7 @@
 
     log.io("Get versions from $url.");
     return httpClient.read(url, headers: PUB_API_HEADERS).then((body) {
-      var doc = json.parse(body);
+      var doc = JSON.decode(body);
       return doc['versions']
           .map((version) => new Version.parse(version['version']))
           .toList();
@@ -65,7 +65,7 @@
 
     log.io("Describe package at $url.");
     return httpClient.read(url, headers: PUB_API_HEADERS).then((version) {
-      version = json.parse(version);
+      version = JSON.decode(version);
 
       // TODO(rnystrom): After this is pulled down, we could place it in
       // a secondary cache of just pubspecs. This would let us have a
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index d495516..ed2e5e3 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -7,7 +7,7 @@
 
 import 'dart:async';
 import 'dart:io';
-import 'dart:json' as json;
+import "dart:convert";
 import 'dart:mirrors';
 
 import "package:crypto/crypto.dart";
@@ -494,7 +494,7 @@
 
         var keyString = key;
         if (key is! String || !_unquotableYamlString.hasMatch(key)) {
-          keyString = json.stringify(key);
+          keyString = JSON.encode(key);
         }
 
         buffer.write('$indent$keyString:');
@@ -510,7 +510,7 @@
 
     // Don't quote plain strings if not needed.
     if (data is! String || !_unquotableYamlString.hasMatch(data)) {
-      string = json.stringify(data);
+      string = JSON.encode(data);
     }
 
     if (isMapValue) {
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index 276a0d5..1e72e02 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -4,19 +4,26 @@
 
 test/serve/missing_file_test: Pass, Fail # Issue 12570
 test/oauth2/with_an_expired_credentials_refreshes_and_saves_test: Pass, Fail # Issue 12581
-test/hosted/remove_removed_dependency_test: Pass, Fail # Issue 12582
-test/hosted/remove_removed_transitive_dependency_test: Pass, Fail # Issue 12582
-test/install/hosted/cached_pubspec_test: Pass, Fail # Issue 12678
-test/install/hosted/do_not_update_on_removed_constraints_test: Pass, Fail # Issue 12680
-test/install/hosted/install_test: Pass, Fail # Issue 12682
-test/install/hosted/install_transitive_test: Pass, Fail # Issue 12683
-test/install/hosted/repair_cache_test: Pass, Fail # Issue 12684
-test/serve/serve_from_dependency_asset_test: Pass, Fail # Issue 12686
+
+# Issue 12837 is a networking issue on the pub-mac buildbot.
+[ $runtime == vm && $system == macos ]
+test/hosted/remove_removed_dependency_test: Pass, Fail # Issue 12837
+test/hosted/remove_removed_transitive_dependency_test: Pass, Fail # Issue 12837
+test/install/hosted/cached_pubspec_test: Pass, Fail # Issue 12837
+test/install/hosted/do_not_update_on_removed_constraints_test: Pass, Fail # Issue 12837
+test/install/hosted/install_test: Pass, Fail # Issue 12837
+test/install/hosted/install_transitive_test: Pass, Fail # Issue 12837
+test/install/hosted/version_negotiation_test: Pass, Fail # Issue 12837
+test/install/hosted/repair_cache_test: Pass, Fail # Issue 12837
+test/serve/serve_from_dependency_asset_test: Pass, Fail # Issue 12837
 test/install/hosted/stay_locked_if_new_is_satisfied_test: Pass, Fail # Issue 12837
 test/install/hosted/unlock_if_incompatible_test: Pass, Fail # Issue 12837
 test/install/hosted/unlock_if_new_is_unsatisfied_test: Pass, Fail # Issue 12837
 test/install/hosted/stay_locked_test: Pass, Fail # Issue 12837
 
+[ $runtime == vm && $system == windows ]
+test/update/git/update_locked_test: Pass, Fail # Issue 12983
+
 # Pub only runs on the VM, so just rule out all compilers.
 [ $compiler == dart2js || $compiler == dart2dart ]
 *: Skip
diff --git a/sdk/lib/_internal/pub/test/deploy/copies_browser_js_next_to_entrypoints_test.dart b/sdk/lib/_internal/pub/test/deploy/copies_browser_js_next_to_entrypoints_test.dart
index 291284e..5076a7d 100644
--- a/sdk/lib/_internal/pub/test/deploy/copies_browser_js_next_to_entrypoints_test.dart
+++ b/sdk/lib/_internal/pub/test/deploy/copies_browser_js_next_to_entrypoints_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:path/path.dart' as path;
 import 'package:scheduled_test/scheduled_test.dart';
@@ -21,12 +21,12 @@
     serve([
       d.dir('api', [
         d.dir('packages', [
-          d.file('browser', json.stringify({
+          d.file('browser', JSON.encode({
             'versions': [packageVersionApiMap(packageMap('browser', '1.0.0'))]
           })),
           d.dir('browser', [
             d.dir('versions', [
-              d.file('1.0.0', json.stringify(
+              d.file('1.0.0', JSON.encode(
                   packageVersionApiMap(
                       packageMap('browser', '1.0.0'),
                       full: true)))
diff --git a/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart b/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
index f1460b5..1ef75ce 100644
--- a/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -25,7 +25,7 @@
     handleUpload(server);
 
     server.handle('GET', '/create', (request) {
-      request.response.write(json.stringify({
+      request.response.write(JSON.encode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
       request.response.close();
diff --git a/sdk/lib/_internal/pub/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart b/sdk/lib/_internal/pub/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
index 9bf4aa3..40b2aee 100644
--- a/sdk/lib/_internal/pub/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -24,7 +24,7 @@
     handleUpload(server);
 
     server.handle('GET', '/create', (request) {
-      request.response.write(json.stringify({
+      request.response.write(JSON.encode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
       request.response.close();
diff --git a/sdk/lib/_internal/pub/test/lish/force_publishes_if_there_are_warnings_test.dart b/sdk/lib/_internal/pub/test/lish/force_publishes_if_there_are_warnings_test.dart
index c4d3616..f89e6c2 100644
--- a/sdk/lib/_internal/pub/test/lish/force_publishes_if_there_are_warnings_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/force_publishes_if_there_are_warnings_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -28,7 +28,7 @@
     handleUpload(server);
 
     server.handle('GET', '/create', (request) {
-      request.response.write(json.stringify({
+      request.response.write(JSON.encode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
       request.response.close();
diff --git a/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_error_test.dart b/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_error_test.dart
index bbcc4d3..0730bcd 100644
--- a/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_error_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -27,12 +27,12 @@
     var body = {'error': 'Your package was too boring.'};
     server.handle('GET', '/create', (request) {
       request.response.statusCode = 400;
-      request.response.write(json.stringify(body));
+      request.response.write(JSON.encode(body));
       request.response.close();
     });
 
     expect(pub.nextErrLine(), completion(equals('Invalid server response:')));
-    expect(pub.nextErrLine(), completion(equals(json.stringify(body))));
+    expect(pub.nextErrLine(), completion(equals(JSON.encode(body))));
     pub.shouldExit(1);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_success_test.dart b/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_success_test.dart
index 635e11d..f6ce3b7 100644
--- a/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_success_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_success_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -26,12 +26,12 @@
 
     var body = {'success': 'Your package was awesome.'};
     server.handle('GET', '/create', (request) {
-      request.response.write(json.stringify(body));
+      request.response.write(JSON.encode(body));
       request.response.close();
     });
 
     expect(pub.nextErrLine(), completion(equals('Invalid server response:')));
-    expect(pub.nextErrLine(), completion(equals(json.stringify(body))));
+    expect(pub.nextErrLine(), completion(equals(JSON.encode(body))));
     pub.shouldExit(1);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/lish/package_creation_provides_an_error_test.dart b/sdk/lib/_internal/pub/test/lish/package_creation_provides_an_error_test.dart
index 2298e70..a1c134d 100644
--- a/sdk/lib/_internal/pub/test/lish/package_creation_provides_an_error_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/package_creation_provides_an_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -26,7 +26,7 @@
 
     server.handle('GET', '/create', (request) {
       request.response.statusCode = 400;
-      request.response.write(json.stringify({
+      request.response.write(JSON.encode({
         'error': {'message': 'Your package was too boring.'}
       }));
       request.response.close();
diff --git a/sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_continues_test.dart b/sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_continues_test.dart
index 4883fe5..01916ef 100644
--- a/sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_continues_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_continues_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -28,7 +28,7 @@
     handleUpload(server);
 
     server.handle('GET', '/create', (request) {
-      request.response.write(json.stringify({
+      request.response.write(JSON.encode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
       request.response.close();
diff --git a/sdk/lib/_internal/pub/test/lish/upload_form_fields_has_a_non_string_value_test.dart b/sdk/lib/_internal/pub/test/lish/upload_form_fields_has_a_non_string_value_test.dart
index e1143d6..9e24715 100644
--- a/sdk/lib/_internal/pub/test/lish/upload_form_fields_has_a_non_string_value_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/upload_form_fields_has_a_non_string_value_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -28,7 +28,7 @@
     };
     handleUploadForm(server, body);
     expect(pub.nextErrLine(), completion(equals('Invalid server response:')));
-    expect(pub.nextErrLine(), completion(equals(json.stringify(body))));
+    expect(pub.nextErrLine(), completion(equals(JSON.encode(body))));
     pub.shouldExit(1);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/lish/upload_form_fields_is_not_a_map_test.dart b/sdk/lib/_internal/pub/test/lish/upload_form_fields_is_not_a_map_test.dart
index 09d0745..2f75460 100644
--- a/sdk/lib/_internal/pub/test/lish/upload_form_fields_is_not_a_map_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/upload_form_fields_is_not_a_map_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -25,7 +25,7 @@
     var body = {'url': 'http://example.com/upload', 'fields': 12};
     handleUploadForm(server, body);
     expect(pub.nextErrLine(), completion(equals('Invalid server response:')));
-    expect(pub.nextErrLine(), completion(equals(json.stringify(body))));
+    expect(pub.nextErrLine(), completion(equals(JSON.encode(body))));
     pub.shouldExit(1);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/lish/upload_form_is_missing_fields_test.dart b/sdk/lib/_internal/pub/test/lish/upload_form_is_missing_fields_test.dart
index 8883a87..dd4fd51 100644
--- a/sdk/lib/_internal/pub/test/lish/upload_form_is_missing_fields_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/upload_form_is_missing_fields_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -25,7 +25,7 @@
     var body = {'url': 'http://example.com/upload'};
     handleUploadForm(server, body);
     expect(pub.nextErrLine(), completion(equals('Invalid server response:')));
-    expect(pub.nextErrLine(), completion(equals(json.stringify(body))));
+    expect(pub.nextErrLine(), completion(equals(JSON.encode(body))));
     pub.shouldExit(1);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/lish/upload_form_is_missing_url_test.dart b/sdk/lib/_internal/pub/test/lish/upload_form_is_missing_url_test.dart
index aaad952..0f27503 100644
--- a/sdk/lib/_internal/pub/test/lish/upload_form_is_missing_url_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/upload_form_is_missing_url_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -31,7 +31,7 @@
 
     handleUploadForm(server, body);
     expect(pub.nextErrLine(), completion(equals('Invalid server response:')));
-    expect(pub.nextErrLine(), completion(equals(json.stringify(body))));
+    expect(pub.nextErrLine(), completion(equals(JSON.encode(body))));
     pub.shouldExit(1);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart b/sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart
index a02193c..2a415e4 100644
--- a/sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -23,7 +23,7 @@
 
     server.handle('GET', '/api/packages/versions/new', (request) {
       request.response.statusCode = 400;
-      request.response.write(json.stringify({
+      request.response.write(JSON.encode({
         'error': {'message': 'your request sucked'}
       }));
       request.response.close();
diff --git a/sdk/lib/_internal/pub/test/lish/upload_form_url_is_not_a_string_test.dart b/sdk/lib/_internal/pub/test/lish/upload_form_url_is_not_a_string_test.dart
index 521d612..7f0164a 100644
--- a/sdk/lib/_internal/pub/test/lish/upload_form_url_is_not_a_string_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/upload_form_url_is_not_a_string_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -32,7 +32,7 @@
 
     handleUploadForm(server, body);
     expect(pub.nextErrLine(), completion(equals('Invalid server response:')));
-    expect(pub.nextErrLine(), completion(equals(json.stringify(body))));
+    expect(pub.nextErrLine(), completion(equals(JSON.encode(body))));
     pub.shouldExit(1);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/lish/utils.dart b/sdk/lib/_internal/pub/test/lish/utils.dart
index 70020cf..8279281 100644
--- a/sdk/lib/_internal/pub/test/lish/utils.dart
+++ b/sdk/lib/_internal/pub/test/lish/utils.dart
@@ -4,8 +4,8 @@
 
 library lish.utils;
 
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -30,7 +30,7 @@
 
       request.response.headers.contentType =
           new ContentType("application", "json");
-      request.response.write(json.stringify(body));
+      request.response.write(JSON.encode(body));
       request.response.close();
     });
   });
diff --git a/sdk/lib/_internal/pub/test/oauth2/utils.dart b/sdk/lib/_internal/pub/test/oauth2/utils.dart
index a67e2bc..019628b 100644
--- a/sdk/lib/_internal/pub/test/oauth2/utils.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/utils.dart
@@ -4,8 +4,8 @@
 
 library oauth2.utils;
 
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 
 import 'package:http/http.dart' as http;
 import 'package:scheduled_test/scheduled_process.dart';
@@ -45,7 +45,7 @@
 
       request.response.headers.contentType =
           new ContentType("application", "json");
-      request.response.write(json.stringify({
+      request.response.write(JSON.encode({
         "access_token": accessToken,
         "token_type": "bearer"
       }));
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
index 08e1396..8c78a34 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -36,7 +36,7 @@
         response.statusCode = 400;
         response.reasonPhrase = 'Bad request';
         response.headers.contentType = new ContentType("application", "json");
-        response.write(json.stringify({"error": "invalid_request"}));
+        response.write(JSON.encode({"error": "invalid_request"}));
         response.close();
       });
     });
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
index 2155a89..ac6fc55 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -35,7 +35,7 @@
 
         request.response.headers.contentType =
             new ContentType("application", "json");
-        request.response.write(json.stringify({
+        request.response.write(JSON.encode({
           "access_token": "new access token",
           "token_type": "bearer"
         }));
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
index bbe3c3a..67e134b 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -27,7 +27,7 @@
       response.statusCode = 401;
       response.headers.set('www-authenticate', 'Bearer error="invalid_token",'
           ' error_description="your token sucks"');
-      response.write(json.stringify({
+      response.write(JSON.encode({
         'error': {'message': 'your token sucks'}
       }));
       response.close();
diff --git a/sdk/lib/_internal/pub/test/pub_uploader_test.dart b/sdk/lib/_internal/pub/test/pub_uploader_test.dart
index b52a5e3..9c8b822 100644
--- a/sdk/lib/_internal/pub/test/pub_uploader_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_uploader_test.dart
@@ -4,8 +4,8 @@
 
 library pub_uploader_test;
 
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 
 import 'package:scheduled_test/scheduled_process.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -65,7 +65,7 @@
 
         request.response.headers.contentType =
             new ContentType("application", "json");
-        request.response.write(json.stringify({
+        request.response.write(JSON.encode({
           'success': {'message': 'Good job!'}
         }));
         request.response.close();
@@ -84,7 +84,7 @@
     server.handle('DELETE', '/api/packages/pkg/uploaders/email', (request) {
       request.response.headers.contentType =
           new ContentType("application", "json");
-      request.response.write(json.stringify({
+      request.response.write(JSON.encode({
         'success': {'message': 'Good job!'}
       }));
       request.response.close();
@@ -104,7 +104,7 @@
     server.handle('POST', '/api/packages/test_pkg/uploaders', (request) {
       request.response.headers.contentType =
           new ContentType("application", "json");
-      request.response.write(json.stringify({
+      request.response.write(JSON.encode({
         'success': {'message': 'Good job!'}
       }));
       request.response.close();
@@ -123,7 +123,7 @@
       request.response.statusCode = 400;
       request.response.headers.contentType =
           new ContentType("application", "json");
-      request.response.write(json.stringify({
+      request.response.write(JSON.encode({
         'error': {'message': 'Bad job!'}
       }));
       request.response.close();
@@ -143,7 +143,7 @@
       request.response.statusCode = 400;
       request.response.headers.contentType =
           new ContentType("application", "json");
-      request.response.write(json.stringify({
+      request.response.write(JSON.encode({
         'error': {'message': 'Bad job!'}
       }));
       request.response.close();
diff --git a/sdk/lib/_internal/pub/test/serve/installs_first_if_dev_dependency_changed_test.dart b/sdk/lib/_internal/pub/test/serve/installs_first_if_dev_dependency_changed_test.dart
index fb5591e..553d924 100644
--- a/sdk/lib/_internal/pub/test/serve/installs_first_if_dev_dependency_changed_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/installs_first_if_dev_dependency_changed_test.dart
@@ -4,7 +4,7 @@
 
 library pub_tests;
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -26,7 +26,7 @@
           "foo": {"path": "../foo"}
         }
       }),
-      d.file("pubspec.lock", json.stringify({
+      d.file("pubspec.lock", JSON.encode({
         'packages': {}
       }))
     ]).create();
diff --git a/sdk/lib/_internal/pub/test/serve/installs_first_if_source_changed_test.dart b/sdk/lib/_internal/pub/test/serve/installs_first_if_source_changed_test.dart
index d7f5c92..65d177e 100644
--- a/sdk/lib/_internal/pub/test/serve/installs_first_if_source_changed_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/installs_first_if_source_changed_test.dart
@@ -4,7 +4,7 @@
 
 library pub_tests;
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -25,7 +25,7 @@
         "foo": {"path": "../foo"}
       }),
       // A lock file with the hosted source.
-      d.file("pubspec.lock", json.stringify({
+      d.file("pubspec.lock", JSON.encode({
         'packages': {
           'foo': {
             'version': '0.0.0',
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index bf51392..7b63184 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -11,7 +11,6 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 import 'dart:math';
 
 import 'package:http/testing.dart';
@@ -198,14 +197,14 @@
       _servedPackageDir.contents.clear();
       for (var name in _servedPackages.keys) {
         _servedApiPackageDir.contents.addAll([
-          d.file('$name', json.stringify({
+          d.file('$name', JSON.encode({
             'name': name,
             'uploaders': ['nweiz@google.com'],
             'versions': _servedPackages[name].map(packageVersionApiMap).toList()
           })),
           d.dir(name, [
             d.dir('versions', _servedPackages[name].map((pubspec) {
-              return d.file(pubspec['version'], json.stringify(
+              return d.file(pubspec['version'], JSON.encode(
                   packageVersionApiMap(pubspec, full: true)));
             }))
           ])
@@ -215,7 +214,7 @@
           d.dir('versions', _servedPackages[name].map((pubspec) {
             var version = pubspec['version'];
             return d.tar('$version.tar.gz', [
-              d.file('pubspec.yaml', json.stringify(pubspec)),
+              d.file('pubspec.yaml', JSON.encode(pubspec)),
               d.libDir(name, '$name $version')
             ]);
           }))
@@ -226,7 +225,7 @@
 }
 
 /// Converts [value] into a YAML string.
-String yaml(value) => json.stringify(value);
+String yaml(value) => JSON.encode(value);
 
 /// The full path to the created sandbox directory for an integration test.
 String get sandboxDir => _sandboxDir;
@@ -425,7 +424,8 @@
 void confirmPublish(ScheduledProcess pub) {
   // TODO(rnystrom): This is overly specific and inflexible regarding different
   // test packages. Should validate this a little more loosely.
-  expect(pub.nextLine(), completion(equals('Publishing "test_pkg" 1.0.0:')));
+  expect(pub.nextLine(), completion(startsWith(
+      'Publishing "test_pkg" 1.0.0 to ')));
   expect(pub.nextLine(), completion(equals("|-- LICENSE")));
   expect(pub.nextLine(), completion(equals("|-- lib")));
   expect(pub.nextLine(), completion(equals("|   '-- test_pkg.dart")));
@@ -741,7 +741,7 @@
                          expected, String actualText) {
   var actual;
   try {
-    actual = json.parse(actualText);
+    actual = JSON.decode(actualText);
   } on FormatException catch(error) {
     failures.add('Expected $pipe JSON:');
     failures.add(expected);
diff --git a/sdk/lib/_internal/pub/test/unknown_source_test.dart b/sdk/lib/_internal/pub/test/unknown_source_test.dart
index cdcc1d7..dab714c 100644
--- a/sdk/lib/_internal/pub/test/unknown_source_test.dart
+++ b/sdk/lib/_internal/pub/test/unknown_source_test.dart
@@ -4,7 +4,7 @@
 
 library pub_tests;
 
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'descriptor.dart' as d;
 import 'test_pub.dart';
@@ -48,7 +48,7 @@
 
       // But lock it to a bad one.
       d.dir(appPath, [
-        d.file("pubspec.lock", json.stringify({
+        d.file("pubspec.lock", JSON.encode({
           'packages': {
             'foo': {
               'version': '0.0.0',
diff --git a/sdk/lib/_internal/pub/test/update/git/do_not_update_if_unneeded_test.dart b/sdk/lib/_internal/pub/test/update/git/do_not_update_if_unneeded_test.dart
index 82361ce..54c1a71 100644
--- a/sdk/lib/_internal/pub/test/update/git/do_not_update_if_unneeded_test.dart
+++ b/sdk/lib/_internal/pub/test/update/git/do_not_update_if_unneeded_test.dart
@@ -6,9 +6,11 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
+import 'package:unittest/unittest.dart' as unittest;
 
 main() {
   initConfig();
+  unittest.unittestConfiguration.timeout = const Duration(seconds: 60);
   integration("doesn't update one locked Git package's dependencies if it's "
       "not necessary", () {
     ensureGit();
diff --git a/sdk/lib/_internal/pub/test/update/git/update_one_locked_test.dart b/sdk/lib/_internal/pub/test/update/git/update_one_locked_test.dart
index 42b9239..5b5c837 100644
--- a/sdk/lib/_internal/pub/test/update/git/update_one_locked_test.dart
+++ b/sdk/lib/_internal/pub/test/update/git/update_one_locked_test.dart
@@ -6,9 +6,11 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
+import 'package:unittest/unittest.dart' as unittest;
 
 main() {
   initConfig();
+  unittest.unittestConfiguration.timeout = const Duration(seconds: 60);
   integration("updates one locked Git package but no others", () {
     ensureGit();
 
diff --git a/sdk/lib/_internal/pub/test/validator/dependency_test.dart b/sdk/lib/_internal/pub/test/validator/dependency_test.dart
index ba29373..53dfff9 100644
--- a/sdk/lib/_internal/pub/test/validator/dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/validator/dependency_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:json' as json;
+import 'dart:convert';
 
 import 'package:http/http.dart' as http;
 import 'package:http/testing.dart';
@@ -40,7 +40,7 @@
     if (hostedVersions == null) {
       return new Future.value(new http.Response("not found", 404));
     } else {
-      return new Future.value(new http.Response(json.stringify({
+      return new Future.value(new http.Response(JSON.encode({
         "name": "foo",
         "uploaders": ["nweiz@google.com"],
         "versions": hostedVersions.map((version) =>
@@ -170,7 +170,7 @@
             d.libPubspec("test_pkg", "1.0.0", deps: {
               "foo": "any"
             }),
-            d.file("pubspec.lock", json.stringify({
+            d.file("pubspec.lock", JSON.encode({
               'packages': {
                 'bar': {
                   'version': '1.2.3',
@@ -196,7 +196,7 @@
             d.libPubspec("test_pkg", "1.0.0", deps: {
               "foo": "any"
             }),
-            d.file("pubspec.lock", json.stringify({
+            d.file("pubspec.lock", JSON.encode({
               'packages': {
                 'foo': {
                   'version': '1.2.3',
@@ -219,7 +219,7 @@
             d.libPubspec("test_pkg", "1.0.0", deps: {
               "foo": "any"
             }),
-            d.file("pubspec.lock", json.stringify({
+            d.file("pubspec.lock", JSON.encode({
               'packages': {
                 'foo': {
                   'version': '0.1.2',
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index bea3fc2..078b2d9 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -490,7 +490,10 @@
  * by the callback.
  *
  * The [onDone] handler (if non-null) is invoked when the zone has no more
- * outstanding callbacks.
+ * outstanding callbacks. *Deprecated*: this method is less useful than it
+ * seems, because it assumes that every registered callback is always invoked.
+ * There are, however, many *valid* reasons not to complete futures or to abort
+ * a future-chain. In general it is a bad idea to rely on `onDone`.
  *
  * The [onRunAsync] handler (if non-null) is invoked when the [body] executes
  * [runAsync].  The handler is invoked in the outer zone and can therefore
diff --git a/sdk/lib/collection/hash_map.dart b/sdk/lib/collection/hash_map.dart
index e2f22a6..a0624e0 100644
--- a/sdk/lib/collection/hash_map.dart
+++ b/sdk/lib/collection/hash_map.dart
@@ -38,7 +38,7 @@
    * If no values are specified for [key] and [value] the default is the
    * identity function.
    */
-  factory HashMap.fromIterable(Iterable<K> iterable,
+  factory HashMap.fromIterable(Iterable iterable,
       {K key(element), V value(element)}) {
     HashMap<K, V> map = new HashMap<K, V>();
     Maps._fillMapWithMappedIterable(map, iterable, key, value);
diff --git a/sdk/lib/collection/linked_hash_map.dart b/sdk/lib/collection/linked_hash_map.dart
index ee38ae7..ff6f045f 100644
--- a/sdk/lib/collection/linked_hash_map.dart
+++ b/sdk/lib/collection/linked_hash_map.dart
@@ -41,7 +41,7 @@
    * If no values are specified for [key] and [value] the default is the
    * identity function.
    */
-  factory LinkedHashMap.fromIterable(Iterable<K> iterable,
+  factory LinkedHashMap.fromIterable(Iterable iterable,
       {K key(element), V value(element)}) {
     LinkedHashMap<K, V> map = new LinkedHashMap<K, V>();
     Maps._fillMapWithMappedIterable(map, iterable, key, value);
diff --git a/sdk/lib/collection/linked_list.dart b/sdk/lib/collection/linked_list.dart
index 502341c..cd89e78 100644
--- a/sdk/lib/collection/linked_list.dart
+++ b/sdk/lib/collection/linked_list.dart
@@ -185,7 +185,8 @@
 /**
  * Entry element for a [LinkedList]. Any entry must extend this class.
  */
-abstract class LinkedListEntry<E> implements _LinkedListLink {
+abstract class LinkedListEntry<E extends LinkedListEntry>
+    implements _LinkedListLink {
   LinkedList<E> _list;
   _LinkedListLink _next;
   _LinkedListLink _previous;
diff --git a/sdk/lib/collection/list.dart b/sdk/lib/collection/list.dart
index 7b4a074..0e0c611 100644
--- a/sdk/lib/collection/list.dart
+++ b/sdk/lib/collection/list.dart
@@ -20,17 +20,11 @@
  * This implements all read operations using only the `length` and
  * `operator[]` members. It implements write operations using those and
  * `length=` and `operator[]=`
- *
- * A fixed-length list should mix this class in, and the [FixedLengthListMixin]
- * as well, in that order, to overwrite the methods that modify the length.
- *
- * An unmodifiable list should mix [UnmodifiableListMixin] on top of this
- * mixin to prevent all modifications.
  */
 abstract class ListMixin<E> implements List<E> {
-  // A list to identify cyclic lists during toString() calls. 
+  // A list to identify cyclic lists during toString() calls.
   static List _toStringList = new List();
-  
+
   // Iterable interface.
   Iterator<E> get iterator => new ListIterator<E>(this);
 
@@ -493,9 +487,9 @@
       result.write(']');
      } finally {
        assert(identical(_toStringList.last, this));
-       _toStringList.removeLast();  
+       _toStringList.removeLast();
      }
-     
+
     return result.toString();
   }
 }
diff --git a/sdk/lib/convert/string_conversion.dart b/sdk/lib/convert/string_conversion.dart
index 4a90cfa..a10b616 100644
--- a/sdk/lib/convert/string_conversion.dart
+++ b/sdk/lib/convert/string_conversion.dart
@@ -92,8 +92,8 @@
 
   void writeCharCode(int charCode) => _sink.writeCharCode(charCode);
   void write(Object o) => _sink.write(o);
-  void writeln([Object o]) => _sink.writeln(o);
-  void writeAll(Iterable objects, [String separator])
+  void writeln([Object o = ""]) => _sink.writeln(o);
+  void writeAll(Iterable objects, [String separator = ""])
       => _sink.writeAll(objects, separator);
 }
 
@@ -128,12 +128,12 @@
     _chunkedSink.add(o.toString());
   }
 
-  void writeln([Object o]) {
+  void writeln([Object o = ""]) {
     _buffer.writeln(o);
     if (_buffer.length > _MIN_STRING_SIZE) _flush();
   }
 
-  void writeAll(Iterable objects, [String separator]) {
+  void writeAll(Iterable objects, [String separator = ""]) {
     if (_buffer.isNotEmpty) _flush();
     Iterator iterator = objects.iterator;
     if (!iterator.moveNext()) return;
diff --git a/sdk/lib/core/bool.dart b/sdk/lib/core/bool.dart
index 6155d6a..6c7797f 100644
--- a/sdk/lib/core/bool.dart
+++ b/sdk/lib/core/bool.dart
@@ -7,7 +7,7 @@
 /**
  * The reserved words [:true:] and [:false:] denote objects that are the only
  * instances of this class.
- * 
+ *
  * It is a compile-time error for a class to attempt to extend or implement
  * bool.
  */
@@ -21,5 +21,7 @@
    * Returns [:"true":] if the receiver is [:true:], or [:"false":] if the
    * receiver is [:false:].
    */
-  String toString();
+  String toString() {
+    return this ? "true" : "false";
+  }
 }
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 1ce7193..1c9797c 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -154,36 +154,50 @@
   String toString() => "Cannot instantiate abstract class: '$_className'";
 }
 
+
 /**
  * Error thrown by the default implementation of [:noSuchMethod:] on [Object].
  */
 class NoSuchMethodError extends Error {
   final Object _receiver;
-  final String _memberName;
+  final Symbol _memberName;
   final List _arguments;
-  final Map<String,dynamic> _namedArguments;
+  final Map<Symbol, dynamic> _namedArguments;
   final List _existingArgumentNames;
 
   /**
    * Create a [NoSuchMethodError] corresponding to a failed method call.
    *
-   * The first parameter to this constructor is the receiver of the method call.
+   * The [receiver] is the receiver of the method call.
    * That is, the object on which the method was attempted called.
-   * The second parameter is the name of the called method or accessor.
-   * The third parameter is a list of the positional arguments that the method
-   * was called with.
-   * The fourth parameter is a map from [String] names to the values of named
+   * If the receiver is `null`, it is interpreted as a call to a top-level
+   * function of a library.
+   *
+   * The [memberName] is a [Symbol] representing the name of the called method
+   * or accessor. It should not be `null`.
+   *
+   * The [positionalArguments] is a list of the positional arguments that the
+   * method was called with. If `null`, it is considered equivalent to the
+   * empty list.
+   *
+   * The [namedArguments] is a map from [Symbol]s to the values of named
    * arguments that the method was called with.
+   *
    * The optional [exisitingArgumentNames] is the expected parameters of a
    * method with the same name on the receiver, if available. This is
-   * the method that would have been called if the parameters had matched.
+   * the signature of the method that would have been called if the parameters
+   * had matched.
    */
-  NoSuchMethodError(Object this._receiver,
-                    String this._memberName,
-                    List this._arguments,
-                    Map<String,dynamic> this._namedArguments,
+  NoSuchMethodError(Object receiver,
+                    Symbol memberName,
+                    List positionalArguments,
+                    Map<Symbol ,dynamic> namedArguments,
                     [List existingArgumentNames = null])
-      : this._existingArgumentNames = existingArgumentNames;
+      : _receiver = receiver,
+        _memberName = memberName,
+        _arguments = positionalArguments,
+        _namedArguments = namedArguments,
+        _existingArgumentNames = existingArgumentNames;
 
   external String toString();
 }
diff --git a/sdk/lib/core/list.dart b/sdk/lib/core/list.dart
index af9f895..3c27d04 100644
--- a/sdk/lib/core/list.dart
+++ b/sdk/lib/core/list.dart
@@ -231,10 +231,11 @@
   void setAll(int index, Iterable<E> iterable);
 
   /**
-   * Removes [value] from this list.
+   * Removes the first occurence of [value] from this list.
    *
    * Returns true if [value] was in the list.
    * Returns false otherwise.
+   *
    * The method has no effect if [value] was not in the list.
    *
    * An [UnsupportedError] occurs if the list is fixed-length.
diff --git a/sdk/lib/core/map.dart b/sdk/lib/core/map.dart
index 79e81e4..e673446 100644
--- a/sdk/lib/core/map.dart
+++ b/sdk/lib/core/map.dart
@@ -36,7 +36,7 @@
    * If no values are specified for [key] and [value] the default is the
    * identity function.
    */
-  factory Map.fromIterable(Iterable<K> iterable,
+  factory Map.fromIterable(Iterable iterable,
       {K key(element), V value(element)}) = LinkedHashMap<K, V>.fromIterable;
 
   /**
diff --git a/sdk/lib/core/regexp.dart b/sdk/lib/core/regexp.dart
index a515692..815c52a 100644
--- a/sdk/lib/core/regexp.dart
+++ b/sdk/lib/core/regexp.dart
@@ -5,9 +5,10 @@
 part of dart.core;
 
 /**
- * [Match] contains methods to manipulate a regular expression match.
+ * [Match] contains methods to manipulate a pattern match.
  *
- * Iterables of [Match] objects are returned from [RegExp] matching methods.
+ * A [Match] or and iterable of [Match] objects are returned from [Pattern]
+ * matching methods.
  *
  * The following example finds all matches of a [RegExp] in a [String]
  * and iterates through the returned iterable of [Match] objects.
@@ -25,6 +26,11 @@
  *     Parse
  *     my
  *     string
+ *
+ * Some patterns, regular expressions in particular, may record subtrings
+ * that were part of the matching. These are called "groups" in the `Match`
+ * object. Some patterns may never have any groups, and their matches always
+ * have zero [groupCount].
  */
 abstract class Match {
   /**
@@ -39,37 +45,66 @@
   int get end;
 
   /**
-   * Returns the string matched by the given [group]. If [group] is 0,
-   * returns the match of the regular expression.
+   * Returns the string matched by the given [group].
+   *
+   * If [group] is 0, returns the match of the pattern.
+   *
+   * The result may be `null` if the pattern didn't assign a value to it
+   * as part of this match.
    */
   String group(int group);
+
+  /**
+   * Returns the string matched by the given [group].
+   *
+   * If [group] is 0, returns the match of the pattern.
+   *
+   * Short alias for [Match.group].
+   */
   String operator [](int group);
 
   /**
-   * Returns the strings matched by [groups]. The order in the
-   * returned string follows the order in [groups].
+   * Returns a list of the groups with the given indices.
+   *
+   * The list contains the strings returned by [group] for each index in
+   * [groupIndices].
    */
-  List<String> groups(List<int> groups);
+  List<String> groups(List<int> groupIndices);
 
   /**
-   * Returns the number of groups in the regular expression.
+   * Returns the number of captured groups in the match.
+   *
+   * Some patterns may capture parts of the input that was used to
+   * compute the full match. This is the number of captured groups,
+   * which is also the maximal allowed argument to the [group] method.
    */
   int get groupCount;
 
   /**
-   * The string on which this matcher was computed.
+   * The string on which this match was computed.
    */
+  String get input;
+
+  /**
+   * Deprecated alias for [input].
+   *
+   * Will be removed soon.
+   */
+  @deprecated
   String get str;
 
   /**
-   * The pattern used to search in [str].
+   * The pattern used to search in [input].
    */
   Pattern get pattern;
 }
 
 
 /**
- * A class for working with regular expressions.
+ * A regular expression pattern.
+ *
+ * Regular expressions are [Pattern]s, and can as such be used to match strings
+ * or parts of strings.
  *
  * Dart regular expressions have the same syntax and semantics as
  * JavaScript regular expressions. See
@@ -92,36 +127,34 @@
  */
 abstract class RegExp implements Pattern {
   /**
-   * Constructs a regular expression. The default implementation of a
-   * [RegExp] sets [multiLine] to false and [caseSensitive] to true.
-   * Throws a [FormatException] if [pattern] is not a valid regular
-   * exression pattern.
+   * Constructs a regular expression.
+   *
+   * Throws a [FormatException] if [source] is not valid regular
+   * expression syntax.
    */
-  external factory RegExp(String pattern, {bool multiLine: false,
-                                           bool caseSensitive: true});
+  external factory RegExp(String source, {bool multiLine: false,
+                                          bool caseSensitive: true});
 
   /**
    * Searches for the first match of the regular expression
-   * in the string [str]. Returns `null` if there is no match.
+   * in the string [input]. Returns `null` if there is no match.
    */
-  Match firstMatch(String str);
+  Match firstMatch(String input);
 
   /**
-   * Returns an iterable on the  matches of the regular
-   * expression in [str].
+   * Returns an iterable of the matches of the regular expression on [input].
    */
-  Iterable<Match> allMatches(String str);
+  Iterable<Match> allMatches(String input);
 
   /**
-   * Returns whether the regular expression has a match in the string [str].
+   * Returns whether the regular expression has a match in the string [input].
    */
-  bool hasMatch(String str);
+  bool hasMatch(String input);
 
   /**
-   * Searches for the first match of the regular expression
-   * in the string [str] and returns the matched string.
+   * Returns the first substring match of this regular expression in [input].
    */
-  String stringMatch(String str);
+  String stringMatch(String input);
 
   /**
    * The pattern of this regular expression.
@@ -130,11 +163,19 @@
 
   /**
    * Whether this regular expression matches multiple lines.
+   *
+   * If the regexp does match multiple lines, the "^" and "$" characters
+   * match the beginning and end of lines. If not, the character match the
+   * beginning and end of the input.
    */
   bool get isMultiLine;
 
   /**
-   * Whether this regular expression is case insensitive.
+   * Whether this regular expression is case sensitive.
+   *
+   * If the regular expression is not case sensitive, it will match an input
+   * letter with a pattern letter even if the two letters are different case
+   * versions of the same letter.
    */
   bool get isCaseSensitive;
 }
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 919675d..b5106a9 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -1,8 +1,27 @@
-/// The Dart HTML library.
-///
-/// For examples, see
-/// [Dart HTML5 Samples](https://github.com/dart-lang/dart-html5-samples)
-/// on Github.
+/**
+ * HTML elements and other resources for web-based applications that need to
+ * interact with the browser and the DOM (Document Object Model).
+ *
+ * This library includes DOM element types, CSS styling, local storage,
+ * media, speech, events, and more.
+ * To get started,
+ * check out the [Element] class, the base class for many of the HTML
+ * DOM types.
+ *
+ * ## Other resources
+ *
+ * * If you've never written a web app before, try our
+ * tutorials&mdash;[A Game of Darts](http://dartlang.org/docs/tutorials).
+ * 
+ * * To see some web-based Dart apps in action and to play with the code,
+ * download
+ * [Dart Editor](http://www.dartlang.org/#get-started)
+ * and run its built-in examples.
+ *
+ * * For even more examples, see
+ * [Dart HTML5 Samples](https://github.com/dart-lang/dart-html5-samples)
+ * on Github.
+ */
 library dart.dom.html;
 
 import 'dart:async';
@@ -11,7 +30,7 @@
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:isolate';
-import 'dart:json' as json;
+import "dart:convert";
 import 'dart:math';
 import 'dart:typed_data';
 import 'dart:svg' as svg;
@@ -264,7 +283,7 @@
 
   @DomName('WebKitAnimationEvent.elapsedTime')
   @DocsEditable()
-  final num elapsedTime;
+  final double elapsedTime;
 }
 // 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
@@ -272,7 +291,7 @@
 
 
 @DocsEditable()
-@DomName('DOMApplicationCache')
+@DomName('ApplicationCache')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -283,110 +302,110 @@
   // To suppress missing implicit constructor warnings.
   factory ApplicationCache._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('DOMApplicationCache.cachedEvent')
+  @DomName('ApplicationCache.cachedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cachedEvent = const EventStreamProvider<Event>('cached');
 
-  @DomName('DOMApplicationCache.checkingEvent')
+  @DomName('ApplicationCache.checkingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> checkingEvent = const EventStreamProvider<Event>('checking');
 
-  @DomName('DOMApplicationCache.downloadingEvent')
+  @DomName('ApplicationCache.downloadingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> downloadingEvent = const EventStreamProvider<Event>('downloading');
 
-  @DomName('DOMApplicationCache.errorEvent')
+  @DomName('ApplicationCache.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
-  @DomName('DOMApplicationCache.noupdateEvent')
+  @DomName('ApplicationCache.noupdateEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> noUpdateEvent = const EventStreamProvider<Event>('noupdate');
 
-  @DomName('DOMApplicationCache.obsoleteEvent')
+  @DomName('ApplicationCache.obsoleteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> obsoleteEvent = const EventStreamProvider<Event>('obsolete');
 
-  @DomName('DOMApplicationCache.progressEvent')
+  @DomName('ApplicationCache.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
-  @DomName('DOMApplicationCache.updatereadyEvent')
+  @DomName('ApplicationCache.updatereadyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> updateReadyEvent = const EventStreamProvider<Event>('updateready');
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.applicationCache)');
 
-  @DomName('DOMApplicationCache.CHECKING')
+  @DomName('ApplicationCache.CHECKING')
   @DocsEditable()
   static const int CHECKING = 2;
 
-  @DomName('DOMApplicationCache.DOWNLOADING')
+  @DomName('ApplicationCache.DOWNLOADING')
   @DocsEditable()
   static const int DOWNLOADING = 3;
 
-  @DomName('DOMApplicationCache.IDLE')
+  @DomName('ApplicationCache.IDLE')
   @DocsEditable()
   static const int IDLE = 1;
 
-  @DomName('DOMApplicationCache.OBSOLETE')
+  @DomName('ApplicationCache.OBSOLETE')
   @DocsEditable()
   static const int OBSOLETE = 5;
 
-  @DomName('DOMApplicationCache.UNCACHED')
+  @DomName('ApplicationCache.UNCACHED')
   @DocsEditable()
   static const int UNCACHED = 0;
 
-  @DomName('DOMApplicationCache.UPDATEREADY')
+  @DomName('ApplicationCache.UPDATEREADY')
   @DocsEditable()
   static const int UPDATEREADY = 4;
 
-  @DomName('DOMApplicationCache.status')
+  @DomName('ApplicationCache.status')
   @DocsEditable()
   final int status;
 
-  @DomName('DOMApplicationCache.abort')
+  @DomName('ApplicationCache.abort')
   @DocsEditable()
   void abort() native;
 
-  @DomName('DOMApplicationCache.swapCache')
+  @DomName('ApplicationCache.swapCache')
   @DocsEditable()
   void swapCache() native;
 
-  @DomName('DOMApplicationCache.update')
+  @DomName('ApplicationCache.update')
   @DocsEditable()
   void update() native;
 
-  @DomName('DOMApplicationCache.oncached')
+  @DomName('ApplicationCache.oncached')
   @DocsEditable()
   Stream<Event> get onCached => cachedEvent.forTarget(this);
 
-  @DomName('DOMApplicationCache.onchecking')
+  @DomName('ApplicationCache.onchecking')
   @DocsEditable()
   Stream<Event> get onChecking => checkingEvent.forTarget(this);
 
-  @DomName('DOMApplicationCache.ondownloading')
+  @DomName('ApplicationCache.ondownloading')
   @DocsEditable()
   Stream<Event> get onDownloading => downloadingEvent.forTarget(this);
 
-  @DomName('DOMApplicationCache.onerror')
+  @DomName('ApplicationCache.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
-  @DomName('DOMApplicationCache.onnoupdate')
+  @DomName('ApplicationCache.onnoupdate')
   @DocsEditable()
   Stream<Event> get onNoUpdate => noUpdateEvent.forTarget(this);
 
-  @DomName('DOMApplicationCache.onobsolete')
+  @DomName('ApplicationCache.onobsolete')
   @DocsEditable()
   Stream<Event> get onObsolete => obsoleteEvent.forTarget(this);
 
-  @DomName('DOMApplicationCache.onprogress')
+  @DomName('ApplicationCache.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
-  @DomName('DOMApplicationCache.onupdateready')
+  @DomName('ApplicationCache.onupdateready')
   @DocsEditable()
   Stream<Event> get onUpdateReady => updateReadyEvent.forTarget(this);
 }
@@ -1180,7 +1199,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  final num backingStorePixelRatio;
+  final double backingStorePixelRatio;
 
   @JSName('arc')
   @DomName('CanvasRenderingContext2D.arc')
@@ -1833,7 +1852,9 @@
 @DomName('Console')
 class Console {
 
-  static Console _safeConsole = new Console();
+  Console._safe() {}
+
+  static Console _safeConsole = new Console._safe();
 
   bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
 
@@ -1916,17 +1937,124 @@
   @DomName('Console.warn')
   void warn(Object arg) => _isConsoleDefined ?
       JS('void', 'console.warn(#)', arg) : null;
+  // To suppress missing implicit constructor warnings.
+  factory Console._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('Console.clear')
+}
+// 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
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
+@DomName('ConsoleBase')
+@Experimental() // untriaged
+class ConsoleBase extends Interceptor native "ConsoleBase" {
+
+  @DomName('ConsoleBase.assertCondition')
   @DocsEditable()
-  @Experimental()
+  @Experimental() // untriaged
+  void assertCondition(bool condition, Object arg) native;
+
+  @DomName('ConsoleBase.clear')
+  @DocsEditable()
+  @Experimental() // untriaged
   void clear(Object arg) native;
 
-  @DomName('Console.table')
+  @DomName('ConsoleBase.count')
   @DocsEditable()
-  @Experimental()
+  @Experimental() // untriaged
+  void count(Object arg) native;
+
+  @DomName('ConsoleBase.debug')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void debug(Object arg) native;
+
+  @DomName('ConsoleBase.dir')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void dir(Object arg) native;
+
+  @DomName('ConsoleBase.dirxml')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void dirxml(Object arg) native;
+
+  @DomName('ConsoleBase.error')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void error(Object arg) native;
+
+  @DomName('ConsoleBase.group')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void group(Object arg) native;
+
+  @DomName('ConsoleBase.groupCollapsed')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void groupCollapsed(Object arg) native;
+
+  @DomName('ConsoleBase.groupEnd')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void groupEnd() native;
+
+  @DomName('ConsoleBase.info')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void info(Object arg) native;
+
+  @DomName('ConsoleBase.log')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void log(Object arg) native;
+
+  @DomName('ConsoleBase.markTimeline')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void markTimeline(Object arg) native;
+
+  @DomName('ConsoleBase.profile')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void profile(String title) native;
+
+  @DomName('ConsoleBase.profileEnd')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void profileEnd(String title) native;
+
+  @DomName('ConsoleBase.table')
+  @DocsEditable()
+  @Experimental() // untriaged
   void table(Object arg) native;
 
+  @DomName('ConsoleBase.time')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void time(String title) native;
+
+  @DomName('ConsoleBase.timeEnd')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void timeEnd(String title) native;
+
+  @DomName('ConsoleBase.timeStamp')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void timeStamp(Object arg) native;
+
+  @DomName('ConsoleBase.trace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void trace(Object arg) native;
+
+  @DomName('ConsoleBase.warn')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void warn(Object arg) native;
 }
 // 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
@@ -1974,31 +2102,31 @@
 
   @DomName('Coordinates.accuracy')
   @DocsEditable()
-  final num accuracy;
+  final double accuracy;
 
   @DomName('Coordinates.altitude')
   @DocsEditable()
-  final num altitude;
+  final double altitude;
 
   @DomName('Coordinates.altitudeAccuracy')
   @DocsEditable()
-  final num altitudeAccuracy;
+  final double altitudeAccuracy;
 
   @DomName('Coordinates.heading')
   @DocsEditable()
-  final num heading;
+  final double heading;
 
   @DomName('Coordinates.latitude')
   @DocsEditable()
-  final num latitude;
+  final double latitude;
 
   @DomName('Coordinates.longitude')
   @DocsEditable()
-  final num longitude;
+  final double longitude;
 
   @DomName('Coordinates.speed')
   @DocsEditable()
-  final num speed;
+  final double speed;
 }
 // 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
@@ -2063,43 +2191,6 @@
 
 
 @DocsEditable()
-@DomName('CryptoOperation')
-@Experimental() // untriaged
-class CryptoOperation extends Interceptor native "CryptoOperation" {
-
-  @DomName('CryptoOperation.algorithm')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final Algorithm algorithm;
-
-  @DomName('CryptoOperation.abort')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Object abort() native;
-
-  @DomName('CryptoOperation.finish')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Object finish() native;
-
-  @JSName('process')
-  @DomName('CryptoOperation.process')
-  @DocsEditable()
-  @Experimental() // untriaged
-  CryptoOperation processByteBuffer(ByteBuffer data) native;
-
-  @JSName('process')
-  @DomName('CryptoOperation.process')
-  @DocsEditable()
-  @Experimental() // untriaged
-  CryptoOperation processTypedData(TypedData data) native;
-}
-// 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
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable()
 @DomName('CSS')
 // http://www.w3.org/TR/css3-conditional/#the-css-interface
 @Experimental() // None
@@ -2315,21 +2406,20 @@
 
 
 @DocsEditable()
-@DomName('WebKitCSSKeyframeRule')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
-// http://www.w3.org/TR/css3-animations/#CSSKeyframeRule-interface
-class CssKeyframeRule extends CssRule native "CSSKeyframeRule,MozCSSKeyframeRule,WebKitCSSKeyframeRule" {
+@DomName('CSSKeyframeRule')
+@Experimental() // untriaged
+class CssKeyframeRule extends CssRule native "CSSKeyframeRule" {
   // To suppress missing implicit constructor warnings.
   factory CssKeyframeRule._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('WebKitCSSKeyframeRule.keyText')
+  @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
+  @Experimental() // untriaged
   String keyText;
 
-  @DomName('WebKitCSSKeyframeRule.style')
+  @DomName('CSSKeyframeRule.style')
   @DocsEditable()
+  @Experimental() // untriaged
   final CssStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2338,45 +2428,43 @@
 
 
 @DocsEditable()
-@DomName('WebKitCSSKeyframesRule')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
-// http://www.w3.org/TR/css3-animations/#csskeyframesrule
-class CssKeyframesRule extends CssRule native "CSSKeyframesRule,MozCSSKeyframesRule,WebKitCSSKeyframesRule" {
+@DomName('CSSKeyframesRule')
+@Experimental() // untriaged
+class CssKeyframesRule extends CssRule native "CSSKeyframesRule" {
   // To suppress missing implicit constructor warnings.
   factory CssKeyframesRule._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('WebKitCSSKeyframesRule.cssRules')
+  @DomName('CSSKeyframesRule.cssRules')
   @DocsEditable()
+  @Experimental() // untriaged
   @Returns('_CssRuleList')
   @Creates('_CssRuleList')
   final List<CssRule> cssRules;
 
-  @DomName('WebKitCSSKeyframesRule.name')
+  @DomName('CSSKeyframesRule.name')
   @DocsEditable()
+  @Experimental() // untriaged
   String name;
 
-  @DomName('WebKitCSSKeyframesRule.__getter__')
+  @DomName('CSSKeyframesRule.__getter__')
   @DocsEditable()
+  @Experimental() // untriaged
   CssKeyframeRule __getter__(int index) native;
 
-  @DomName('WebKitCSSKeyframesRule.deleteRule')
+  @DomName('CSSKeyframesRule.deleteRule')
   @DocsEditable()
+  @Experimental() // untriaged
   void deleteRule(String key) native;
 
-  @DomName('WebKitCSSKeyframesRule.findRule')
+  @DomName('CSSKeyframesRule.findRule')
   @DocsEditable()
+  @Experimental() // untriaged
   CssKeyframeRule findRule(String key) native;
 
-
-  void appendRule(String rule) {
-    if (JS('bool', '("appendRule" in #)', this)) {
-      JS('', '#.appendRule(#)', this, rule);
-    } else {
-      JS('', '#.insertRule(#)', this, rule);
-    }
-  }
+  @DomName('CSSKeyframesRule.insertRule')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void insertRule(String rule) native;
 }
 // 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
@@ -2646,6 +2734,16 @@
   @DocsEditable()
   static const int IMPORT_RULE = 3;
 
+  @DomName('CSSRule.KEYFRAMES_RULE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int KEYFRAMES_RULE = 7;
+
+  @DomName('CSSRule.KEYFRAME_RULE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int KEYFRAME_RULE = 8;
+
   @DomName('CSSRule.MEDIA_RULE')
   @DocsEditable()
   static const int MEDIA_RULE = 4;
@@ -6465,27 +6563,33 @@
   @DocsEditable()
   final int length;
 
+  @DomName('DataTransferItemList.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DataTransferItem __getter__(int index) native;
+
   @DomName('DataTransferItemList.add')
   @DocsEditable()
-  void add(data_OR_file, [String type]) native;
+  DataTransferItem add(data_OR_file, [String type]) native;
 
   @JSName('add')
   @DomName('DataTransferItemList.add')
   @DocsEditable()
-  void addData(String data, String type) native;
+  DataTransferItem addData(String data, String type) native;
 
   @JSName('add')
   @DomName('DataTransferItemList.add')
   @DocsEditable()
-  void addFile(File file) native;
+  DataTransferItem addFile(File file) native;
 
   @DomName('DataTransferItemList.clear')
   @DocsEditable()
   void clear() native;
 
-  @DomName('DataTransferItemList.item')
+  @DomName('DataTransferItemList.remove')
   @DocsEditable()
-  DataTransferItem item(int index) native;
+  @Experimental() // untriaged
+  void remove(int index) native;
 }
 // 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
@@ -6563,15 +6667,15 @@
 
   @DomName('DeviceAcceleration.x')
   @DocsEditable()
-  final num x;
+  final double x;
 
   @DomName('DeviceAcceleration.y')
   @DocsEditable()
-  final num y;
+  final double y;
 
   @DomName('DeviceAcceleration.z')
   @DocsEditable()
-  final num z;
+  final double z;
 }
 // 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
@@ -6596,7 +6700,7 @@
 
   @DomName('DeviceMotionEvent.interval')
   @DocsEditable()
-  final num interval;
+  final double interval;
 
   @DomName('DeviceMotionEvent.rotationRate')
   @DocsEditable()
@@ -6629,15 +6733,15 @@
 
   @DomName('DeviceOrientationEvent.alpha')
   @DocsEditable()
-  final num alpha;
+  final double alpha;
 
   @DomName('DeviceOrientationEvent.beta')
   @DocsEditable()
-  final num beta;
+  final double beta;
 
   @DomName('DeviceOrientationEvent.gamma')
   @DocsEditable()
-  final num gamma;
+  final double gamma;
 
   @JSName('initDeviceOrientationEvent')
   @DomName('DeviceOrientationEvent.initDeviceOrientationEvent')
@@ -6658,15 +6762,15 @@
 
   @DomName('DeviceRotationRate.alpha')
   @DocsEditable()
-  final num alpha;
+  final double alpha;
 
   @DomName('DeviceRotationRate.beta')
   @DocsEditable()
-  final num beta;
+  final double beta;
 
   @DomName('DeviceRotationRate.gamma')
   @DocsEditable()
-  final num gamma;
+  final double gamma;
 }
 // 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
@@ -7178,10 +7282,9 @@
   @Unstable()
   NodeIterator _createNodeIterator(Node root, [int whatToShow, NodeFilter filter, bool expandEntityReferences]) native;
 
-  @JSName('createRange')
   @DomName('Document.createRange')
   @DocsEditable()
-  Range $dom_createRange() native;
+  Range createRange() native;
 
   @JSName('createTextNode')
   @DomName('Document.createTextNode')
@@ -9678,7 +9781,7 @@
     }
     var fragment;
     if (Range.supportsCreateContextualFragment) {
-      var range = _parseDocument.$dom_createRange();
+      var range = _parseDocument.createRange();
       range.selectNodeContents(contextElement);
       fragment = range.createContextualFragment(html);
     } else {
@@ -10072,6 +10175,12 @@
   @DocsEditable()
   String id;
 
+  // Use implementation from Node.
+  // final String _localName;
+
+  // Use implementation from Node.
+  // final String _namespaceUri;
+
   @DomName('Element.offsetHeight')
   @DocsEditable()
   final int offsetHeight;
@@ -10147,12 +10256,12 @@
   @JSName('getAttribute')
   @DomName('Element.getAttribute')
   @DocsEditable()
-  String $dom_getAttribute(String name) native;
+  String _getAttribute(String name) native;
 
   @JSName('getAttributeNS')
   @DomName('Element.getAttributeNS')
   @DocsEditable()
-  String $dom_getAttributeNS(String namespaceURI, String localName) native;
+  String _getAttributeNS(String namespaceURI, String localName) native;
 
   @DomName('Element.getBoundingClientRect')
   @DocsEditable()
@@ -10256,12 +10365,12 @@
   @JSName('setAttribute')
   @DomName('Element.setAttribute')
   @DocsEditable()
-  void $dom_setAttribute(String name, String value) native;
+  void _setAttribute(String name, String value) native;
 
   @JSName('setAttributeNS')
   @DomName('Element.setAttributeNS')
   @DocsEditable()
-  void $dom_setAttributeNS(String namespaceURI, String qualifiedName, String value) native;
+  void _setAttributeNS(String namespaceURI, String qualifiedName, String value) native;
 
   @JSName('webkitGetRegionFlowRanges')
   @DomName('Element.webkitGetRegionFlowRanges')
@@ -11378,7 +11487,9 @@
 @DomName('FileError')
 // http://dev.w3.org/2009/dap/file-system/pub/FileSystem/
 @Experimental()
-class FileError extends Interceptor native "FileError" {
+class FileError extends DomError native "FileError" {
+  // To suppress missing implicit constructor warnings.
+  factory FileError._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('FileError.ABORT_ERR')
   @DocsEditable()
@@ -12346,6 +12457,28 @@
 
 
 @DocsEditable()
+@DomName('HmacKeyParams')
+@Experimental() // untriaged
+class HmacKeyParams extends Algorithm native "HmacKeyParams" {
+  // To suppress missing implicit constructor warnings.
+  factory HmacKeyParams._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('HmacKeyParams.hash')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Algorithm hash;
+
+  @DomName('HmacKeyParams.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int length;
+}
+// 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
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
 @DomName('HmacParams')
 @Experimental() // untriaged
 class HmacParams extends Algorithm native "HmacParams" {
@@ -12366,7 +12499,7 @@
 @DomName('HTMLAllCollection')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dom-document-all
 @deprecated // deprecated
-class HtmlAllCollection extends Interceptor with ListMixin<Node>, ImmutableListMixin<Node> implements JavaScriptIndexingBehavior, List<Node> native "HTMLAllCollection" {
+class HtmlAllCollection extends Interceptor with ListMixin<Node>, ImmutableListMixin<Node> implements List<Node> native "HTMLAllCollection" {
 
   @DomName('HTMLAllCollection.length')
   @DocsEditable()
@@ -12757,7 +12890,7 @@
  * * [Using XMLHttpRequest](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest)
  */
 @DomName('XMLHttpRequest')
-class HttpRequest extends EventTarget native "XMLHttpRequest" {
+class HttpRequest extends XmlHttpRequestEventTarget native "XMLHttpRequest" {
 
   /**
    * Creates a URL get request for the specified [url].
@@ -12960,6 +13093,13 @@
       completer.completeError(e);
     }, 1));
 
+    // IE9 RTM - XDomainRequest issued requests may abort if all event handlers
+    // not specified
+    // http://social.msdn.microsoft.com/Forums/ie/en-US/30ef3add-767c-4436-b8a9-f1ca19b4812e/ie9-rtm-xdomainrequest-issued-requests-may-abort-if-all-event-handlers-not-specified
+    JS('', '#.onprogress = {}', xhr);
+    JS('', '#.ontimeout = {}', xhr);
+    JS('', '#.timeout = Number.MAX_VALUE', xhr);
+
     if (sendData != null) {
       JS('', '#.send(#)', xhr, sendData);
     } else {
@@ -12972,30 +13112,6 @@
   // To suppress missing implicit constructor warnings.
   factory HttpRequest._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('XMLHttpRequest.abortEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
-
-  @DomName('XMLHttpRequest.errorEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> errorEvent = const EventStreamProvider<ProgressEvent>('error');
-
-  @DomName('XMLHttpRequest.loadEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
-
-  @DomName('XMLHttpRequest.loadendEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
-
-  @DomName('XMLHttpRequest.loadstartEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
-
-  @DomName('XMLHttpRequest.progressEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
-
   @DomName('XMLHttpRequest.readystatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> readyStateChangeEvent = const EventStreamProvider<ProgressEvent>('readystatechange');
@@ -13250,65 +13366,6 @@
   void setRequestHeader(String header, String value) native;
 
   /**
-   * Event listeners to be notified when request has been aborted,
-   * generally due to calling `httpRequest.abort()`.
-   */
-  @DomName('XMLHttpRequest.onabort')
-  @DocsEditable()
-  Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
-
-  /**
-   * Event listeners to be notified when a request has failed, such as when a
-   * cross-domain error occurred or the file wasn't found on the server.
-   */
-  @DomName('XMLHttpRequest.onerror')
-  @DocsEditable()
-  Stream<ProgressEvent> get onError => errorEvent.forTarget(this);
-
-  /**
-   * Event listeners to be notified once the request has completed
-   * *successfully*.
-   */
-  @DomName('XMLHttpRequest.onload')
-  @DocsEditable()
-  Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
-
-  /**
-   * Event listeners to be notified once the request has completed (on
-   * either success or failure).
-   */
-  @DomName('XMLHttpRequest.onloadend')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.FIREFOX)
-  @SupportedBrowser(SupportedBrowser.IE, '10')
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
-
-  /**
-   * Event listeners to be notified when the request starts, once
-   * `httpRequest.send()` has been called.
-   */
-  @DomName('XMLHttpRequest.onloadstart')
-  @DocsEditable()
-  Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
-
-  /**
-   * Event listeners to be notified when data for the request
-   * is being sent or loaded.
-   *
-   * Progress events are fired every 50ms or for every byte transmitted,
-   * whichever is less frequent.
-   */
-  @DomName('XMLHttpRequest.onprogress')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.FIREFOX)
-  @SupportedBrowser(SupportedBrowser.IE, '10')
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
-
-  /**
    * Event listeners to be notified every time the [HttpRequest]
    * object's `readyState` changes values.
    */
@@ -13352,57 +13409,9 @@
 @DomName('XMLHttpRequestUpload')
 // http://xhr.spec.whatwg.org/#xmlhttprequestupload
 @Experimental()
-class HttpRequestUpload extends EventTarget native "XMLHttpRequestUpload,XMLHttpRequestEventTarget" {
+class HttpRequestUpload extends XmlHttpRequestEventTarget native "XMLHttpRequestUpload,XMLHttpRequestEventTarget" {
   // To suppress missing implicit constructor warnings.
   factory HttpRequestUpload._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('XMLHttpRequestUpload.abortEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
-
-  @DomName('XMLHttpRequestUpload.errorEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> errorEvent = const EventStreamProvider<ProgressEvent>('error');
-
-  @DomName('XMLHttpRequestUpload.loadEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
-
-  @DomName('XMLHttpRequestUpload.loadendEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
-
-  @DomName('XMLHttpRequestUpload.loadstartEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
-
-  @DomName('XMLHttpRequestUpload.progressEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
-
-  @DomName('XMLHttpRequestUpload.onabort')
-  @DocsEditable()
-  Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
-
-  @DomName('XMLHttpRequestUpload.onerror')
-  @DocsEditable()
-  Stream<ProgressEvent> get onError => errorEvent.forTarget(this);
-
-  @DomName('XMLHttpRequestUpload.onload')
-  @DocsEditable()
-  Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
-
-  @DomName('XMLHttpRequestUpload.onloadend')
-  @DocsEditable()
-  Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
-
-  @DomName('XMLHttpRequestUpload.onloadstart')
-  @DocsEditable()
-  Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
-
-  @DomName('XMLHttpRequestUpload.onprogress')
-  @DocsEditable()
-  Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 }
 // 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
@@ -14981,7 +14990,7 @@
 
   @DomName('MediaController.duration')
   @DocsEditable()
-  final num duration;
+  final double duration;
 
   @DomName('MediaController.muted')
   @DocsEditable()
@@ -15223,7 +15232,7 @@
 
   @DomName('HTMLMediaElement.duration')
   @DocsEditable()
-  final num duration;
+  final double duration;
 
   @DomName('HTMLMediaElement.ended')
   @DocsEditable()
@@ -15237,7 +15246,7 @@
   @DocsEditable()
   // http://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-media-initialtime
   @Experimental()
-  final num initialTime;
+  final double initialTime;
 
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
@@ -15296,7 +15305,7 @@
   @DomName('HTMLMediaElement.startTime')
   @DocsEditable()
   @Experimental() // non-standard
-  final num startTime;
+  final double startTime;
 
   @DomName('HTMLMediaElement.textTracks')
   @DocsEditable()
@@ -16166,13 +16175,6 @@
 @Unstable()
 class MessageChannel extends Interceptor native "MessageChannel" {
 
-  @DomName('MessageChannel.MessageChannel')
-  @DocsEditable()
-  factory MessageChannel() {
-    return MessageChannel._create_1();
-  }
-  static MessageChannel _create_1() => JS('MessageChannel', 'new MessageChannel()');
-
   @DomName('MessageChannel.port1')
   @DocsEditable()
   final MessagePort port1;
@@ -16228,12 +16230,10 @@
   @Creates('JSExtendableArray')
   final List<MessagePort> ports;
 
-  WindowBase get source => _convertNativeToDart_Window(this._get_source);
+  EventTarget get source => _convertNativeToDart_EventTarget(this._get_source);
   @JSName('source')
   @DomName('MessageEvent.source')
   @DocsEditable()
-  @Creates('Window|=Object')
-  @Returns('Window|=Object')
   final dynamic _get_source;
 
   @JSName('initMessageEvent')
@@ -16513,7 +16513,7 @@
 
   @DomName('MIDIMessageEvent.receivedTime')
   @DocsEditable()
-  final num receivedTime;
+  final double receivedTime;
 }
 // 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
@@ -16695,7 +16695,7 @@
 
 
 @DomName('MouseEvent')
-class MouseEvent extends UIEvent native "MouseEvent,DragEvent" {
+class MouseEvent extends UIEvent native "MouseEvent,DragEvent,PointerEvent,MSPointerEvent" {
   factory MouseEvent(String type,
       {Window view, int detail: 0, int screenX: 0, int screenY: 0,
       int clientX: 0, int clientY: 0, int button: 0, bool canBubble: true,
@@ -17160,7 +17160,7 @@
 
 
 @DomName('Navigator')
-class Navigator extends Interceptor native "Navigator" {
+class Navigator extends Interceptor implements NavigatorOnLine, NavigatorID native "Navigator" {
 
   @DomName('Navigator.language')
   String get language => JS('String', '#.language || #.userLanguage', this,
@@ -17239,14 +17239,6 @@
   @Experimental() // non-standard
   final String appCodeName;
 
-  @DomName('Navigator.appName')
-  @DocsEditable()
-  final String appName;
-
-  @DomName('Navigator.appVersion')
-  @DocsEditable()
-  final String appVersion;
-
   @DomName('Navigator.cookieEnabled')
   @DocsEditable()
   @Unstable()
@@ -17268,15 +17260,6 @@
   @Experimental() // nonstandard
   final MimeTypeArray mimeTypes;
 
-  @DomName('Navigator.onLine')
-  @DocsEditable()
-  @Unstable()
-  final bool onLine;
-
-  @DomName('Navigator.platform')
-  @DocsEditable()
-  final String platform;
-
   @DomName('Navigator.plugins')
   @DocsEditable()
   @deprecated // nonstandard
@@ -17292,10 +17275,6 @@
   @Unstable()
   final String productSub;
 
-  @DomName('Navigator.userAgent')
-  @DocsEditable()
-  final String userAgent;
-
   @DomName('Navigator.vendor')
   @DocsEditable()
   @Unstable()
@@ -17372,6 +17351,61 @@
   @Creates('_GamepadList')
   List<Gamepad> getGamepads() native;
 
+  // From NavigatorID
+
+  @DomName('Navigator.appName')
+  @DocsEditable()
+  final String appName;
+
+  @DomName('Navigator.appVersion')
+  @DocsEditable()
+  final String appVersion;
+
+  @DomName('Navigator.platform')
+  @DocsEditable()
+  final String platform;
+
+  @DomName('Navigator.userAgent')
+  @DocsEditable()
+  final String userAgent;
+
+  // From NavigatorOnLine
+
+  @DomName('Navigator.onLine')
+  @DocsEditable()
+  @Unstable()
+  final bool onLine;
+
+}
+// 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
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
+@DomName('NavigatorID')
+@Experimental() // untriaged
+abstract class NavigatorID extends Interceptor {
+
+  String appName;
+
+  String appVersion;
+
+  String platform;
+
+  String userAgent;
+}
+// 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
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
+@DomName('NavigatorOnLine')
+@Experimental() // untriaged
+abstract class NavigatorOnLine extends Interceptor {
+
+  bool onLine;
 }
 // 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
@@ -17545,7 +17579,7 @@
     _this._replaceChild(value, this[index]);
   }
 
-  Iterator<Node> get iterator => _this.$dom_childNodes.iterator;
+  Iterator<Node> get iterator => _this._childNodes.iterator;
 
   // From List<Node>:
 
@@ -17567,15 +17601,15 @@
   // -- end List<Node> mixins.
 
   // TODO(jacobr): benchmark whether this is more efficient or whether caching
-  // a local copy of $dom_childNodes is more efficient.
-  int get length => _this.$dom_childNodes.length;
+  // a local copy of _childNodes is more efficient.
+  int get length => _this._childNodes.length;
 
   void set length(int value) {
     throw new UnsupportedError(
         "Cannot set length on immutable List.");
   }
 
-  Node operator[](int index) => _this.$dom_childNodes[index];
+  Node operator[](int index) => _this._childNodes[index];
 }
 
 /** Information about the instantiated template. */
@@ -17774,7 +17808,7 @@
   @DocsEditable()
   @Returns('NodeList')
   @Creates('NodeList')
-  final List<Node> $dom_childNodes;
+  final List<Node> _childNodes;
 
   @DomName('Node.firstChild')
   @DocsEditable()
@@ -18775,7 +18809,7 @@
 
   @DomName('Performance.now')
   @DocsEditable()
-  num now() native;
+  double now() native;
 
   @JSName('webkitClearResourceTimings')
   @DomName('Performance.webkitClearResourceTimings')
@@ -18808,7 +18842,7 @@
 
   @DomName('PerformanceEntry.duration')
   @DocsEditable()
-  final num duration;
+  final double duration;
 
   @DomName('PerformanceEntry.entryType')
   @DocsEditable()
@@ -18820,7 +18854,7 @@
 
   @DomName('PerformanceEntry.startTime')
   @DocsEditable()
-  final num startTime;
+  final double startTime;
 }
 // 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
@@ -18897,23 +18931,23 @@
 
   @DomName('PerformanceResourceTiming.connectEnd')
   @DocsEditable()
-  final num connectEnd;
+  final double connectEnd;
 
   @DomName('PerformanceResourceTiming.connectStart')
   @DocsEditable()
-  final num connectStart;
+  final double connectStart;
 
   @DomName('PerformanceResourceTiming.domainLookupEnd')
   @DocsEditable()
-  final num domainLookupEnd;
+  final double domainLookupEnd;
 
   @DomName('PerformanceResourceTiming.domainLookupStart')
   @DocsEditable()
-  final num domainLookupStart;
+  final double domainLookupStart;
 
   @DomName('PerformanceResourceTiming.fetchStart')
   @DocsEditable()
-  final num fetchStart;
+  final double fetchStart;
 
   @DomName('PerformanceResourceTiming.initiatorType')
   @DocsEditable()
@@ -18921,30 +18955,30 @@
 
   @DomName('PerformanceResourceTiming.redirectEnd')
   @DocsEditable()
-  final num redirectEnd;
+  final double redirectEnd;
 
   @DomName('PerformanceResourceTiming.redirectStart')
   @DocsEditable()
-  final num redirectStart;
+  final double redirectStart;
 
   @DomName('PerformanceResourceTiming.requestStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  final num requestStart;
+  final double requestStart;
 
   @DomName('PerformanceResourceTiming.responseEnd')
   @DocsEditable()
   @Experimental() // nonstandard
-  final num responseEnd;
+  final double responseEnd;
 
   @DomName('PerformanceResourceTiming.responseStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  final num responseStart;
+  final double responseStart;
 
   @DomName('PerformanceResourceTiming.secureConnectionStart')
   @DocsEditable()
-  final num secureConnectionStart;
+  final double secureConnectionStart;
 }
 // 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
@@ -19253,15 +19287,10 @@
 @DocsEditable()
 @DomName('ProcessingInstruction')
 @Unstable()
-class ProcessingInstruction extends Node native "ProcessingInstruction" {
+class ProcessingInstruction extends CharacterData native "ProcessingInstruction" {
   // To suppress missing implicit constructor warnings.
   factory ProcessingInstruction._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('ProcessingInstruction.data')
-  @DocsEditable()
-  @Experimental() // non-standard
-  String data;
-
   @DomName('ProcessingInstruction.sheet')
   @DocsEditable()
   @Experimental() // non-standard
@@ -19306,7 +19335,7 @@
 
   @DomName('HTMLProgressElement.position')
   @DocsEditable()
-  final num position;
+  final double position;
 
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
@@ -19462,7 +19491,7 @@
 @DomName('Range')
 @Unstable()
 class Range extends Interceptor native "Range" {
-  factory Range() => document.$dom_createRange();
+  factory Range() => document.createRange();
 
   factory Range.fromPoint(Point point) =>
       document._caretRangeFromPoint(point.x, point.y);
@@ -21291,7 +21320,7 @@
 
   @DomName('SpeechInputResult.confidence')
   @DocsEditable()
-  final num confidence;
+  final double confidence;
 
   @DomName('SpeechInputResult.utterance')
   @DocsEditable()
@@ -21452,7 +21481,7 @@
 
   @DomName('SpeechRecognitionAlternative.confidence')
   @DocsEditable()
-  final num confidence;
+  final double confidence;
 
   @DomName('SpeechRecognitionAlternative.transcript')
   @DocsEditable()
@@ -21598,7 +21627,7 @@
 
   @DomName('SpeechSynthesisEvent.elapsedTime')
   @DocsEditable()
-  final num elapsedTime;
+  final double elapsedTime;
 
   @DomName('SpeechSynthesisEvent.name')
   @DocsEditable()
@@ -22143,41 +22172,41 @@
   @DomName('SubtleCrypto.decrypt')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation decrypt(Map algorithm, CryptoKey key) {
+  Object decrypt(Map algorithm, CryptoKey key, TypedData data) {
     var algorithm_1 = convertDartToNative_Dictionary(algorithm);
-    return _decrypt_1(algorithm_1, key);
+    return _decrypt_1(algorithm_1, key, data);
   }
   @JSName('decrypt')
   @DomName('SubtleCrypto.decrypt')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation _decrypt_1(algorithm, CryptoKey key) native;
+  Object _decrypt_1(algorithm, CryptoKey key, TypedData data) native;
 
   @DomName('SubtleCrypto.digest')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation digest(Map algorithm) {
+  Object digest(Map algorithm, TypedData data) {
     var algorithm_1 = convertDartToNative_Dictionary(algorithm);
-    return _digest_1(algorithm_1);
+    return _digest_1(algorithm_1, data);
   }
   @JSName('digest')
   @DomName('SubtleCrypto.digest')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation _digest_1(algorithm) native;
+  Object _digest_1(algorithm, TypedData data) native;
 
   @DomName('SubtleCrypto.encrypt')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation encrypt(Map algorithm, CryptoKey key) {
+  Object encrypt(Map algorithm, CryptoKey key, TypedData data) {
     var algorithm_1 = convertDartToNative_Dictionary(algorithm);
-    return _encrypt_1(algorithm_1, key);
+    return _encrypt_1(algorithm_1, key, data);
   }
   @JSName('encrypt')
   @DomName('SubtleCrypto.encrypt')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation _encrypt_1(algorithm, CryptoKey key) native;
+  Object _encrypt_1(algorithm, CryptoKey key, TypedData data) native;
 
   @DomName('SubtleCrypto.generateKey')
   @DocsEditable()
@@ -22208,28 +22237,28 @@
   @DomName('SubtleCrypto.sign')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation sign(Map algorithm, CryptoKey key) {
+  Object sign(Map algorithm, CryptoKey key, TypedData data) {
     var algorithm_1 = convertDartToNative_Dictionary(algorithm);
-    return _sign_1(algorithm_1, key);
+    return _sign_1(algorithm_1, key, data);
   }
   @JSName('sign')
   @DomName('SubtleCrypto.sign')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation _sign_1(algorithm, CryptoKey key) native;
+  Object _sign_1(algorithm, CryptoKey key, TypedData data) native;
 
   @DomName('SubtleCrypto.verify')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation verify(Map algorithm, CryptoKey key, TypedData signature) {
+  Object verify(Map algorithm, CryptoKey key, TypedData signature, TypedData data) {
     var algorithm_1 = convertDartToNative_Dictionary(algorithm);
-    return _verify_1(algorithm_1, key, signature);
+    return _verify_1(algorithm_1, key, signature, data);
   }
   @JSName('verify')
   @DomName('SubtleCrypto.verify')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation _verify_1(algorithm, CryptoKey key, TypedData signature) native;
+  Object _verify_1(algorithm, CryptoKey key, TypedData signature, TypedData data) native;
 }
 // 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
@@ -22335,6 +22364,22 @@
   @JSName('createTBody')
   TableSectionElement _nativeCreateTBody() native;
 
+  DocumentFragment createFragment(String html,
+      {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+    if (Range.supportsCreateContextualFragment) {
+      return super.createFragment(
+          html, validator: validator, treeSanitizer: treeSanitizer);
+    }
+    // IE9 workaround which does not support innerHTML on Table elements.
+    var contextualHtml = '<table>$html</table>';
+    var table = new Element.html(contextualHtml, validator: validator,
+        treeSanitizer: treeSanitizer);
+    var fragment = new DocumentFragment();
+    fragment.nodes.addAll(table.nodes);
+
+    return fragment;
+  }
+
   // To suppress missing implicit constructor warnings.
   factory TableElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -22425,6 +22470,21 @@
 
   TableCellElement insertCell(int index) => _insertCell(index);
 
+  DocumentFragment createFragment(String html,
+      {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+    if (Range.supportsCreateContextualFragment) {
+      return super.createFragment(
+          html, validator: validator, treeSanitizer: treeSanitizer);
+    }
+    // IE9 workaround which does not support innerHTML on Table elements.
+    var fragment = new DocumentFragment();
+    var section = new TableElement().createFragment(
+        html, validator: validator, treeSanitizer: treeSanitizer).nodes.single;
+    var row = section.nodes.single;
+    fragment.nodes.addAll(row.nodes);
+    return fragment;
+  }
+
   // To suppress missing implicit constructor warnings.
   factory TableRowElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -22473,6 +22533,20 @@
 
   TableRowElement insertRow(int index) => _insertRow(index);
 
+  DocumentFragment createFragment(String html,
+      {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+    if (Range.supportsCreateContextualFragment) {
+      return super.createFragment(
+          html, validator: validator, treeSanitizer: treeSanitizer);
+    }
+    // IE9 workaround which does not support innerHTML on Table elements.
+    var fragment = new DocumentFragment();
+    var section = new TableElement().createFragment(
+        html, validator: validator, treeSanitizer: treeSanitizer).nodes.single;
+    fragment.nodes.addAll(section.nodes);
+    return fragment;
+  }
+
   // To suppress missing implicit constructor warnings.
   factory TableSectionElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -23032,7 +23106,7 @@
 
   @DomName('TextMetrics.width')
   @DocsEditable()
-  final num width;
+  final double width;
 }
 // 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
@@ -23340,11 +23414,11 @@
 
   @DomName('TimeRanges.end')
   @DocsEditable()
-  num end(int index) native;
+  double end(int index) native;
 
   @DomName('TimeRanges.start')
   @DocsEditable()
-  num start(int index) native;
+  double start(int index) native;
 }
 // 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
@@ -23429,7 +23503,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  final num force;
+  final double force;
 
   @JSName('webkitRadiusX')
   @DomName('Touch.webkitRadiusX')
@@ -23453,7 +23527,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  final num rotationAngle;
+  final double rotationAngle;
 
 
   @DomName('Touch.clientX')
@@ -23712,7 +23786,7 @@
 
   @DomName('TransitionEvent.elapsedTime')
   @DocsEditable()
-  final num elapsedTime;
+  final double elapsedTime;
 
   @DomName('TransitionEvent.propertyName')
   @DocsEditable()
@@ -24398,12 +24472,13 @@
           screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
           metaKey, button, relatedTarget, axis);
     } else {
+      // Chrome does an auto-convert to pixels.
+      deltaY = deltaY ~/ 120;
       // Fallthrough for Dartium.
       event._initMouseEvent(type, canBubble, cancelable, view, detail,
           screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
           metaKey, button, relatedTarget);
-      event._initWebKitWheelEvent(deltaX,
-          deltaY ~/ 120, // Chrome does an auto-convert to pixels.
+      event._initWebKitWheelEvent(deltaX, deltaY,
           view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
           metaKey);
     }
@@ -24426,6 +24501,23 @@
   @DocsEditable()
   static const int DOM_DELTA_PIXEL = 0x00;
 
+  @JSName('deltaX')
+  @DomName('WheelEvent.deltaX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double _deltaX;
+
+  @JSName('deltaY')
+  @DomName('WheelEvent.deltaY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double _deltaY;
+
+  @DomName('WheelEvent.deltaZ')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final double deltaZ;
+
   @JSName('webkitDirectionInvertedFromDevice')
   @DomName('WheelEvent.webkitDirectionInvertedFromDevice')
   @DocsEditable()
@@ -24524,8 +24616,6 @@
     return 0;
   }
 
-  num get _deltaY => JS('num', '#.deltaY', this);
-  num get _deltaX => JS('num', '#.deltaX', this);
   num get _wheelDelta => JS('num', '#.wheelDelta', this);
   num get _wheelDeltaX => JS('num', '#.wheelDeltaX', this);
   num get _detail => JS('num', '#.detail', this);
@@ -24604,7 +24694,7 @@
     if (portStr == null) {
       return null;
     }
-    var port = json.parse(portStr);
+    var port = JSON.decode(portStr);
     return _deserialize(port);
   }
 
@@ -24616,7 +24706,7 @@
   void registerPort(String name, var port) {
     var serialized = _serialize(port);
     document.documentElement.attributes['dart-port:$name'] =
-        json.stringify(serialized);
+        JSON.encode(serialized);
   }
 
   /**
@@ -24962,7 +25052,7 @@
   @DocsEditable()
   // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
   @Experimental() // non-standard
-  final num devicePixelRatio;
+  final double devicePixelRatio;
 
   @DomName('Window.event')
   @DocsEditable()
@@ -25191,6 +25281,12 @@
   @DocsEditable()
   bool confirm(String message) native;
 
+  @JSName('createImageBitmap')
+  @DomName('Window.createImageBitmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object _createImageBitmap(canvas_OR_context_OR_image_OR_video, [int sx, int sy, int sw, int sh]) native;
+
   @DomName('Window.find')
   @DocsEditable()
   @Experimental() // non-standard
@@ -25798,6 +25894,18 @@
 
 
 @DocsEditable()
+@DomName('WorkerConsole')
+@Experimental() // untriaged
+class WorkerConsole extends ConsoleBase native "WorkerConsole" {
+  // To suppress missing implicit constructor warnings.
+  factory WorkerConsole._() { throw new UnsupportedError("Not supported"); }
+}
+// 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
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
 @DomName('WorkerCrypto')
 @Experimental() // untriaged
 class WorkerCrypto extends Interceptor native "WorkerCrypto" {
@@ -25836,6 +25944,11 @@
   @Experimental() // untriaged
   static const int TEMPORARY = 0;
 
+  @DomName('WorkerGlobalScope.console')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final WorkerConsole console;
+
   @DomName('WorkerGlobalScope.crypto')
   @DocsEditable()
   @Experimental() // untriaged
@@ -25880,11 +25993,6 @@
   @Experimental() // untriaged
   void close() native;
 
-  @DomName('WorkerGlobalScope.importScripts')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void importScripts() native;
-
   @DomName('WorkerGlobalScope.openDatabase')
   @DocsEditable()
   @Experimental() // untriaged
@@ -26001,7 +26109,7 @@
   @DomName('WorkerPerformance.now')
   @DocsEditable()
   @Experimental() // untriaged
-  num now() native;
+  double now() native;
 }
 // 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
@@ -26125,7 +26233,7 @@
 
   @DomName('XPathResult.numberValue')
   @DocsEditable()
-  final num numberValue;
+  final double numberValue;
 
   @DomName('XPathResult.resultType')
   @DocsEditable()
@@ -26157,6 +26265,78 @@
 
 
 @DocsEditable()
+@DomName('XMLHttpRequestEventTarget')
+@Experimental() // untriaged
+class XmlHttpRequestEventTarget extends EventTarget native "XMLHttpRequestEventTarget" {
+  // To suppress missing implicit constructor warnings.
+  factory XmlHttpRequestEventTarget._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('XMLHttpRequestEventTarget.abortEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
+
+  @DomName('XMLHttpRequestEventTarget.errorEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<ProgressEvent> errorEvent = const EventStreamProvider<ProgressEvent>('error');
+
+  @DomName('XMLHttpRequestEventTarget.loadEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
+
+  @DomName('XMLHttpRequestEventTarget.loadendEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
+
+  @DomName('XMLHttpRequestEventTarget.loadstartEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
+
+  @DomName('XMLHttpRequestEventTarget.progressEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
+
+  @DomName('XMLHttpRequestEventTarget.onabort')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
+
+  @DomName('XMLHttpRequestEventTarget.onerror')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<ProgressEvent> get onError => errorEvent.forTarget(this);
+
+  @DomName('XMLHttpRequestEventTarget.onload')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
+
+  @DomName('XMLHttpRequestEventTarget.onloadend')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
+
+  @DomName('XMLHttpRequestEventTarget.onloadstart')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
+
+  @DomName('XMLHttpRequestEventTarget.onprogress')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
+}
+// 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
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
 @DomName('XMLSerializer')
 // http://domparsing.spec.whatwg.org/#the-xmlserializer-interface
 @deprecated // stable
@@ -26243,10 +26423,16 @@
   @DocsEditable()
   final bool isId;
 
+  // Use implementation from Node.
+  // final String _localName;
+
   @DomName('Attr.name')
   @DocsEditable()
   final String name;
 
+  // Use implementation from Node.
+  // final String _namespaceUri;
+
   @DomName('Attr.ownerElement')
   @DocsEditable()
   @deprecated // deprecated
@@ -26391,27 +26577,27 @@
 
   @DomName('ClientRect.bottom')
   @DocsEditable()
-  final num bottom;
+  final double bottom;
 
   @DomName('ClientRect.height')
   @DocsEditable()
-  final num height;
+  final double height;
 
   @DomName('ClientRect.left')
   @DocsEditable()
-  final num left;
+  final double left;
 
   @DomName('ClientRect.right')
   @DocsEditable()
-  final num right;
+  final double right;
 
   @DomName('ClientRect.top')
   @DocsEditable()
-  final num top;
+  final double top;
 
   @DomName('ClientRect.width')
   @DocsEditable()
-  final num width;
+  final double width;
 }
 // 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
@@ -27338,7 +27524,11 @@
 @DomName('WorkerNavigator')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workernavigator
 @Experimental()
-abstract class _WorkerNavigator extends Interceptor native "WorkerNavigator" {
+abstract class _WorkerNavigator extends Interceptor implements NavigatorOnLine, NavigatorID native "WorkerNavigator" {
+
+  // From NavigatorID
+
+  // From NavigatorOnLine
 }
 // 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
@@ -27433,15 +27623,15 @@
   }
 
   String operator [](String key) {
-    return _element.$dom_getAttribute(key);
+    return _element._getAttribute(key);
   }
 
   void operator []=(String key, String value) {
-    _element.$dom_setAttribute(key, value);
+    _element._setAttribute(key, value);
   }
 
   String remove(String key) {
-    String value = _element.$dom_getAttribute(key);
+    String value = _element._getAttribute(key);
     _element._removeAttribute(key);
     return value;
   }
@@ -27470,11 +27660,11 @@
   }
 
   String operator [](String key) {
-    return _element.$dom_getAttributeNS(_namespace, key);
+    return _element._getAttributeNS(_namespace, key);
   }
 
   void operator []=(String key, String value) {
-    _element.$dom_setAttributeNS(_namespace, key, value);
+    _element._setAttributeNS(_namespace, key, value);
   }
 
   String remove(String key) {
@@ -27624,7 +27814,7 @@
  * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
  * * [Window](http://www.w3.org/TR/Window/) from the W3C.
  */
-abstract class WindowBase {
+abstract class WindowBase implements EventTarget {
   // Fields.
 
   /**
@@ -29194,7 +29384,7 @@
     var source = '$target-result';
     var result = null;
     window.on[source].first.then((Event e) {
-      result = json.parse(_getPortSyncEventData(e));
+      result = JSON.decode(_getPortSyncEventData(e));
     });
     _dispatchEvent(target, [source, message]);
     return result;
@@ -29278,7 +29468,7 @@
     _callback = callback;
     if (_portSubscription == null) {
       _portSubscription = window.on[_listenerName].listen((Event e) {
-        var data = json.parse(_getPortSyncEventData(e));
+        var data = JSON.decode(_getPortSyncEventData(e));
         var replyTo = data[0];
         var message = _deserialize(data[1]);
         var result = _callback(message);
@@ -29309,7 +29499,7 @@
 
 void _dispatchEvent(String receiver, var message) {
   var event = new CustomEvent(receiver, canBubble: false, cancelable:false,
-    detail: json.stringify(message));
+    detail: JSON.encode(message));
   window.dispatchEvent(event);
 }
 
@@ -30750,6 +30940,21 @@
   }
 
   /**
+   * Allow inline styles on elements.
+   *
+   * If [tagName] is not specified then this allows inline styles on all
+   * elements. Otherwise tagName limits the styles to the specified elements.
+   */
+  void allowInlineStyles({String tagName}) {
+    if (tagName == null) {
+      tagName = '*';
+    } else {
+      tagName = tagName.toUpperCase();
+    }
+    add(new _SimpleNodeValidator(null, allowedAttributes: ['$tagName::style']));
+  }
+
+  /**
    * Allow common safe HTML5 elements and attributes.
    *
    * This list is based off of the Caja whitelists at:
@@ -32333,6 +32538,8 @@
         Element element = node;
         var attrs = element.attributes;
         if (!validator.allowsElement(element)) {
+          window.console.warn(
+              'Removing disallowed element <${element.tagName}>');
           element.remove();
           break;
         }
@@ -32340,6 +32547,8 @@
         var isAttr = attrs['is'];
         if (isAttr != null) {
           if (!validator.allowsAttribute(element, 'is', isAttr)) {
+            window.console.warn('Removing disallowed type extension '
+                '<${element.tagName} is="$isAttr">');
             element.remove();
             break;
           }
@@ -32352,6 +32561,8 @@
           var name = keys[i];
           if (!validator.allowsAttribute(element, name.toLowerCase(),
               attrs[name])) {
+            window.console.warn('Removing disallowed attribute '
+                '<${element.tagName} $name="${attrs[name]}">');
             attrs.remove(name);
           }
         }
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index bd228d2..bc54884 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -1,8 +1,27 @@
-/// The Dart HTML library.
-///
-/// For examples, see
-/// [Dart HTML5 Samples](https://github.com/dart-lang/dart-html5-samples)
-/// on Github.
+/**
+ * HTML elements and other resources for web-based applications that need to
+ * interact with the browser and the DOM (Document Object Model).
+ *
+ * This library includes DOM element types, CSS styling, local storage,
+ * media, speech, events, and more.
+ * To get started,
+ * check out the [Element] class, the base class for many of the HTML
+ * DOM types.
+ *
+ * ## Other resources
+ *
+ * * If you've never written a web app before, try our
+ * tutorials&mdash;[A Game of Darts](http://dartlang.org/docs/tutorials).
+ * 
+ * * To see some web-based Dart apps in action and to play with the code,
+ * download
+ * [Dart Editor](http://www.dartlang.org/#get-started)
+ * and run its built-in examples.
+ *
+ * * For even more examples, see
+ * [Dart HTML5 Samples](https://github.com/dart-lang/dart-html5-samples)
+ * on Github.
+ */
 library dart.dom.html;
 
 import 'dart:async';
@@ -11,7 +30,7 @@
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:isolate';
-import 'dart:json' as json;
+import "dart:convert";
 import 'dart:math';
 import 'dart:mirrors';
 import 'dart:nativewrappers';
@@ -84,7 +103,7 @@
 _callPortSync(num id, var message) {
   if (!_callPortInitialized) {
     window.on['js-result'].listen((event) {
-      _callPortLastResult = json.parse(_getPortSyncEventData(event));
+      _callPortLastResult = JSON.decode(_getPortSyncEventData(event));
     });
     _callPortInitialized = true;
   }
@@ -351,7 +370,7 @@
 
   @DomName('WebKitAnimationEvent.elapsedTime')
   @DocsEditable()
-  num get elapsedTime native "WebKitAnimationEvent_elapsedTime_Getter";
+  double get elapsedTime native "WebKitAnimationEvent_elapsedTime_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -362,7 +381,7 @@
 
 
 @DocsEditable()
-@DomName('DOMApplicationCache')
+@DomName('ApplicationCache')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE, '10')
@@ -373,122 +392,122 @@
   // To suppress missing implicit constructor warnings.
   factory ApplicationCache._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('DOMApplicationCache.cachedEvent')
+  @DomName('ApplicationCache.cachedEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> cachedEvent = const EventStreamProvider<Event>('cached');
 
-  @DomName('DOMApplicationCache.checkingEvent')
+  @DomName('ApplicationCache.checkingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> checkingEvent = const EventStreamProvider<Event>('checking');
 
-  @DomName('DOMApplicationCache.downloadingEvent')
+  @DomName('ApplicationCache.downloadingEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> downloadingEvent = const EventStreamProvider<Event>('downloading');
 
-  @DomName('DOMApplicationCache.errorEvent')
+  @DomName('ApplicationCache.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
-  @DomName('DOMApplicationCache.noupdateEvent')
+  @DomName('ApplicationCache.noupdateEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> noUpdateEvent = const EventStreamProvider<Event>('noupdate');
 
-  @DomName('DOMApplicationCache.obsoleteEvent')
+  @DomName('ApplicationCache.obsoleteEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> obsoleteEvent = const EventStreamProvider<Event>('obsolete');
 
-  @DomName('DOMApplicationCache.progressEvent')
+  @DomName('ApplicationCache.progressEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
-  @DomName('DOMApplicationCache.updatereadyEvent')
+  @DomName('ApplicationCache.updatereadyEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> updateReadyEvent = const EventStreamProvider<Event>('updateready');
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
-  @DomName('DOMApplicationCache.CHECKING')
+  @DomName('ApplicationCache.CHECKING')
   @DocsEditable()
   static const int CHECKING = 2;
 
-  @DomName('DOMApplicationCache.DOWNLOADING')
+  @DomName('ApplicationCache.DOWNLOADING')
   @DocsEditable()
   static const int DOWNLOADING = 3;
 
-  @DomName('DOMApplicationCache.IDLE')
+  @DomName('ApplicationCache.IDLE')
   @DocsEditable()
   static const int IDLE = 1;
 
-  @DomName('DOMApplicationCache.OBSOLETE')
+  @DomName('ApplicationCache.OBSOLETE')
   @DocsEditable()
   static const int OBSOLETE = 5;
 
-  @DomName('DOMApplicationCache.UNCACHED')
+  @DomName('ApplicationCache.UNCACHED')
   @DocsEditable()
   static const int UNCACHED = 0;
 
-  @DomName('DOMApplicationCache.UPDATEREADY')
+  @DomName('ApplicationCache.UPDATEREADY')
   @DocsEditable()
   static const int UPDATEREADY = 4;
 
-  @DomName('DOMApplicationCache.status')
+  @DomName('ApplicationCache.status')
   @DocsEditable()
-  int get status native "DOMApplicationCache_status_Getter";
+  int get status native "ApplicationCache_status_Getter";
 
-  @DomName('DOMApplicationCache.abort')
+  @DomName('ApplicationCache.abort')
   @DocsEditable()
-  void abort() native "DOMApplicationCache_abort_Callback";
+  void abort() native "ApplicationCache_abort_Callback";
 
-  @DomName('DOMApplicationCache.swapCache')
+  @DomName('ApplicationCache.swapCache')
   @DocsEditable()
-  void swapCache() native "DOMApplicationCache_swapCache_Callback";
+  void swapCache() native "ApplicationCache_swapCache_Callback";
 
-  @DomName('DOMApplicationCache.update')
+  @DomName('ApplicationCache.update')
   @DocsEditable()
-  void update() native "DOMApplicationCache_update_Callback";
+  void update() native "ApplicationCache_update_Callback";
 
-  @DomName('DOMApplicationCache.addEventListener')
+  @DomName('ApplicationCache.addEventListener')
   @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_addEventListener_Callback";
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "ApplicationCache_addEventListener_Callback";
 
-  @DomName('DOMApplicationCache.dispatchEvent')
+  @DomName('ApplicationCache.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) native "DOMApplicationCache_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) native "ApplicationCache_dispatchEvent_Callback";
 
-  @DomName('DOMApplicationCache.removeEventListener')
+  @DomName('ApplicationCache.removeEventListener')
   @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_removeEventListener_Callback";
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "ApplicationCache_removeEventListener_Callback";
 
-  @DomName('DOMApplicationCache.oncached')
+  @DomName('ApplicationCache.oncached')
   @DocsEditable()
   Stream<Event> get onCached => cachedEvent.forTarget(this);
 
-  @DomName('DOMApplicationCache.onchecking')
+  @DomName('ApplicationCache.onchecking')
   @DocsEditable()
   Stream<Event> get onChecking => checkingEvent.forTarget(this);
 
-  @DomName('DOMApplicationCache.ondownloading')
+  @DomName('ApplicationCache.ondownloading')
   @DocsEditable()
   Stream<Event> get onDownloading => downloadingEvent.forTarget(this);
 
-  @DomName('DOMApplicationCache.onerror')
+  @DomName('ApplicationCache.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
 
-  @DomName('DOMApplicationCache.onnoupdate')
+  @DomName('ApplicationCache.onnoupdate')
   @DocsEditable()
   Stream<Event> get onNoUpdate => noUpdateEvent.forTarget(this);
 
-  @DomName('DOMApplicationCache.onobsolete')
+  @DomName('ApplicationCache.onobsolete')
   @DocsEditable()
   Stream<Event> get onObsolete => obsoleteEvent.forTarget(this);
 
-  @DomName('DOMApplicationCache.onprogress')
+  @DomName('ApplicationCache.onprogress')
   @DocsEditable()
   Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
 
-  @DomName('DOMApplicationCache.onupdateready')
+  @DomName('ApplicationCache.onupdateready')
   @DocsEditable()
   Stream<Event> get onUpdateReady => updateReadyEvent.forTarget(this);
 
@@ -1473,7 +1492,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  num get backingStorePixelRatio native "CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter";
+  double get backingStorePixelRatio native "CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter";
 
   @DomName('CanvasRenderingContext2D.arc')
   @DocsEditable()
@@ -2204,106 +2223,132 @@
 
 @DocsEditable()
 @DomName('Console')
-class Console extends NativeFieldWrapperClass1 {
+class Console extends ConsoleBase {
+  // To suppress missing implicit constructor warnings.
+  factory Console._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('Console.memory')
   @DocsEditable()
   @Experimental()
   MemoryInfo get memory native "Console_memory_Getter";
 
-  @DomName('Console.assertCondition')
-  @DocsEditable()
-  @Experimental()
-  void assertCondition(bool condition, Object arg) native "Console_assertCondition_Callback";
+}
+// 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
+// BSD-style license that can be found in the LICENSE file.
 
-  @DomName('Console.clear')
-  @DocsEditable()
-  @Experimental()
-  void clear(Object arg) native "Console_clear_Callback";
+// WARNING: Do not edit - generated code.
 
-  @DomName('Console.count')
-  @DocsEditable()
-  @Experimental()
-  void count(Object arg) native "Console_count_Callback";
 
-  @DomName('Console.debug')
-  @DocsEditable()
-  @deprecated // deprecated
-  void debug(Object arg) native "Console_debug_Callback";
+@DocsEditable()
+@DomName('ConsoleBase')
+@Experimental() // untriaged
+class ConsoleBase extends NativeFieldWrapperClass1 {
 
-  @DomName('Console.dir')
+  @DomName('ConsoleBase.assertCondition')
   @DocsEditable()
-  void dir(Object arg) native "Console_dir_Callback";
+  @Experimental() // untriaged
+  void assertCondition(bool condition, Object arg) native "ConsoleBase_assertCondition_Callback";
 
-  @DomName('Console.dirxml')
+  @DomName('ConsoleBase.clear')
   @DocsEditable()
-  @Experimental()
-  void dirxml(Object arg) native "Console_dirxml_Callback";
+  @Experimental() // untriaged
+  void clear(Object arg) native "ConsoleBase_clear_Callback";
 
-  @DomName('Console.error')
+  @DomName('ConsoleBase.count')
   @DocsEditable()
-  void error(Object arg) native "Console_error_Callback";
+  @Experimental() // untriaged
+  void count(Object arg) native "ConsoleBase_count_Callback";
 
-  @DomName('Console.group')
+  @DomName('ConsoleBase.debug')
   @DocsEditable()
-  void group(Object arg) native "Console_group_Callback";
+  @Experimental() // untriaged
+  void debug(Object arg) native "ConsoleBase_debug_Callback";
 
-  @DomName('Console.groupCollapsed')
+  @DomName('ConsoleBase.dir')
   @DocsEditable()
-  void groupCollapsed(Object arg) native "Console_groupCollapsed_Callback";
+  @Experimental() // untriaged
+  void dir(Object arg) native "ConsoleBase_dir_Callback";
 
-  @DomName('Console.groupEnd')
+  @DomName('ConsoleBase.dirxml')
   @DocsEditable()
-  void groupEnd() native "Console_groupEnd_Callback";
+  @Experimental() // untriaged
+  void dirxml(Object arg) native "ConsoleBase_dirxml_Callback";
 
-  @DomName('Console.info')
+  @DomName('ConsoleBase.error')
   @DocsEditable()
-  void info(Object arg) native "Console_info_Callback";
+  @Experimental() // untriaged
+  void error(Object arg) native "ConsoleBase_error_Callback";
 
-  @DomName('Console.log')
+  @DomName('ConsoleBase.group')
   @DocsEditable()
-  void log(Object arg) native "Console_log_Callback";
+  @Experimental() // untriaged
+  void group(Object arg) native "ConsoleBase_group_Callback";
 
-  @DomName('Console.markTimeline')
+  @DomName('ConsoleBase.groupCollapsed')
   @DocsEditable()
-  @Experimental()
-  void markTimeline(Object arg) native "Console_markTimeline_Callback";
+  @Experimental() // untriaged
+  void groupCollapsed(Object arg) native "ConsoleBase_groupCollapsed_Callback";
 
-  @DomName('Console.profile')
+  @DomName('ConsoleBase.groupEnd')
   @DocsEditable()
-  @Experimental()
-  void profile(String title) native "Console_profile_Callback";
+  @Experimental() // untriaged
+  void groupEnd() native "ConsoleBase_groupEnd_Callback";
 
-  @DomName('Console.profileEnd')
+  @DomName('ConsoleBase.info')
   @DocsEditable()
-  @Experimental()
-  void profileEnd(String title) native "Console_profileEnd_Callback";
+  @Experimental() // untriaged
+  void info(Object arg) native "ConsoleBase_info_Callback";
 
-  @DomName('Console.table')
+  @DomName('ConsoleBase.log')
   @DocsEditable()
-  @Experimental()
-  void table(Object arg) native "Console_table_Callback";
+  @Experimental() // untriaged
+  void log(Object arg) native "ConsoleBase_log_Callback";
 
-  @DomName('Console.time')
+  @DomName('ConsoleBase.markTimeline')
   @DocsEditable()
-  void time(String title) native "Console_time_Callback";
+  @Experimental() // untriaged
+  void markTimeline(Object arg) native "ConsoleBase_markTimeline_Callback";
 
-  @DomName('Console.timeEnd')
+  @DomName('ConsoleBase.profile')
   @DocsEditable()
-  void timeEnd(String title) native "Console_timeEnd_Callback";
+  @Experimental() // untriaged
+  void profile(String title) native "ConsoleBase_profile_Callback";
 
-  @DomName('Console.timeStamp')
+  @DomName('ConsoleBase.profileEnd')
   @DocsEditable()
-  @Experimental()
-  void timeStamp(Object arg) native "Console_timeStamp_Callback";
+  @Experimental() // untriaged
+  void profileEnd(String title) native "ConsoleBase_profileEnd_Callback";
 
-  @DomName('Console.trace')
+  @DomName('ConsoleBase.table')
   @DocsEditable()
-  void trace(Object arg) native "Console_trace_Callback";
+  @Experimental() // untriaged
+  void table(Object arg) native "ConsoleBase_table_Callback";
 
-  @DomName('Console.warn')
+  @DomName('ConsoleBase.time')
   @DocsEditable()
-  void warn(Object arg) native "Console_warn_Callback";
+  @Experimental() // untriaged
+  void time(String title) native "ConsoleBase_time_Callback";
+
+  @DomName('ConsoleBase.timeEnd')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void timeEnd(String title) native "ConsoleBase_timeEnd_Callback";
+
+  @DomName('ConsoleBase.timeStamp')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void timeStamp(Object arg) native "ConsoleBase_timeStamp_Callback";
+
+  @DomName('ConsoleBase.trace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void trace(Object arg) native "ConsoleBase_trace_Callback";
+
+  @DomName('ConsoleBase.warn')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void warn(Object arg) native "ConsoleBase_warn_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2363,31 +2408,31 @@
 
   @DomName('Coordinates.accuracy')
   @DocsEditable()
-  num get accuracy native "Coordinates_accuracy_Getter";
+  double get accuracy native "Coordinates_accuracy_Getter";
 
   @DomName('Coordinates.altitude')
   @DocsEditable()
-  num get altitude native "Coordinates_altitude_Getter";
+  double get altitude native "Coordinates_altitude_Getter";
 
   @DomName('Coordinates.altitudeAccuracy')
   @DocsEditable()
-  num get altitudeAccuracy native "Coordinates_altitudeAccuracy_Getter";
+  double get altitudeAccuracy native "Coordinates_altitudeAccuracy_Getter";
 
   @DomName('Coordinates.heading')
   @DocsEditable()
-  num get heading native "Coordinates_heading_Getter";
+  double get heading native "Coordinates_heading_Getter";
 
   @DomName('Coordinates.latitude')
   @DocsEditable()
-  num get latitude native "Coordinates_latitude_Getter";
+  double get latitude native "Coordinates_latitude_Getter";
 
   @DomName('Coordinates.longitude')
   @DocsEditable()
-  num get longitude native "Coordinates_longitude_Getter";
+  double get longitude native "Coordinates_longitude_Getter";
 
   @DomName('Coordinates.speed')
   @DocsEditable()
-  num get speed native "Coordinates_speed_Getter";
+  double get speed native "Coordinates_speed_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2459,44 +2504,6 @@
 
 
 @DocsEditable()
-@DomName('CryptoOperation')
-@Experimental() // untriaged
-class CryptoOperation extends NativeFieldWrapperClass1 {
-
-  @DomName('CryptoOperation.algorithm')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Algorithm get algorithm native "CryptoOperation_algorithm_Getter";
-
-  @DomName('CryptoOperation.abort')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Object abort() native "CryptoOperation_abort_Callback";
-
-  @DomName('CryptoOperation.finish')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Object finish() native "CryptoOperation_finish_Callback";
-
-  @DomName('CryptoOperation.processByteBuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
-  CryptoOperation processByteBuffer(ByteBuffer data) native "CryptoOperation_processByteBuffer_Callback";
-
-  @DomName('CryptoOperation.processTypedData')
-  @DocsEditable()
-  @Experimental() // untriaged
-  CryptoOperation processTypedData(TypedData data) native "CryptoOperation_processTypedData_Callback";
-
-}
-// 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
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('CSS')
 // http://www.w3.org/TR/css3-conditional/#the-css-interface
 @Experimental() // None
@@ -2737,71 +2744,76 @@
 
 
 @DocsEditable()
-@DomName('WebKitCSSKeyframeRule')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
-// http://www.w3.org/TR/css3-animations/#CSSKeyframeRule-interface
+@DomName('CSSKeyframeRule')
+@Experimental() // untriaged
 class CssKeyframeRule extends CssRule {
   // To suppress missing implicit constructor warnings.
   factory CssKeyframeRule._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('WebKitCSSKeyframeRule.keyText')
+  @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
-  String get keyText native "WebKitCSSKeyframeRule_keyText_Getter";
+  @Experimental() // untriaged
+  String get keyText native "CSSKeyframeRule_keyText_Getter";
 
-  @DomName('WebKitCSSKeyframeRule.keyText')
+  @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
-  void set keyText(String value) native "WebKitCSSKeyframeRule_keyText_Setter";
+  @Experimental() // untriaged
+  void set keyText(String value) native "CSSKeyframeRule_keyText_Setter";
 
-  @DomName('WebKitCSSKeyframeRule.style')
+  @DomName('CSSKeyframeRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style native "WebKitCSSKeyframeRule_style_Getter";
+  @Experimental() // untriaged
+  CssStyleDeclaration get style native "CSSKeyframeRule_style_Getter";
 
 }
 // 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
 // BSD-style license that can be found in the LICENSE file.
 
+// WARNING: Do not edit - generated code.
+
 
 @DocsEditable()
-@DomName('WebKitCSSKeyframesRule')
-@SupportedBrowser(SupportedBrowser.CHROME)
-@SupportedBrowser(SupportedBrowser.SAFARI)
-@Experimental()
-// http://www.w3.org/TR/css3-animations/#csskeyframesrule
+@DomName('CSSKeyframesRule')
+@Experimental() // untriaged
 class CssKeyframesRule extends CssRule {
   // To suppress missing implicit constructor warnings.
   factory CssKeyframesRule._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('WebKitCSSKeyframesRule.cssRules')
+  @DomName('CSSKeyframesRule.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules native "WebKitCSSKeyframesRule_cssRules_Getter";
+  @Experimental() // untriaged
+  List<CssRule> get cssRules native "CSSKeyframesRule_cssRules_Getter";
 
-  @DomName('WebKitCSSKeyframesRule.name')
+  @DomName('CSSKeyframesRule.name')
   @DocsEditable()
-  String get name native "WebKitCSSKeyframesRule_name_Getter";
+  @Experimental() // untriaged
+  String get name native "CSSKeyframesRule_name_Getter";
 
-  @DomName('WebKitCSSKeyframesRule.name')
+  @DomName('CSSKeyframesRule.name')
   @DocsEditable()
-  void set name(String value) native "WebKitCSSKeyframesRule_name_Setter";
+  @Experimental() // untriaged
+  void set name(String value) native "CSSKeyframesRule_name_Setter";
 
-  @DomName('WebKitCSSKeyframesRule.__getter__')
+  @DomName('CSSKeyframesRule.__getter__')
   @DocsEditable()
-  CssKeyframeRule __getter__(int index) native "WebKitCSSKeyframesRule___getter___Callback";
+  @Experimental() // untriaged
+  CssKeyframeRule __getter__(int index) native "CSSKeyframesRule___getter___Callback";
 
-  @DomName('WebKitCSSKeyframesRule.deleteRule')
+  @DomName('CSSKeyframesRule.deleteRule')
   @DocsEditable()
-  void deleteRule(String key) native "WebKitCSSKeyframesRule_deleteRule_Callback";
+  @Experimental() // untriaged
+  void deleteRule(String key) native "CSSKeyframesRule_deleteRule_Callback";
 
-  @DomName('WebKitCSSKeyframesRule.findRule')
+  @DomName('CSSKeyframesRule.findRule')
   @DocsEditable()
-  CssKeyframeRule findRule(String key) native "WebKitCSSKeyframesRule_findRule_Callback";
+  @Experimental() // untriaged
+  CssKeyframeRule findRule(String key) native "CSSKeyframesRule_findRule_Callback";
 
-  @DomName('WebKitCSSKeyframesRule.insertRule')
+  @DomName('CSSKeyframesRule.insertRule')
   @DocsEditable()
-  void appendRule(String rule) native "WebKitCSSKeyframesRule_insertRule_Callback";
-
+  @Experimental() // untriaged
+  void insertRule(String rule) native "CSSKeyframesRule_insertRule_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3175,6 +3187,16 @@
   @DocsEditable()
   static const int IMPORT_RULE = 3;
 
+  @DomName('CSSRule.KEYFRAMES_RULE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int KEYFRAMES_RULE = 7;
+
+  @DomName('CSSRule.KEYFRAME_RULE')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int KEYFRAME_RULE = 8;
+
   @DomName('CSSRule.MEDIA_RULE')
   @DocsEditable()
   static const int MEDIA_RULE = 4;
@@ -7027,37 +7049,41 @@
   @DocsEditable()
   int get length native "DataTransferItemList_length_Getter";
 
-  void add(data_OR_file, [String type]) {
+  @DomName('DataTransferItemList.__getter__')
+  @DocsEditable()
+  @Experimental() // untriaged
+  DataTransferItem __getter__(int index) native "DataTransferItemList___getter___Callback";
+
+  DataTransferItem add(data_OR_file, [String type]) {
     if ((data_OR_file is File || data_OR_file == null) && type == null) {
-      _add_1(data_OR_file);
-      return;
+      return _add_1(data_OR_file);
     }
     if ((type is String || type == null) && (data_OR_file is String || data_OR_file == null)) {
-      _add_2(data_OR_file, type);
-      return;
+      return _add_2(data_OR_file, type);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void _add_1(data_OR_file) native "DataTransferItemList__add_1_Callback";
+  DataTransferItem _add_1(data_OR_file) native "DataTransferItemList__add_1_Callback";
 
-  void _add_2(data_OR_file, type) native "DataTransferItemList__add_2_Callback";
+  DataTransferItem _add_2(data_OR_file, type) native "DataTransferItemList__add_2_Callback";
 
   @DomName('DataTransferItemList.addData')
   @DocsEditable()
-  void addData(String data, String type) native "DataTransferItemList_addData_Callback";
+  DataTransferItem addData(String data, String type) native "DataTransferItemList_addData_Callback";
 
   @DomName('DataTransferItemList.addFile')
   @DocsEditable()
-  void addFile(File file) native "DataTransferItemList_addFile_Callback";
+  DataTransferItem addFile(File file) native "DataTransferItemList_addFile_Callback";
 
   @DomName('DataTransferItemList.clear')
   @DocsEditable()
   void clear() native "DataTransferItemList_clear_Callback";
 
-  @DomName('DataTransferItemList.item')
+  @DomName('DataTransferItemList.remove')
   @DocsEditable()
-  DataTransferItem item(int index) native "DataTransferItemList_item_Callback";
+  @Experimental() // untriaged
+  void remove(int index) native "DataTransferItemList_remove_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7148,15 +7174,15 @@
 
   @DomName('DeviceAcceleration.x')
   @DocsEditable()
-  num get x native "DeviceAcceleration_x_Getter";
+  double get x native "DeviceAcceleration_x_Getter";
 
   @DomName('DeviceAcceleration.y')
   @DocsEditable()
-  num get y native "DeviceAcceleration_y_Getter";
+  double get y native "DeviceAcceleration_y_Getter";
 
   @DomName('DeviceAcceleration.z')
   @DocsEditable()
-  num get z native "DeviceAcceleration_z_Getter";
+  double get z native "DeviceAcceleration_z_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7184,7 +7210,7 @@
 
   @DomName('DeviceMotionEvent.interval')
   @DocsEditable()
-  num get interval native "DeviceMotionEvent_interval_Getter";
+  double get interval native "DeviceMotionEvent_interval_Getter";
 
   @DomName('DeviceMotionEvent.rotationRate')
   @DocsEditable()
@@ -7218,15 +7244,15 @@
 
   @DomName('DeviceOrientationEvent.alpha')
   @DocsEditable()
-  num get alpha native "DeviceOrientationEvent_alpha_Getter";
+  double get alpha native "DeviceOrientationEvent_alpha_Getter";
 
   @DomName('DeviceOrientationEvent.beta')
   @DocsEditable()
-  num get beta native "DeviceOrientationEvent_beta_Getter";
+  double get beta native "DeviceOrientationEvent_beta_Getter";
 
   @DomName('DeviceOrientationEvent.gamma')
   @DocsEditable()
-  num get gamma native "DeviceOrientationEvent_gamma_Getter";
+  double get gamma native "DeviceOrientationEvent_gamma_Getter";
 
   @DomName('DeviceOrientationEvent.initDeviceOrientationEvent')
   @DocsEditable()
@@ -7248,15 +7274,15 @@
 
   @DomName('DeviceRotationRate.alpha')
   @DocsEditable()
-  num get alpha native "DeviceRotationRate_alpha_Getter";
+  double get alpha native "DeviceRotationRate_alpha_Getter";
 
   @DomName('DeviceRotationRate.beta')
   @DocsEditable()
-  num get beta native "DeviceRotationRate_beta_Getter";
+  double get beta native "DeviceRotationRate_beta_Getter";
 
   @DomName('DeviceRotationRate.gamma')
   @DocsEditable()
-  num get gamma native "DeviceRotationRate_gamma_Getter";
+  double get gamma native "DeviceRotationRate_gamma_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7734,7 +7760,7 @@
 
   @DomName('Document.createRange')
   @DocsEditable()
-  Range $dom_createRange() native "Document_createRange_Callback";
+  Range createRange() native "Document_createRange_Callback";
 
   @DomName('Document.createTextNode')
   @DocsEditable()
@@ -10085,7 +10111,7 @@
     }
     var fragment;
     if (Range.supportsCreateContextualFragment) {
-      var range = _parseDocument.$dom_createRange();
+      var range = _parseDocument.createRange();
       range.selectNodeContents(contextElement);
       fragment = range.createContextualFragment(html);
     } else {
@@ -10460,6 +10486,16 @@
   @DocsEditable()
   void set id(String value) native "Element_id_Setter";
 
+  @DomName('Element.localName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get _localName native "Element_localName_Getter";
+
+  @DomName('Element.namespaceURI')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get _namespaceUri native "Element_namespaceURI_Getter";
+
   @DomName('Element.offsetHeight')
   @DocsEditable()
   int get offsetHeight native "Element_offsetHeight_Getter";
@@ -10553,11 +10589,11 @@
 
   @DomName('Element.getAttribute')
   @DocsEditable()
-  String $dom_getAttribute(String name) native "Element_getAttribute_Callback";
+  String _getAttribute(String name) native "Element_getAttribute_Callback";
 
   @DomName('Element.getAttributeNS')
   @DocsEditable()
-  String $dom_getAttributeNS(String namespaceURI, String localName) native "Element_getAttributeNS_Callback";
+  String _getAttributeNS(String namespaceURI, String localName) native "Element_getAttributeNS_Callback";
 
   @DomName('Element.getBoundingClientRect')
   @DocsEditable()
@@ -10657,11 +10693,11 @@
 
   @DomName('Element.setAttribute')
   @DocsEditable()
-  void $dom_setAttribute(String name, String value) native "Element_setAttribute_Callback";
+  void _setAttribute(String name, String value) native "Element_setAttribute_Callback";
 
   @DomName('Element.setAttributeNS')
   @DocsEditable()
-  void $dom_setAttributeNS(String namespaceURI, String qualifiedName, String value) native "Element_setAttributeNS_Callback";
+  void _setAttributeNS(String namespaceURI, String qualifiedName, String value) native "Element_setAttributeNS_Callback";
 
   @DomName('Element.webkitGetRegionFlowRanges')
   @DocsEditable()
@@ -11814,7 +11850,9 @@
 @DomName('FileError')
 // http://dev.w3.org/2009/dap/file-system/pub/FileSystem/
 @Experimental()
-class FileError extends NativeFieldWrapperClass1 {
+class FileError extends DomError {
+  // To suppress missing implicit constructor warnings.
+  factory FileError._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('FileError.ABORT_ERR')
   @DocsEditable()
@@ -12867,6 +12905,31 @@
 
 
 @DocsEditable()
+@DomName('HmacKeyParams')
+@Experimental() // untriaged
+class HmacKeyParams extends Algorithm {
+  // To suppress missing implicit constructor warnings.
+  factory HmacKeyParams._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('HmacKeyParams.hash')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Algorithm get hash native "HmacKeyParams_hash_Getter";
+
+  @DomName('HmacKeyParams.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length native "HmacKeyParams_length_Getter";
+
+}
+// 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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('HmacParams')
 @Experimental() // untriaged
 class HmacParams extends Algorithm {
@@ -13446,7 +13509,7 @@
  * * [Using XMLHttpRequest](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest)
  */
 @DomName('XMLHttpRequest')
-class HttpRequest extends EventTarget {
+class HttpRequest extends XmlHttpRequestEventTarget {
 
   /**
    * Creates a URL get request for the specified [url].
@@ -13636,30 +13699,6 @@
   // To suppress missing implicit constructor warnings.
   factory HttpRequest._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('XMLHttpRequest.abortEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
-
-  @DomName('XMLHttpRequest.errorEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> errorEvent = const EventStreamProvider<ProgressEvent>('error');
-
-  @DomName('XMLHttpRequest.loadEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
-
-  @DomName('XMLHttpRequest.loadendEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
-
-  @DomName('XMLHttpRequest.loadstartEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
-
-  @DomName('XMLHttpRequest.progressEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
-
   @DomName('XMLHttpRequest.readystatechangeEvent')
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> readyStateChangeEvent = const EventStreamProvider<ProgressEvent>('readystatechange');
@@ -13940,77 +13979,6 @@
   @DocsEditable()
   void setRequestHeader(String header, String value) native "XMLHttpRequest_setRequestHeader_Callback";
 
-  @DomName('XMLHttpRequest.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_addEventListener_Callback";
-
-  @DomName('XMLHttpRequest.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native "XMLHttpRequest_dispatchEvent_Callback";
-
-  @DomName('XMLHttpRequest.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_removeEventListener_Callback";
-
-  /**
-   * Event listeners to be notified when request has been aborted,
-   * generally due to calling `httpRequest.abort()`.
-   */
-  @DomName('XMLHttpRequest.onabort')
-  @DocsEditable()
-  Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
-
-  /**
-   * Event listeners to be notified when a request has failed, such as when a
-   * cross-domain error occurred or the file wasn't found on the server.
-   */
-  @DomName('XMLHttpRequest.onerror')
-  @DocsEditable()
-  Stream<ProgressEvent> get onError => errorEvent.forTarget(this);
-
-  /**
-   * Event listeners to be notified once the request has completed
-   * *successfully*.
-   */
-  @DomName('XMLHttpRequest.onload')
-  @DocsEditable()
-  Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
-
-  /**
-   * Event listeners to be notified once the request has completed (on
-   * either success or failure).
-   */
-  @DomName('XMLHttpRequest.onloadend')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.FIREFOX)
-  @SupportedBrowser(SupportedBrowser.IE, '10')
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
-
-  /**
-   * Event listeners to be notified when the request starts, once
-   * `httpRequest.send()` has been called.
-   */
-  @DomName('XMLHttpRequest.onloadstart')
-  @DocsEditable()
-  Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
-
-  /**
-   * Event listeners to be notified when data for the request
-   * is being sent or loaded.
-   *
-   * Progress events are fired every 50ms or for every byte transmitted,
-   * whichever is less frequent.
-   */
-  @DomName('XMLHttpRequest.onprogress')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.FIREFOX)
-  @SupportedBrowser(SupportedBrowser.IE, '10')
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
-
   /**
    * Event listeners to be notified every time the [HttpRequest]
    * object's `readyState` changes values.
@@ -14060,70 +14028,10 @@
 @DomName('XMLHttpRequestUpload')
 // http://xhr.spec.whatwg.org/#xmlhttprequestupload
 @Experimental()
-class HttpRequestUpload extends EventTarget {
+class HttpRequestUpload extends XmlHttpRequestEventTarget {
   // To suppress missing implicit constructor warnings.
   factory HttpRequestUpload._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('XMLHttpRequestUpload.abortEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
-
-  @DomName('XMLHttpRequestUpload.errorEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> errorEvent = const EventStreamProvider<ProgressEvent>('error');
-
-  @DomName('XMLHttpRequestUpload.loadEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
-
-  @DomName('XMLHttpRequestUpload.loadendEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
-
-  @DomName('XMLHttpRequestUpload.loadstartEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
-
-  @DomName('XMLHttpRequestUpload.progressEvent')
-  @DocsEditable()
-  static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
-
-  @DomName('XMLHttpRequestUpload.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestUpload_addEventListener_Callback";
-
-  @DomName('XMLHttpRequestUpload.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native "XMLHttpRequestUpload_dispatchEvent_Callback";
-
-  @DomName('XMLHttpRequestUpload.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestUpload_removeEventListener_Callback";
-
-  @DomName('XMLHttpRequestUpload.onabort')
-  @DocsEditable()
-  Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
-
-  @DomName('XMLHttpRequestUpload.onerror')
-  @DocsEditable()
-  Stream<ProgressEvent> get onError => errorEvent.forTarget(this);
-
-  @DomName('XMLHttpRequestUpload.onload')
-  @DocsEditable()
-  Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
-
-  @DomName('XMLHttpRequestUpload.onloadend')
-  @DocsEditable()
-  Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
-
-  @DomName('XMLHttpRequestUpload.onloadstart')
-  @DocsEditable()
-  Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
-
-  @DomName('XMLHttpRequestUpload.onprogress')
-  @DocsEditable()
-  Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
-
 }
 // 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
@@ -16076,7 +15984,7 @@
 
   @DomName('MediaController.duration')
   @DocsEditable()
-  num get duration native "MediaController_duration_Getter";
+  double get duration native "MediaController_duration_Getter";
 
   @DomName('MediaController.muted')
   @DocsEditable()
@@ -16369,7 +16277,7 @@
 
   @DomName('HTMLMediaElement.duration')
   @DocsEditable()
-  num get duration native "HTMLMediaElement_duration_Getter";
+  double get duration native "HTMLMediaElement_duration_Getter";
 
   @DomName('HTMLMediaElement.ended')
   @DocsEditable()
@@ -16383,7 +16291,7 @@
   @DocsEditable()
   // http://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-media-initialtime
   @Experimental()
-  num get initialTime native "HTMLMediaElement_initialTime_Getter";
+  double get initialTime native "HTMLMediaElement_initialTime_Getter";
 
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
@@ -16472,7 +16380,7 @@
   @DomName('HTMLMediaElement.startTime')
   @DocsEditable()
   @Experimental() // non-standard
-  num get startTime native "HTMLMediaElement_startTime_Getter";
+  double get startTime native "HTMLMediaElement_startTime_Getter";
 
   @DomName('HTMLMediaElement.textTracks')
   @DocsEditable()
@@ -17489,13 +17397,6 @@
 @Unstable()
 class MessageChannel extends NativeFieldWrapperClass1 {
 
-  @DomName('MessageChannel.MessageChannel')
-  @DocsEditable()
-  factory MessageChannel() => _create();
-
-  @DocsEditable()
-  static MessageChannel _create() native "MessageChannel_constructorCallback";
-
   @DomName('MessageChannel.port1')
   @DocsEditable()
   MessagePort get port1 native "MessageChannel_port1_Getter";
@@ -17549,7 +17450,7 @@
 
   @DomName('MessageEvent.source')
   @DocsEditable()
-  WindowBase get source native "MessageEvent_source_Getter";
+  EventTarget get source native "MessageEvent_source_Getter";
 
   @DomName('MessageEvent.initMessageEvent')
   @DocsEditable()
@@ -17891,7 +17792,7 @@
 
   @DomName('MIDIMessageEvent.receivedTime')
   @DocsEditable()
-  num get receivedTime native "MIDIMessageEvent_receivedTime_Getter";
+  double get receivedTime native "MIDIMessageEvent_receivedTime_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18562,7 +18463,7 @@
 
 
 @DomName('Navigator')
-class Navigator extends NativeFieldWrapperClass1 {
+class Navigator extends NativeFieldWrapperClass1 implements NavigatorOnLine, NavigatorID {
 
 
   /**
@@ -18626,14 +18527,6 @@
   @Experimental() // non-standard
   String get appCodeName native "Navigator_appCodeName_Getter";
 
-  @DomName('Navigator.appName')
-  @DocsEditable()
-  String get appName native "Navigator_appName_Getter";
-
-  @DomName('Navigator.appVersion')
-  @DocsEditable()
-  String get appVersion native "Navigator_appVersion_Getter";
-
   @DomName('Navigator.cookieEnabled')
   @DocsEditable()
   @Unstable()
@@ -18659,15 +18552,6 @@
   @Experimental() // nonstandard
   MimeTypeArray get mimeTypes native "Navigator_mimeTypes_Getter";
 
-  @DomName('Navigator.onLine')
-  @DocsEditable()
-  @Unstable()
-  bool get onLine native "Navigator_onLine_Getter";
-
-  @DomName('Navigator.platform')
-  @DocsEditable()
-  String get platform native "Navigator_platform_Getter";
-
   @DomName('Navigator.plugins')
   @DocsEditable()
   @deprecated // nonstandard
@@ -18683,10 +18567,6 @@
   @Unstable()
   String get productSub native "Navigator_productSub_Getter";
 
-  @DomName('Navigator.userAgent')
-  @DocsEditable()
-  String get userAgent native "Navigator_userAgent_Getter";
-
   @DomName('Navigator.vendor')
   @DocsEditable()
   @Unstable()
@@ -18748,6 +18628,78 @@
   @Experimental()
   void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, [_NavigatorUserMediaErrorCallback errorCallback]) native "Navigator_webkitGetUserMedia_Callback";
 
+  @DomName('Navigator.appName')
+  @DocsEditable()
+  String get appName native "Navigator_appName_Getter";
+
+  @DomName('Navigator.appVersion')
+  @DocsEditable()
+  String get appVersion native "Navigator_appVersion_Getter";
+
+  @DomName('Navigator.platform')
+  @DocsEditable()
+  String get platform native "Navigator_platform_Getter";
+
+  @DomName('Navigator.userAgent')
+  @DocsEditable()
+  String get userAgent native "Navigator_userAgent_Getter";
+
+  @DomName('Navigator.onLine')
+  @DocsEditable()
+  @Unstable()
+  bool get onLine native "Navigator_onLine_Getter";
+
+}
+// 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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('NavigatorID')
+@Experimental() // untriaged
+abstract class NavigatorID extends NativeFieldWrapperClass1 {
+
+  @DomName('NavigatorID.appName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get appName native "NavigatorID_appName_Getter";
+
+  @DomName('NavigatorID.appVersion')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get appVersion native "NavigatorID_appVersion_Getter";
+
+  @DomName('NavigatorID.platform')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get platform native "NavigatorID_platform_Getter";
+
+  @DomName('NavigatorID.userAgent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get userAgent native "NavigatorID_userAgent_Getter";
+
+}
+// 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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('NavigatorOnLine')
+@Experimental() // untriaged
+abstract class NavigatorOnLine extends NativeFieldWrapperClass1 {
+
+  @DomName('NavigatorOnLine.onLine')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get onLine native "NavigatorOnLine_onLine_Getter";
+
 }
 // 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
@@ -18924,7 +18876,7 @@
     _this._replaceChild(value, this[index]);
   }
 
-  Iterator<Node> get iterator => _this.$dom_childNodes.iterator;
+  Iterator<Node> get iterator => _this._childNodes.iterator;
 
   // From List<Node>:
 
@@ -18946,15 +18898,15 @@
   // -- end List<Node> mixins.
 
   // TODO(jacobr): benchmark whether this is more efficient or whether caching
-  // a local copy of $dom_childNodes is more efficient.
-  int get length => _this.$dom_childNodes.length;
+  // a local copy of _childNodes is more efficient.
+  int get length => _this._childNodes.length;
 
   void set length(int value) {
     throw new UnsupportedError(
         "Cannot set length on immutable List.");
   }
 
-  Node operator[](int index) => _this.$dom_childNodes[index];
+  Node operator[](int index) => _this._childNodes[index];
 }
 
 /** Information about the instantiated template. */
@@ -19150,7 +19102,7 @@
 
   @DomName('Node.childNodes')
   @DocsEditable()
-  List<Node> get $dom_childNodes native "Node_childNodes_Getter";
+  List<Node> get _childNodes native "Node_childNodes_Getter";
 
   @DomName('Node.firstChild')
   @DocsEditable()
@@ -20312,7 +20264,7 @@
 
   @DomName('Performance.now')
   @DocsEditable()
-  num now() native "Performance_now_Callback";
+  double now() native "Performance_now_Callback";
 
   @DomName('Performance.webkitClearResourceTimings')
   @DocsEditable()
@@ -20361,7 +20313,7 @@
 
   @DomName('PerformanceEntry.duration')
   @DocsEditable()
-  num get duration native "PerformanceEntry_duration_Getter";
+  double get duration native "PerformanceEntry_duration_Getter";
 
   @DomName('PerformanceEntry.entryType')
   @DocsEditable()
@@ -20373,7 +20325,7 @@
 
   @DomName('PerformanceEntry.startTime')
   @DocsEditable()
-  num get startTime native "PerformanceEntry_startTime_Getter";
+  double get startTime native "PerformanceEntry_startTime_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20462,23 +20414,23 @@
 
   @DomName('PerformanceResourceTiming.connectEnd')
   @DocsEditable()
-  num get connectEnd native "PerformanceResourceTiming_connectEnd_Getter";
+  double get connectEnd native "PerformanceResourceTiming_connectEnd_Getter";
 
   @DomName('PerformanceResourceTiming.connectStart')
   @DocsEditable()
-  num get connectStart native "PerformanceResourceTiming_connectStart_Getter";
+  double get connectStart native "PerformanceResourceTiming_connectStart_Getter";
 
   @DomName('PerformanceResourceTiming.domainLookupEnd')
   @DocsEditable()
-  num get domainLookupEnd native "PerformanceResourceTiming_domainLookupEnd_Getter";
+  double get domainLookupEnd native "PerformanceResourceTiming_domainLookupEnd_Getter";
 
   @DomName('PerformanceResourceTiming.domainLookupStart')
   @DocsEditable()
-  num get domainLookupStart native "PerformanceResourceTiming_domainLookupStart_Getter";
+  double get domainLookupStart native "PerformanceResourceTiming_domainLookupStart_Getter";
 
   @DomName('PerformanceResourceTiming.fetchStart')
   @DocsEditable()
-  num get fetchStart native "PerformanceResourceTiming_fetchStart_Getter";
+  double get fetchStart native "PerformanceResourceTiming_fetchStart_Getter";
 
   @DomName('PerformanceResourceTiming.initiatorType')
   @DocsEditable()
@@ -20486,30 +20438,30 @@
 
   @DomName('PerformanceResourceTiming.redirectEnd')
   @DocsEditable()
-  num get redirectEnd native "PerformanceResourceTiming_redirectEnd_Getter";
+  double get redirectEnd native "PerformanceResourceTiming_redirectEnd_Getter";
 
   @DomName('PerformanceResourceTiming.redirectStart')
   @DocsEditable()
-  num get redirectStart native "PerformanceResourceTiming_redirectStart_Getter";
+  double get redirectStart native "PerformanceResourceTiming_redirectStart_Getter";
 
   @DomName('PerformanceResourceTiming.requestStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  num get requestStart native "PerformanceResourceTiming_requestStart_Getter";
+  double get requestStart native "PerformanceResourceTiming_requestStart_Getter";
 
   @DomName('PerformanceResourceTiming.responseEnd')
   @DocsEditable()
   @Experimental() // nonstandard
-  num get responseEnd native "PerformanceResourceTiming_responseEnd_Getter";
+  double get responseEnd native "PerformanceResourceTiming_responseEnd_Getter";
 
   @DomName('PerformanceResourceTiming.responseStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  num get responseStart native "PerformanceResourceTiming_responseStart_Getter";
+  double get responseStart native "PerformanceResourceTiming_responseStart_Getter";
 
   @DomName('PerformanceResourceTiming.secureConnectionStart')
   @DocsEditable()
-  num get secureConnectionStart native "PerformanceResourceTiming_secureConnectionStart_Getter";
+  double get secureConnectionStart native "PerformanceResourceTiming_secureConnectionStart_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20841,20 +20793,10 @@
 @DocsEditable()
 @DomName('ProcessingInstruction')
 @Unstable()
-class ProcessingInstruction extends Node {
+class ProcessingInstruction extends CharacterData {
   // To suppress missing implicit constructor warnings.
   factory ProcessingInstruction._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('ProcessingInstruction.data')
-  @DocsEditable()
-  @Experimental() // non-standard
-  String get data native "ProcessingInstruction_data_Getter";
-
-  @DomName('ProcessingInstruction.data')
-  @DocsEditable()
-  @Experimental() // non-standard
-  void set data(String value) native "ProcessingInstruction_data_Setter";
-
   @DomName('ProcessingInstruction.sheet')
   @DocsEditable()
   @Experimental() // non-standard
@@ -20904,7 +20846,7 @@
 
   @DomName('HTMLProgressElement.position')
   @DocsEditable()
-  num get position native "HTMLProgressElement_position_Getter";
+  double get position native "HTMLProgressElement_position_Getter";
 
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
@@ -21081,7 +21023,7 @@
 @DomName('Range')
 @Unstable()
 class Range extends NativeFieldWrapperClass1 {
-  factory Range() => document.$dom_createRange();
+  factory Range() => document.createRange();
 
   factory Range.fromPoint(Point point) =>
       document._caretRangeFromPoint(point.x, point.y);
@@ -23112,7 +23054,7 @@
 
   @DomName('SpeechInputResult.confidence')
   @DocsEditable()
-  num get confidence native "SpeechInputResult_confidence_Getter";
+  double get confidence native "SpeechInputResult_confidence_Getter";
 
   @DomName('SpeechInputResult.utterance')
   @DocsEditable()
@@ -23316,7 +23258,7 @@
 
   @DomName('SpeechRecognitionAlternative.confidence')
   @DocsEditable()
-  num get confidence native "SpeechRecognitionAlternative_confidence_Getter";
+  double get confidence native "SpeechRecognitionAlternative_confidence_Getter";
 
   @DomName('SpeechRecognitionAlternative.transcript')
   @DocsEditable()
@@ -23475,7 +23417,7 @@
 
   @DomName('SpeechSynthesisEvent.elapsedTime')
   @DocsEditable()
-  num get elapsedTime native "SpeechSynthesisEvent_elapsedTime_Getter";
+  double get elapsedTime native "SpeechSynthesisEvent_elapsedTime_Getter";
 
   @DomName('SpeechSynthesisEvent.name')
   @DocsEditable()
@@ -24116,17 +24058,17 @@
   @DomName('SubtleCrypto.decrypt')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation decrypt(Map algorithm, CryptoKey key) native "SubtleCrypto_decrypt_Callback";
+  Object decrypt(Map algorithm, CryptoKey key, TypedData data) native "SubtleCrypto_decrypt_Callback";
 
   @DomName('SubtleCrypto.digest')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation digest(Map algorithm) native "SubtleCrypto_digest_Callback";
+  Object digest(Map algorithm, TypedData data) native "SubtleCrypto_digest_Callback";
 
   @DomName('SubtleCrypto.encrypt')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation encrypt(Map algorithm, CryptoKey key) native "SubtleCrypto_encrypt_Callback";
+  Object encrypt(Map algorithm, CryptoKey key, TypedData data) native "SubtleCrypto_encrypt_Callback";
 
   @DomName('SubtleCrypto.generateKey')
   @DocsEditable()
@@ -24141,12 +24083,12 @@
   @DomName('SubtleCrypto.sign')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation sign(Map algorithm, CryptoKey key) native "SubtleCrypto_sign_Callback";
+  Object sign(Map algorithm, CryptoKey key, TypedData data) native "SubtleCrypto_sign_Callback";
 
   @DomName('SubtleCrypto.verify')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoOperation verify(Map algorithm, CryptoKey key, TypedData signature) native "SubtleCrypto_verify_Callback";
+  Object verify(Map algorithm, CryptoKey key, TypedData signature, TypedData data) native "SubtleCrypto_verify_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24373,6 +24315,7 @@
 
   TableCellElement insertCell(int index) => _insertCell(index);
 
+
   // To suppress missing implicit constructor warnings.
   factory TableRowElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -24419,6 +24362,7 @@
 
   TableRowElement insertRow(int index) => _insertRow(index);
 
+
   // To suppress missing implicit constructor warnings.
   factory TableSectionElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -25065,7 +25009,7 @@
 
   @DomName('TextMetrics.width')
   @DocsEditable()
-  num get width native "TextMetrics_width_Getter";
+  double get width native "TextMetrics_width_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25482,11 +25426,11 @@
 
   @DomName('TimeRanges.end')
   @DocsEditable()
-  num end(int index) native "TimeRanges_end_Callback";
+  double end(int index) native "TimeRanges_end_Callback";
 
   @DomName('TimeRanges.start')
   @DocsEditable()
-  num start(int index) native "TimeRanges_start_Callback";
+  double start(int index) native "TimeRanges_start_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25564,7 +25508,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  num get force native "Touch_webkitForce_Getter";
+  double get force native "Touch_webkitForce_Getter";
 
   @DomName('Touch.webkitRadiusX')
   @DocsEditable()
@@ -25585,7 +25529,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  num get rotationAngle native "Touch_webkitRotationAngle_Getter";
+  double get rotationAngle native "Touch_webkitRotationAngle_Getter";
 
 
   @DomName('Touch.clientX')
@@ -25870,7 +25814,7 @@
 
   @DomName('TransitionEvent.elapsedTime')
   @DocsEditable()
-  num get elapsedTime native "TransitionEvent_elapsedTime_Getter";
+  double get elapsedTime native "TransitionEvent_elapsedTime_Getter";
 
   @DomName('TransitionEvent.propertyName')
   @DocsEditable()
@@ -26553,16 +26497,16 @@
       eventType = 'MouseScrollEvents';
     }
     final event = document._createEvent(eventType);
-    // Dartium always needs these flipped because we're essentially always
-    // polyfilling (see similar dart2js code as well)
+    // Dartium always needs these flipped because we're using the legacy
+    // _initWebKitWheelEvent instead of the more modern WheelEvent constructor
+    // which isn't yet properly exposed by the Dartium bindings.
     deltaX = -deltaX;
     deltaY = -deltaY;
       // Fallthrough for Dartium.
       event._initMouseEvent(type, canBubble, cancelable, view, detail,
           screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
           metaKey, button, relatedTarget);
-      event._initWebKitWheelEvent(deltaX,
-          deltaY ~/ 120, // Chrome does an auto-convert to pixels.
+      event._initWebKitWheelEvent(deltaX, deltaY,
           view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
           metaKey);
 
@@ -26588,6 +26532,21 @@
   @DocsEditable()
   int get deltaMode native "WheelEvent_deltaMode_Getter";
 
+  @DomName('WheelEvent.deltaX')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get _deltaX native "WheelEvent_deltaX_Getter";
+
+  @DomName('WheelEvent.deltaY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get _deltaY native "WheelEvent_deltaY_Getter";
+
+  @DomName('WheelEvent.deltaZ')
+  @DocsEditable()
+  @Experimental() // untriaged
+  double get deltaZ native "WheelEvent_deltaZ_Getter";
+
   @DomName('WheelEvent.webkitDirectionInvertedFromDevice')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -26598,12 +26557,12 @@
   @DomName('WheelEvent.wheelDeltaX')
   @DocsEditable()
   @Experimental() // non-standard
-  int get _wheelDeltaX native "WheelEvent_wheelDeltaX_Getter";
+  int get wheelDeltaX native "WheelEvent_wheelDeltaX_Getter";
 
   @DomName('WheelEvent.wheelDeltaY')
   @DocsEditable()
   @Experimental() // non-standard
-  int get _wheelDeltaY native "WheelEvent_wheelDeltaY_Getter";
+  int get wheelDeltaY native "WheelEvent_wheelDeltaY_Getter";
 
   @DomName('WheelEvent.initWebKitWheelEvent')
   @DocsEditable()
@@ -26620,7 +26579,7 @@
    * * [WheelEvent.deltaX](http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-WheelEvent-deltaX) from the W3C.
    */
   @DomName('WheelEvent.deltaX')
-  num get deltaX => -_wheelDeltaX;
+  num get deltaX => _deltaX;
 
   /**
    * The amount that is expected to scroll vertically, in units determined by
@@ -26631,7 +26590,7 @@
    * * [WheelEvent.deltaY](http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-WheelEvent-deltaY) from the W3C.
    */
   @DomName('WheelEvent.deltaY')
-  num get deltaY => -_wheelDeltaY;
+  num get deltaY => _deltaY;
 }
 // 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
@@ -26663,7 +26622,7 @@
     if (portStr == null) {
       return null;
     }
-    var port = json.parse(portStr);
+    var port = JSON.decode(portStr);
     return _deserialize(port);
   }
 
@@ -26675,7 +26634,7 @@
   void registerPort(String name, var port) {
     var serialized = _serialize(port);
     document.documentElement.attributes['dart-port:$name'] =
-        json.stringify(serialized);
+        JSON.encode(serialized);
   }
 
   /**
@@ -26891,7 +26850,7 @@
   @DocsEditable()
   // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
   @Experimental() // non-standard
-  num get devicePixelRatio native "Window_devicePixelRatio_Getter";
+  double get devicePixelRatio native "Window_devicePixelRatio_Getter";
 
   @DomName('Window.document')
   @DocsEditable()
@@ -27122,6 +27081,50 @@
   @DocsEditable()
   bool confirm(String message) native "Window_confirm_Callback";
 
+  Object _createImageBitmap(canvas_OR_context_OR_image_OR_video, [int sx, int sy, int sw, int sh]) {
+    if ((canvas_OR_context_OR_image_OR_video is ImageElement || canvas_OR_context_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      return _createImageBitmap_1(canvas_OR_context_OR_image_OR_video);
+    }
+    if ((sh is int || sh == null) && (sw is int || sw == null) && (sy is int || sy == null) && (sx is int || sx == null) && (canvas_OR_context_OR_image_OR_video is ImageElement || canvas_OR_context_OR_image_OR_video == null)) {
+      return _createImageBitmap_2(canvas_OR_context_OR_image_OR_video, sx, sy, sw, sh);
+    }
+    if ((canvas_OR_context_OR_image_OR_video is CanvasRenderingContext2D || canvas_OR_context_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      return _createImageBitmap_3(canvas_OR_context_OR_image_OR_video);
+    }
+    if ((sh is int || sh == null) && (sw is int || sw == null) && (sy is int || sy == null) && (sx is int || sx == null) && (canvas_OR_context_OR_image_OR_video is CanvasElement || canvas_OR_context_OR_image_OR_video == null)) {
+      return _createImageBitmap_4(canvas_OR_context_OR_image_OR_video, sx, sy, sw, sh);
+    }
+    if ((canvas_OR_context_OR_image_OR_video is CanvasElement || canvas_OR_context_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      return _createImageBitmap_5(canvas_OR_context_OR_image_OR_video);
+    }
+    if ((canvas_OR_context_OR_image_OR_video is VideoElement || canvas_OR_context_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      return _createImageBitmap_6(canvas_OR_context_OR_image_OR_video);
+    }
+    if ((sh is int || sh == null) && (sw is int || sw == null) && (sy is int || sy == null) && (sx is int || sx == null) && (canvas_OR_context_OR_image_OR_video is VideoElement || canvas_OR_context_OR_image_OR_video == null)) {
+      return _createImageBitmap_7(canvas_OR_context_OR_image_OR_video, sx, sy, sw, sh);
+    }
+    if ((sh is int || sh == null) && (sw is int || sw == null) && (sy is int || sy == null) && (sx is int || sx == null) && (canvas_OR_context_OR_image_OR_video is CanvasRenderingContext2D || canvas_OR_context_OR_image_OR_video == null)) {
+      return _createImageBitmap_8(canvas_OR_context_OR_image_OR_video, sx, sy, sw, sh);
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  Object _createImageBitmap_1(canvas_OR_context_OR_image_OR_video) native "Window__createImageBitmap_1_Callback";
+
+  Object _createImageBitmap_2(canvas_OR_context_OR_image_OR_video, sx, sy, sw, sh) native "Window__createImageBitmap_2_Callback";
+
+  Object _createImageBitmap_3(canvas_OR_context_OR_image_OR_video) native "Window__createImageBitmap_3_Callback";
+
+  Object _createImageBitmap_4(canvas_OR_context_OR_image_OR_video, sx, sy, sw, sh) native "Window__createImageBitmap_4_Callback";
+
+  Object _createImageBitmap_5(canvas_OR_context_OR_image_OR_video) native "Window__createImageBitmap_5_Callback";
+
+  Object _createImageBitmap_6(canvas_OR_context_OR_image_OR_video) native "Window__createImageBitmap_6_Callback";
+
+  Object _createImageBitmap_7(canvas_OR_context_OR_image_OR_video, sx, sy, sw, sh) native "Window__createImageBitmap_7_Callback";
+
+  Object _createImageBitmap_8(canvas_OR_context_OR_image_OR_video, sx, sy, sw, sh) native "Window__createImageBitmap_8_Callback";
+
   @DomName('Window.find')
   @DocsEditable()
   @Experimental() // non-standard
@@ -27738,6 +27741,21 @@
 
 
 @DocsEditable()
+@DomName('WorkerConsole')
+@Experimental() // untriaged
+class WorkerConsole extends ConsoleBase {
+  // To suppress missing implicit constructor warnings.
+  factory WorkerConsole._() { throw new UnsupportedError("Not supported"); }
+
+}
+// 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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('WorkerCrypto')
 @Experimental() // untriaged
 class WorkerCrypto extends NativeFieldWrapperClass1 {
@@ -27777,6 +27795,11 @@
   @Experimental() // untriaged
   static const int TEMPORARY = 0;
 
+  @DomName('WorkerGlobalScope.console')
+  @DocsEditable()
+  @Experimental() // untriaged
+  WorkerConsole get console native "WorkerGlobalScope_console_Getter";
+
   @DomName('WorkerGlobalScope.crypto')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27820,11 +27843,6 @@
   @Experimental() // untriaged
   void close() native "WorkerGlobalScope_close_Callback";
 
-  @DomName('WorkerGlobalScope.importScripts')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void importScripts() native "WorkerGlobalScope_importScripts_Callback";
-
   @DomName('WorkerGlobalScope.openDatabase')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27943,7 +27961,7 @@
   @DomName('WorkerPerformance.now')
   @DocsEditable()
   @Experimental() // untriaged
-  num now() native "WorkerPerformance_now_Callback";
+  double now() native "WorkerPerformance_now_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28080,7 +28098,7 @@
 
   @DomName('XPathResult.numberValue')
   @DocsEditable()
-  num get numberValue native "XPathResult_numberValue_Getter";
+  double get numberValue native "XPathResult_numberValue_Getter";
 
   @DomName('XPathResult.resultType')
   @DocsEditable()
@@ -28115,6 +28133,96 @@
 
 
 @DocsEditable()
+@DomName('XMLHttpRequestEventTarget')
+@Experimental() // untriaged
+class XmlHttpRequestEventTarget extends EventTarget {
+  // To suppress missing implicit constructor warnings.
+  factory XmlHttpRequestEventTarget._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('XMLHttpRequestEventTarget.abortEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<ProgressEvent> abortEvent = const EventStreamProvider<ProgressEvent>('abort');
+
+  @DomName('XMLHttpRequestEventTarget.errorEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<ProgressEvent> errorEvent = const EventStreamProvider<ProgressEvent>('error');
+
+  @DomName('XMLHttpRequestEventTarget.loadEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<ProgressEvent> loadEvent = const EventStreamProvider<ProgressEvent>('load');
+
+  @DomName('XMLHttpRequestEventTarget.loadendEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<ProgressEvent> loadEndEvent = const EventStreamProvider<ProgressEvent>('loadend');
+
+  @DomName('XMLHttpRequestEventTarget.loadstartEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<ProgressEvent> loadStartEvent = const EventStreamProvider<ProgressEvent>('loadstart');
+
+  @DomName('XMLHttpRequestEventTarget.progressEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
+
+  @DomName('XMLHttpRequestEventTarget.addEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestEventTarget_addEventListener_Callback";
+
+  @DomName('XMLHttpRequestEventTarget.dispatchEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool dispatchEvent(Event event) native "XMLHttpRequestEventTarget_dispatchEvent_Callback";
+
+  @DomName('XMLHttpRequestEventTarget.removeEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestEventTarget_removeEventListener_Callback";
+
+  @DomName('XMLHttpRequestEventTarget.onabort')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
+
+  @DomName('XMLHttpRequestEventTarget.onerror')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<ProgressEvent> get onError => errorEvent.forTarget(this);
+
+  @DomName('XMLHttpRequestEventTarget.onload')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<ProgressEvent> get onLoad => loadEvent.forTarget(this);
+
+  @DomName('XMLHttpRequestEventTarget.onloadend')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<ProgressEvent> get onLoadEnd => loadEndEvent.forTarget(this);
+
+  @DomName('XMLHttpRequestEventTarget.onloadstart')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<ProgressEvent> get onLoadStart => loadStartEvent.forTarget(this);
+
+  @DomName('XMLHttpRequestEventTarget.onprogress')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<ProgressEvent> get onProgress => progressEvent.forTarget(this);
+
+}
+// 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
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('XMLSerializer')
 // http://domparsing.spec.whatwg.org/#the-xmlserializer-interface
 @deprecated // stable
@@ -28211,10 +28319,20 @@
   @DocsEditable()
   bool get isId native "Attr_isId_Getter";
 
+  @DomName('Attr.localName')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get _localName native "Attr_localName_Getter";
+
   @DomName('Attr.name')
   @DocsEditable()
   String get name native "Attr_name_Getter";
 
+  @DomName('Attr.namespaceURI')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get _namespaceUri native "Attr_namespaceURI_Getter";
+
   @DomName('Attr.ownerElement')
   @DocsEditable()
   @deprecated // deprecated
@@ -28370,27 +28488,27 @@
 
   @DomName('ClientRect.bottom')
   @DocsEditable()
-  num get bottom native "ClientRect_bottom_Getter";
+  double get bottom native "ClientRect_bottom_Getter";
 
   @DomName('ClientRect.height')
   @DocsEditable()
-  num get height native "ClientRect_height_Getter";
+  double get height native "ClientRect_height_Getter";
 
   @DomName('ClientRect.left')
   @DocsEditable()
-  num get left native "ClientRect_left_Getter";
+  double get left native "ClientRect_left_Getter";
 
   @DomName('ClientRect.right')
   @DocsEditable()
-  num get right native "ClientRect_right_Getter";
+  double get right native "ClientRect_right_Getter";
 
   @DomName('ClientRect.top')
   @DocsEditable()
-  num get top native "ClientRect_top_Getter";
+  double get top native "ClientRect_top_Getter";
 
   @DomName('ClientRect.width')
   @DocsEditable()
-  num get width native "ClientRect_width_Getter";
+  double get width native "ClientRect_width_Getter";
 }
 // 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
@@ -29440,7 +29558,7 @@
 @DomName('WorkerNavigator')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workernavigator
 @Experimental()
-abstract class _WorkerNavigator extends NativeFieldWrapperClass1 {
+abstract class _WorkerNavigator extends NativeFieldWrapperClass1 implements NavigatorOnLine, NavigatorID {
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29536,15 +29654,15 @@
   }
 
   String operator [](String key) {
-    return _element.$dom_getAttribute(key);
+    return _element._getAttribute(key);
   }
 
   void operator []=(String key, String value) {
-    _element.$dom_setAttribute(key, value);
+    _element._setAttribute(key, value);
   }
 
   String remove(String key) {
-    String value = _element.$dom_getAttribute(key);
+    String value = _element._getAttribute(key);
     _element._removeAttribute(key);
     return value;
   }
@@ -29573,11 +29691,11 @@
   }
 
   String operator [](String key) {
-    return _element.$dom_getAttributeNS(_namespace, key);
+    return _element._getAttributeNS(_namespace, key);
   }
 
   void operator []=(String key, String value) {
-    _element.$dom_setAttributeNS(_namespace, key, value);
+    _element._setAttributeNS(_namespace, key, value);
   }
 
   String remove(String key) {
@@ -29727,7 +29845,7 @@
  * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
  * * [Window](http://www.w3.org/TR/Window/) from the W3C.
  */
-abstract class WindowBase {
+abstract class WindowBase implements EventTarget {
   // Fields.
 
   /**
@@ -31297,7 +31415,7 @@
     var source = '$target-result';
     var result = null;
     window.on[source].first.then((Event e) {
-      result = json.parse(_getPortSyncEventData(e));
+      result = JSON.decode(_getPortSyncEventData(e));
     });
     _dispatchEvent(target, [source, message]);
     return result;
@@ -31381,7 +31499,7 @@
     _callback = callback;
     if (_portSubscription == null) {
       _portSubscription = window.on[_listenerName].listen((Event e) {
-        var data = json.parse(_getPortSyncEventData(e));
+        var data = JSON.decode(_getPortSyncEventData(e));
         var replyTo = data[0];
         var message = _deserialize(data[1]);
         var result = _callback(message);
@@ -31412,7 +31530,7 @@
 
 void _dispatchEvent(String receiver, var message) {
   var event = new CustomEvent(receiver, canBubble: false, cancelable:false,
-    detail: json.stringify(message));
+    detail: JSON.encode(message));
   window.dispatchEvent(event);
 }
 
@@ -32853,6 +32971,21 @@
   }
 
   /**
+   * Allow inline styles on elements.
+   *
+   * If [tagName] is not specified then this allows inline styles on all
+   * elements. Otherwise tagName limits the styles to the specified elements.
+   */
+  void allowInlineStyles({String tagName}) {
+    if (tagName == null) {
+      tagName = '*';
+    } else {
+      tagName = tagName.toUpperCase();
+    }
+    add(new _SimpleNodeValidator(null, allowedAttributes: ['$tagName::style']));
+  }
+
+  /**
    * Allow common safe HTML5 elements and attributes.
    *
    * This list is based off of the Caja whitelists at:
@@ -33792,6 +33925,8 @@
         Element element = node;
         var attrs = element.attributes;
         if (!validator.allowsElement(element)) {
+          window.console.warn(
+              'Removing disallowed element <${element.tagName}>');
           element.remove();
           break;
         }
@@ -33799,6 +33934,8 @@
         var isAttr = attrs['is'];
         if (isAttr != null) {
           if (!validator.allowsAttribute(element, 'is', isAttr)) {
+            window.console.warn('Removing disallowed type extension '
+                '<${element.tagName} is="$isAttr">');
             element.remove();
             break;
           }
@@ -33811,6 +33948,8 @@
           var name = keys[i];
           if (!validator.allowsAttribute(element, name.toLowerCase(),
               attrs[name])) {
+            window.console.warn('Removing disallowed attribute '
+                '<${element.tagName} $name="${attrs[name]}">');
             attrs.remove(name);
           }
         }
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index 44b179e..3fbe9ff 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -531,12 +531,7 @@
   @DomName('IDBIndex.count')
   Future<int> count([key_OR_range]) {
    try {
-      var request;
-      if (key_OR_range != null) {
-        request = _count(key_OR_range);
-      } else {
-        request = _count();
-      }
+      var request = _count(key_OR_range);
       return _completeRequest(request);
     } catch (e, stacktrace) {
       return new Future.error(e, stacktrace);
@@ -583,12 +578,7 @@
     } else {
       key_OR_range = range;
     }
-    var request;
-    if (direction == null) {
-      request = _openCursor(key_OR_range);
-    } else {
-      request = _openCursor(key_OR_range, direction);
-    }
+    var request = _openCursor(key_OR_range, direction);
     return ObjectStore._cursorStreamFromResult(request, autoAdvance);
   }
 
@@ -610,12 +600,7 @@
     } else {
       key_OR_range = range;
     }
-    var request;
-    if (direction == null) {
-      request = _openKeyCursor(key_OR_range);
-    } else {
-      request = _openKeyCursor(key_OR_range, direction);
-    }
+    var request = _openKeyCursor(key_OR_range, direction);
     return ObjectStore._cursorStreamFromResult(request, autoAdvance);
   }
 
@@ -644,7 +629,7 @@
   @JSName('count')
   @DomName('IDBIndex.count')
   @DocsEditable()
-  Request _count([key_OR_range]) native;
+  Request _count(Object key) native;
 
   @JSName('get')
   @DomName('IDBIndex.get')
@@ -652,7 +637,7 @@
   @Returns('Request')
   @Creates('Request')
   @annotation_Creates_SerializedScriptValue
-  Request _get(key) native;
+  Request _get(Object key) native;
 
   @JSName('getKey')
   @DomName('IDBIndex.getKey')
@@ -661,7 +646,7 @@
   @Creates('Request')
   @annotation_Creates_SerializedScriptValue
   @Creates('ObjectStore')
-  Request _getKey(key) native;
+  Request _getKey(Object key) native;
 
   @JSName('openCursor')
   @DomName('IDBIndex.openCursor')
@@ -669,7 +654,7 @@
   @Returns('Request')
   @Creates('Request')
   @Creates('Cursor')
-  Request _openCursor([key_OR_range, String direction]) native;
+  Request _openCursor(Object key, String direction) native;
 
   @JSName('openKeyCursor')
   @DomName('IDBIndex.openKeyCursor')
@@ -677,7 +662,7 @@
   @Returns('Request')
   @Creates('Request')
   @Creates('Cursor')
-  Request _openKeyCursor([key_OR_range, String direction]) native;
+  Request _openKeyCursor(Object key, String direction) native;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -791,12 +776,7 @@
   @DomName('IDBObjectStore.count')
   Future<int> count([key_OR_range]) {
    try {
-      var request;
-      if (key_OR_range != null) {
-        request = _count(key_OR_range);
-      } else {
-        request = _count();
-      }
+      var request = _count(key_OR_range);
       return _completeRequest(request);
     } catch (e, stacktrace) {
       return new Future.error(e, stacktrace);
@@ -947,7 +927,7 @@
   @JSName('count')
   @DomName('IDBObjectStore.count')
   @DocsEditable()
-  Request _count([key_OR_range]) native;
+  Request _count(Object key) native;
 
   @DomName('IDBObjectStore.createIndex')
   @DocsEditable()
@@ -990,7 +970,7 @@
   @JSName('delete')
   @DomName('IDBObjectStore.delete')
   @DocsEditable()
-  Request _delete(key_OR_keyRange) native;
+  Request _delete(Object key) native;
 
   @DomName('IDBObjectStore.deleteIndex')
   @DocsEditable()
@@ -1002,7 +982,7 @@
   @Returns('Request')
   @Creates('Request')
   @annotation_Creates_SerializedScriptValue
-  Request _get(key) native;
+  Request _get(Object key) native;
 
   @DomName('IDBObjectStore.index')
   @DocsEditable()
@@ -1014,7 +994,7 @@
   @Returns('Request')
   @Creates('Request')
   @Creates('Cursor')
-  Request _openCursor([key_OR_range, String direction]) native;
+  Request _openCursor(Object key, [String direction]) native;
 
   @DomName('IDBObjectStore.put')
   @DocsEditable()
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index 4612492..c21a6a4 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -394,12 +394,7 @@
   @DomName('IDBIndex.count')
   Future<int> count([key_OR_range]) {
    try {
-      var request;
-      if (key_OR_range != null) {
-        request = _count(key_OR_range);
-      } else {
-        request = _count();
-      }
+      var request = _count(key_OR_range);
       return _completeRequest(request);
     } catch (e, stacktrace) {
       return new Future.error(e, stacktrace);
@@ -446,12 +441,7 @@
     } else {
       key_OR_range = range;
     }
-    var request;
-    if (direction == null) {
-      request = _openCursor(key_OR_range);
-    } else {
-      request = _openCursor(key_OR_range, direction);
-    }
+    var request = _openCursor(key_OR_range, direction);
     return ObjectStore._cursorStreamFromResult(request, autoAdvance);
   }
 
@@ -473,12 +463,7 @@
     } else {
       key_OR_range = range;
     }
-    var request;
-    if (direction == null) {
-      request = _openKeyCursor(key_OR_range);
-    } else {
-      request = _openKeyCursor(key_OR_range, direction);
-    }
+    var request = _openKeyCursor(key_OR_range, direction);
     return ObjectStore._cursorStreamFromResult(request, autoAdvance);
   }
 
@@ -503,75 +488,25 @@
   @DocsEditable()
   bool get unique native "IDBIndex_unique_Getter";
 
-  Request _count([key_OR_range]) {
-    if ((key_OR_range is KeyRange || key_OR_range == null)) {
-      return _count_1(key_OR_range);
-    }
-    if (key_OR_range != null) {
-      return _count_2(key_OR_range);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
+  @DomName('IDBIndex.count')
+  @DocsEditable()
+  Request _count(Object key) native "IDBIndex_count_Callback";
 
-  Request _count_1(key_OR_range) native "IDBIndex__count_1_Callback";
+  @DomName('IDBIndex.get')
+  @DocsEditable()
+  Request _get(Object key) native "IDBIndex_get_Callback";
 
-  Request _count_2(key_OR_range) native "IDBIndex__count_2_Callback";
+  @DomName('IDBIndex.getKey')
+  @DocsEditable()
+  Request _getKey(Object key) native "IDBIndex_getKey_Callback";
 
-  Request _get(key) {
-    if ((key is KeyRange || key == null)) {
-      return _get_1(key);
-    }
-    if (key != null) {
-      return _get_2(key);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
+  @DomName('IDBIndex.openCursor')
+  @DocsEditable()
+  Request _openCursor(Object key, String direction) native "IDBIndex_openCursor_Callback";
 
-  Request _get_1(key) native "IDBIndex__get_1_Callback";
-
-  Request _get_2(key) native "IDBIndex__get_2_Callback";
-
-  Request _getKey(key) {
-    if ((key is KeyRange || key == null)) {
-      return _getKey_1(key);
-    }
-    if (key != null) {
-      return _getKey_2(key);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  Request _getKey_1(key) native "IDBIndex__getKey_1_Callback";
-
-  Request _getKey_2(key) native "IDBIndex__getKey_2_Callback";
-
-  Request _openCursor([key_OR_range, String direction]) {
-    if ((direction is String || direction == null) && (key_OR_range is KeyRange || key_OR_range == null)) {
-      return _openCursor_1(key_OR_range, direction);
-    }
-    if ((direction is String || direction == null) && key_OR_range != null) {
-      return _openCursor_2(key_OR_range, direction);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  Request _openCursor_1(key_OR_range, direction) native "IDBIndex__openCursor_1_Callback";
-
-  Request _openCursor_2(key_OR_range, direction) native "IDBIndex__openCursor_2_Callback";
-
-  Request _openKeyCursor([key_OR_range, String direction]) {
-    if ((direction is String || direction == null) && (key_OR_range is KeyRange || key_OR_range == null)) {
-      return _openKeyCursor_1(key_OR_range, direction);
-    }
-    if ((direction is String || direction == null) && key_OR_range != null) {
-      return _openKeyCursor_2(key_OR_range, direction);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  Request _openKeyCursor_1(key_OR_range, direction) native "IDBIndex__openKeyCursor_1_Callback";
-
-  Request _openKeyCursor_2(key_OR_range, direction) native "IDBIndex__openKeyCursor_2_Callback";
+  @DomName('IDBIndex.openKeyCursor')
+  @DocsEditable()
+  Request _openKeyCursor(Object key, String direction) native "IDBIndex_openKeyCursor_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -683,12 +618,7 @@
   @DomName('IDBObjectStore.count')
   Future<int> count([key_OR_range]) {
    try {
-      var request;
-      if (key_OR_range != null) {
-        request = _count(key_OR_range);
-      } else {
-        request = _count();
-      }
+      var request = _count(key_OR_range);
       return _completeRequest(request);
     } catch (e, stacktrace) {
       return new Future.error(e, stacktrace);
@@ -807,19 +737,9 @@
   @DocsEditable()
   Request _clear() native "IDBObjectStore_clear_Callback";
 
-  Request _count([key_OR_range]) {
-    if ((key_OR_range is KeyRange || key_OR_range == null)) {
-      return _count_1(key_OR_range);
-    }
-    if (key_OR_range != null) {
-      return _count_2(key_OR_range);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  Request _count_1(key_OR_range) native "IDBObjectStore__count_1_Callback";
-
-  Request _count_2(key_OR_range) native "IDBObjectStore__count_2_Callback";
+  @DomName('IDBObjectStore.count')
+  @DocsEditable()
+  Request _count(Object key) native "IDBObjectStore_count_Callback";
 
   Index _createIndex(String name, keyPath, [Map options]) {
     if ((options is Map || options == null) && (keyPath is List<String> || keyPath == null) && (name is String || name == null)) {
@@ -835,55 +755,25 @@
 
   Index _createIndex_2(name, keyPath, options) native "IDBObjectStore__createIndex_2_Callback";
 
-  Request _delete(key_OR_keyRange) {
-    if ((key_OR_keyRange is KeyRange || key_OR_keyRange == null)) {
-      return _delete_1(key_OR_keyRange);
-    }
-    if (key_OR_keyRange != null) {
-      return _delete_2(key_OR_keyRange);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  Request _delete_1(key_OR_keyRange) native "IDBObjectStore__delete_1_Callback";
-
-  Request _delete_2(key_OR_keyRange) native "IDBObjectStore__delete_2_Callback";
+  @DomName('IDBObjectStore.delete')
+  @DocsEditable()
+  Request _delete(Object key) native "IDBObjectStore_delete_Callback";
 
   @DomName('IDBObjectStore.deleteIndex')
   @DocsEditable()
   void deleteIndex(String name) native "IDBObjectStore_deleteIndex_Callback";
 
-  Request _get(key) {
-    if ((key is KeyRange || key == null)) {
-      return _get_1(key);
-    }
-    if (key != null) {
-      return _get_2(key);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  Request _get_1(key) native "IDBObjectStore__get_1_Callback";
-
-  Request _get_2(key) native "IDBObjectStore__get_2_Callback";
+  @DomName('IDBObjectStore.get')
+  @DocsEditable()
+  Request _get(Object key) native "IDBObjectStore_get_Callback";
 
   @DomName('IDBObjectStore.index')
   @DocsEditable()
   Index index(String name) native "IDBObjectStore_index_Callback";
 
-  Request _openCursor([key_OR_range, String direction]) {
-    if ((direction is String || direction == null) && (key_OR_range is KeyRange || key_OR_range == null)) {
-      return _openCursor_1(key_OR_range, direction);
-    }
-    if ((direction is String || direction == null) && key_OR_range != null) {
-      return _openCursor_2(key_OR_range, direction);
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  Request _openCursor_1(key_OR_range, direction) native "IDBObjectStore__openCursor_1_Callback";
-
-  Request _openCursor_2(key_OR_range, direction) native "IDBObjectStore__openCursor_2_Callback";
+  @DomName('IDBObjectStore.openCursor')
+  @DocsEditable()
+  Request _openCursor(Object key, [String direction]) native "IDBObjectStore_openCursor_Callback";
 
   @DomName('IDBObjectStore.put')
   @DocsEditable()
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index e390d31..c44f101 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -21,7 +21,6 @@
                               LinkedListEntry;
 import 'dart:convert';
 import 'dart:isolate';
-import 'dart:json' as JSON;
 import 'dart:math';
 import 'dart:typed_data';
 
diff --git a/sdk/lib/io/websocket_impl.dart b/sdk/lib/io/websocket_impl.dart
index f85ddf2..b13709c 100644
--- a/sdk/lib/io/websocket_impl.dart
+++ b/sdk/lib/io/websocket_impl.dart
@@ -866,7 +866,8 @@
       _outCloseReason = reason;
       _writeClosed = true;
     }
-    return _sink.close();
+    if (!(_sink as _StreamSinkImpl)._isBound) _sink.close();
+    return _sink.done;
   }
 
   static bool _isReservedStatusCode(int code) {
diff --git a/sdk/lib/js/dartium/js_dartium.dart b/sdk/lib/js/dartium/js_dartium.dart
index 5f9788b..2ec2c0e 100644
--- a/sdk/lib/js/dartium/js_dartium.dart
+++ b/sdk/lib/js/dartium/js_dartium.dart
@@ -211,7 +211,8 @@
     switch (result[0]) {
       case 'return': return _deserialize(result[1]);
       case 'throws': throw _deserialize(result[1]);
-      case 'none': throw new NoSuchMethodError(receiver, member, args, {});
+      case 'none':
+          throw new NoSuchMethodError(receiver, new Symbol(member), args, {});
       default: throw 'Invalid return value';
     }
   }
diff --git a/sdk/lib/json/json.dart b/sdk/lib/json/json.dart
index efc2621..8bd8ab2 100644
--- a/sdk/lib/json/json.dart
+++ b/sdk/lib/json/json.dart
@@ -463,7 +463,8 @@
       }
       char = source.codeUnitAt(position);
       if (char == QUOTE) {
-        listener.handleString(source.substring(start, position));
+        String result = source.substring(start, position);
+        listener.handleString(result);
         return position + 1;
       }
       if (char < SPACE) {
diff --git a/sdk/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart
index 4e96d84..313026f 100644
--- a/sdk/lib/mirrors/mirrors.dart
+++ b/sdk/lib/mirrors/mirrors.dart
@@ -219,11 +219,15 @@
    * computed by [simpleName].
    * The fully qualified name of *r* is the
    * concatenation of *p*, '.', and *s*.
+   *
+   * Because an isolate can contain more than one library with the same name (at
+   * different URIs), a fully-qualified name does not uniquely identify any
+   * language entity.
    */
   Symbol get qualifiedName;
 
   /**
-   * A mirror on the owner of this function.  This is the declaration
+   * A mirror on the owner of this Dart language entity. This is the declaration
    * immediately surrounding the reflectee.
    *
    * For a library, the owner is [:null:].
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index 7d4f71b..2222b2e 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -5,7 +5,7 @@
 import 'dart:_collection-dev' hide deprecated;
 import 'dart:html';
 import 'dart:html_common';
-import 'dart:_js_helper' show Creates, Returns, JavaScriptIndexingBehavior, JSName;
+import 'dart:_js_helper' show Creates, Returns, JSName;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor;
 // DO NOT EDIT - unless you are editing documentation as per:
@@ -336,7 +336,7 @@
 
   @DomName('SVGAnimatedNumber.animVal')
   @DocsEditable()
-  final num animVal;
+  final double animVal;
 
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
@@ -470,15 +470,15 @@
 
   @DomName('SVGAnimationElement.getCurrentTime')
   @DocsEditable()
-  num getCurrentTime() native;
+  double getCurrentTime() native;
 
   @DomName('SVGAnimationElement.getSimpleDuration')
   @DocsEditable()
-  num getSimpleDuration() native;
+  double getSimpleDuration() native;
 
   @DomName('SVGAnimationElement.getStartTime')
   @DocsEditable()
-  num getStartTime() native;
+  double getStartTime() native;
 
   // From SVGExternalResourcesRequired
 
@@ -2759,7 +2759,7 @@
 @DocsEditable()
 @DomName('SVGLengthList')
 @Unstable()
-class LengthList extends Interceptor with ListMixin<Length>, ImmutableListMixin<Length> implements JavaScriptIndexingBehavior, List<Length> native "SVGLengthList" {
+class LengthList extends Interceptor with ListMixin<Length>, ImmutableListMixin<Length> implements List<Length> native "SVGLengthList" {
 
   @DomName('SVGLengthList.numberOfItems')
   @DocsEditable()
@@ -3177,7 +3177,7 @@
 @DocsEditable()
 @DomName('SVGNumberList')
 @Unstable()
-class NumberList extends Interceptor with ListMixin<Number>, ImmutableListMixin<Number> implements JavaScriptIndexingBehavior, List<Number> native "SVGNumberList" {
+class NumberList extends Interceptor with ListMixin<Number>, ImmutableListMixin<Number> implements List<Number> native "SVGNumberList" {
 
   @DomName('SVGNumberList.numberOfItems')
   @DocsEditable()
@@ -3398,7 +3398,7 @@
 
   @DomName('SVGPathElement.getTotalLength')
   @DocsEditable()
-  num getTotalLength() native;
+  double getTotalLength() native;
 
   // From SVGExternalResourcesRequired
 
@@ -3932,7 +3932,7 @@
 @DocsEditable()
 @DomName('SVGPathSegList')
 @Unstable()
-class PathSegList extends Interceptor with ListMixin<PathSeg>, ImmutableListMixin<PathSeg> implements JavaScriptIndexingBehavior, List<PathSeg> native "SVGPathSegList" {
+class PathSegList extends Interceptor with ListMixin<PathSeg>, ImmutableListMixin<PathSeg> implements List<PathSeg> native "SVGPathSegList" {
 
   @DomName('SVGPathSegList.numberOfItems')
   @DocsEditable()
@@ -4563,7 +4563,7 @@
 @DocsEditable()
 @DomName('SVGStringList')
 @Unstable()
-class StringList extends Interceptor with ListMixin<String>, ImmutableListMixin<String> implements JavaScriptIndexingBehavior, List<String> native "SVGStringList" {
+class StringList extends Interceptor with ListMixin<String>, ImmutableListMixin<String> implements List<String> native "SVGStringList" {
 
   @DomName('SVGStringList.numberOfItems')
   @DocsEditable()
@@ -4923,19 +4923,19 @@
 
   @DomName('SVGSVGElement.pixelUnitToMillimeterX')
   @DocsEditable()
-  final num pixelUnitToMillimeterX;
+  final double pixelUnitToMillimeterX;
 
   @DomName('SVGSVGElement.pixelUnitToMillimeterY')
   @DocsEditable()
-  final num pixelUnitToMillimeterY;
+  final double pixelUnitToMillimeterY;
 
   @DomName('SVGSVGElement.screenPixelToMillimeterX')
   @DocsEditable()
-  final num screenPixelToMillimeterX;
+  final double screenPixelToMillimeterX;
 
   @DomName('SVGSVGElement.screenPixelToMillimeterY')
   @DocsEditable()
-  final num screenPixelToMillimeterY;
+  final double screenPixelToMillimeterY;
 
   @DomName('SVGSVGElement.useCurrentView')
   @DocsEditable()
@@ -5019,7 +5019,7 @@
 
   @DomName('SVGSVGElement.getCurrentTime')
   @DocsEditable()
-  num getCurrentTime() native;
+  double getCurrentTime() native;
 
   @DomName('SVGSVGElement.getElementById')
   @DocsEditable()
@@ -5210,7 +5210,7 @@
 
   @DomName('SVGTextContentElement.getComputedTextLength')
   @DocsEditable()
-  num getComputedTextLength() native;
+  double getComputedTextLength() native;
 
   @DomName('SVGTextContentElement.getEndPositionOfChar')
   @DocsEditable()
@@ -5226,7 +5226,7 @@
 
   @DomName('SVGTextContentElement.getRotationOfChar')
   @DocsEditable()
-  num getRotationOfChar(int offset) native;
+  double getRotationOfChar(int offset) native;
 
   @DomName('SVGTextContentElement.getStartPositionOfChar')
   @DocsEditable()
@@ -5234,7 +5234,7 @@
 
   @DomName('SVGTextContentElement.getSubStringLength')
   @DocsEditable()
-  num getSubStringLength(int offset, int length) native;
+  double getSubStringLength(int offset, int length) native;
 
   @DomName('SVGTextContentElement.selectSubString')
   @DocsEditable()
@@ -5404,7 +5404,7 @@
 
   @DomName('SVGTransform.angle')
   @DocsEditable()
-  final num angle;
+  final double angle;
 
   @DomName('SVGTransform.matrix')
   @DocsEditable()
@@ -5446,7 +5446,7 @@
 @DocsEditable()
 @DomName('SVGTransformList')
 @Unstable()
-class TransformList extends Interceptor with ListMixin<Transform>, ImmutableListMixin<Transform> implements List<Transform>, JavaScriptIndexingBehavior native "SVGTransformList" {
+class TransformList extends Interceptor with ListMixin<Transform>, ImmutableListMixin<Transform> implements List<Transform> native "SVGTransformList" {
 
   @DomName('SVGTransformList.numberOfItems')
   @DocsEditable()
@@ -5770,7 +5770,7 @@
 
   @DomName('SVGZoomEvent.newScale')
   @DocsEditable()
-  final num newScale;
+  final double newScale;
 
   @DomName('SVGZoomEvent.newTranslate')
   @DocsEditable()
@@ -5778,7 +5778,7 @@
 
   @DomName('SVGZoomEvent.previousScale')
   @DocsEditable()
-  final num previousScale;
+  final double previousScale;
 
   @DomName('SVGZoomEvent.previousTranslate')
   @DocsEditable()
@@ -5796,7 +5796,7 @@
 @DocsEditable()
 @DomName('SVGElementInstanceList')
 @Unstable()
-class _ElementInstanceList extends Interceptor with ListMixin<ElementInstance>, ImmutableListMixin<ElementInstance> implements JavaScriptIndexingBehavior, List<ElementInstance> native "SVGElementInstanceList" {
+class _ElementInstanceList extends Interceptor with ListMixin<ElementInstance>, ImmutableListMixin<ElementInstance> implements List<ElementInstance> native "SVGElementInstanceList" {
 
   @DomName('SVGElementInstanceList.length')
   @DocsEditable()
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index e9d3b1e..228c9a8 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -397,7 +397,7 @@
 
   @DomName('SVGAnimatedNumber.animVal')
   @DocsEditable()
-  num get animVal native "SVGAnimatedNumber_animVal_Getter";
+  double get animVal native "SVGAnimatedNumber_animVal_Getter";
 
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
@@ -557,15 +557,15 @@
 
   @DomName('SVGAnimationElement.getCurrentTime')
   @DocsEditable()
-  num getCurrentTime() native "SVGAnimationElement_getCurrentTime_Callback";
+  double getCurrentTime() native "SVGAnimationElement_getCurrentTime_Callback";
 
   @DomName('SVGAnimationElement.getSimpleDuration')
   @DocsEditable()
-  num getSimpleDuration() native "SVGAnimationElement_getSimpleDuration_Callback";
+  double getSimpleDuration() native "SVGAnimationElement_getSimpleDuration_Callback";
 
   @DomName('SVGAnimationElement.getStartTime')
   @DocsEditable()
-  num getStartTime() native "SVGAnimationElement_getStartTime_Callback";
+  double getStartTime() native "SVGAnimationElement_getStartTime_Callback";
 
   @DomName('SVGAnimationElement.externalResourcesRequired')
   @DocsEditable()
@@ -3608,7 +3608,7 @@
 
   @DomName('SVGPathElement.getTotalLength')
   @DocsEditable()
-  num getTotalLength() native "SVGPathElement_getTotalLength_Callback";
+  double getTotalLength() native "SVGPathElement_getTotalLength_Callback";
 
   @DomName('SVGPathElement.externalResourcesRequired')
   @DocsEditable()
@@ -5538,19 +5538,19 @@
 
   @DomName('SVGSVGElement.pixelUnitToMillimeterX')
   @DocsEditable()
-  num get pixelUnitToMillimeterX native "SVGSVGElement_pixelUnitToMillimeterX_Getter";
+  double get pixelUnitToMillimeterX native "SVGSVGElement_pixelUnitToMillimeterX_Getter";
 
   @DomName('SVGSVGElement.pixelUnitToMillimeterY')
   @DocsEditable()
-  num get pixelUnitToMillimeterY native "SVGSVGElement_pixelUnitToMillimeterY_Getter";
+  double get pixelUnitToMillimeterY native "SVGSVGElement_pixelUnitToMillimeterY_Getter";
 
   @DomName('SVGSVGElement.screenPixelToMillimeterX')
   @DocsEditable()
-  num get screenPixelToMillimeterX native "SVGSVGElement_screenPixelToMillimeterX_Getter";
+  double get screenPixelToMillimeterX native "SVGSVGElement_screenPixelToMillimeterX_Getter";
 
   @DomName('SVGSVGElement.screenPixelToMillimeterY')
   @DocsEditable()
-  num get screenPixelToMillimeterY native "SVGSVGElement_screenPixelToMillimeterY_Getter";
+  double get screenPixelToMillimeterY native "SVGSVGElement_screenPixelToMillimeterY_Getter";
 
   @DomName('SVGSVGElement.useCurrentView')
   @DocsEditable()
@@ -5626,7 +5626,7 @@
 
   @DomName('SVGSVGElement.getCurrentTime')
   @DocsEditable()
-  num getCurrentTime() native "SVGSVGElement_getCurrentTime_Callback";
+  double getCurrentTime() native "SVGSVGElement_getCurrentTime_Callback";
 
   @DomName('SVGSVGElement.getElementById')
   @DocsEditable()
@@ -5827,7 +5827,7 @@
 
   @DomName('SVGTextContentElement.getComputedTextLength')
   @DocsEditable()
-  num getComputedTextLength() native "SVGTextContentElement_getComputedTextLength_Callback";
+  double getComputedTextLength() native "SVGTextContentElement_getComputedTextLength_Callback";
 
   @DomName('SVGTextContentElement.getEndPositionOfChar')
   @DocsEditable()
@@ -5843,7 +5843,7 @@
 
   @DomName('SVGTextContentElement.getRotationOfChar')
   @DocsEditable()
-  num getRotationOfChar(int offset) native "SVGTextContentElement_getRotationOfChar_Callback";
+  double getRotationOfChar(int offset) native "SVGTextContentElement_getRotationOfChar_Callback";
 
   @DomName('SVGTextContentElement.getStartPositionOfChar')
   @DocsEditable()
@@ -5851,7 +5851,7 @@
 
   @DomName('SVGTextContentElement.getSubStringLength')
   @DocsEditable()
-  num getSubStringLength(int offset, int length) native "SVGTextContentElement_getSubStringLength_Callback";
+  double getSubStringLength(int offset, int length) native "SVGTextContentElement_getSubStringLength_Callback";
 
   @DomName('SVGTextContentElement.selectSubString')
   @DocsEditable()
@@ -6032,7 +6032,7 @@
 
   @DomName('SVGTransform.angle')
   @DocsEditable()
-  num get angle native "SVGTransform_angle_Getter";
+  double get angle native "SVGTransform_angle_Getter";
 
   @DomName('SVGTransform.matrix')
   @DocsEditable()
@@ -6424,7 +6424,7 @@
 
   @DomName('SVGZoomEvent.newScale')
   @DocsEditable()
-  num get newScale native "SVGZoomEvent_newScale_Getter";
+  double get newScale native "SVGZoomEvent_newScale_Getter";
 
   @DomName('SVGZoomEvent.newTranslate')
   @DocsEditable()
@@ -6432,7 +6432,7 @@
 
   @DomName('SVGZoomEvent.previousScale')
   @DocsEditable()
-  num get previousScale native "SVGZoomEvent_previousScale_Getter";
+  double get previousScale native "SVGZoomEvent_previousScale_Getter";
 
   @DomName('SVGZoomEvent.previousTranslate')
   @DocsEditable()
diff --git a/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart b/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
index c72a299..5933b2e 100644
--- a/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
+++ b/sdk/lib/typed_data/dart2js/typed_data_dart2js.dart
@@ -11,7 +11,7 @@
 import 'dart:collection';
 import 'dart:_collection-dev';
 import 'dart:_js_helper' show Creates, JavaScriptIndexingBehavior, JSName, Null, Returns;
-import 'dart:_foreign_helper' show JS;
+import 'dart:_foreign_helper' show JS, JS_CONST;
 import 'dart:math' as Math;
 
 /**
@@ -35,6 +35,17 @@
   final int lengthInBytes;
 }
 
+// TODO(12929): Remove this constant once V8 optimizes length access of
+// typed arrays. Firefox does not like accessing a named property of a
+// typed array, so we only use the new [:$dartCachedLength:] property in V8 and
+// Chrome.
+const fetchLength = const JS_CONST(r'''
+    ((typeof version == "function" && typeof os == "object" && "system" in os)
+    || (typeof navigator == "object"
+        && navigator.userAgent.indexOf('Chrome') != -1))
+        ? function(x) { return x.$dartCachedLength || x.length; }
+        : function(x) { return x.length; };
+''');
 
 class TypedData native "ArrayBufferView" {
   @Creates('ByteBuffer')
@@ -64,6 +75,12 @@
     }
   }
 
+  // TODO(12929): Remove this method once V8 optimizes length access of
+  // typed arrays.
+  void _setCachedLength() {
+    JS('void', r'#.$dartCachedLength = #.length', this, this);
+  }
+
   int _checkSublistArguments(int start, int end, int length) {
     // For `sublist` the [start] and [end] indices are allowed to be equal to
     // [length]. However, [_checkIndex] only allows incides in the range
@@ -197,13 +214,14 @@
   void setUint8(int byteOffset, int value) native;
 
   static ByteData _create1(arg) =>
-      JS('ByteData', 'new DataView(new ArrayBuffer(#))', arg);
+      JS('ByteData', 'new DataView(new ArrayBuffer(#))', arg).._setCachedLength();
 
   static ByteData _create2(arg1, arg2) =>
-      JS('ByteData', 'new DataView(#, #)', arg1, arg2);
+      JS('ByteData', 'new DataView(#, #)', arg1, arg2).._setCachedLength();
 
   static ByteData _create3(arg1, arg2, arg3) =>
-      JS('ByteData', 'new DataView(#, #, #)', arg1, arg2, arg3);
+      JS('ByteData', 'new DataView(#, #, #)', arg1, arg2, arg3)
+          .._setCachedLength();
 }
 
 
@@ -224,7 +242,7 @@
 
   static const int BYTES_PER_ELEMENT = 4;
 
-  int get length => JS("int", "#.length", this);
+  int get length => JS("int", '#(#)', fetchLength, this);
 
   num operator[](int index) {
     _checkIndex(index, length);
@@ -239,17 +257,20 @@
   List<double> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
     var source = JS('Float32List', '#.subarray(#, #)', this, start, end);
+    source._setCachedLength();
     return _create1(source);
   }
 
   static Float32List _create1(arg) =>
-      JS('Float32List', 'new Float32Array(#)', arg);
+      JS('Float32List', 'new Float32Array(#)', arg).._setCachedLength();
 
   static Float32List _create2(arg1, arg2) =>
-      JS('Float32List', 'new Float32Array(#, #)', arg1, arg2);
+      JS('Float32List', 'new Float32Array(#, #)', arg1, arg2)
+          .._setCachedLength();
 
   static Float32List _create3(arg1, arg2, arg3) =>
-      JS('Float32List', 'new Float32Array(#, #, #)', arg1, arg2, arg3);
+      JS('Float32List', 'new Float32Array(#, #, #)', arg1, arg2, arg3)
+          .._setCachedLength();
 }
 
 
@@ -270,7 +291,7 @@
 
   static const int BYTES_PER_ELEMENT = 8;
 
-  int get length => JS("int", "#.length", this);
+  int get length => JS("int", '#(#)', fetchLength, this);
 
   num operator[](int index) {
     _checkIndex(index, length);
@@ -285,17 +306,23 @@
   List<double> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
     var source = JS('Float64List', '#.subarray(#, #)', this, start, end);
+    source._setCachedLength();
     return _create1(source);
   }
 
-  static Float64List _create1(arg) =>
-      JS('Float64List', 'new Float64Array(#)', arg);
+  static Float64List _create1(arg) {
+    return JS('Float64List', 'new Float64Array(#)', arg).._setCachedLength();
+  }
 
-  static Float64List _create2(arg1, arg2) =>
-      JS('Float64List', 'new Float64Array(#, #)', arg1, arg2);
+  static Float64List _create2(arg1, arg2) {
+    return JS('Float64List', 'new Float64Array(#, #)', arg1, arg2)
+        .._setCachedLength();
+  }
 
-  static Float64List _create3(arg1, arg2, arg3) =>
-      JS('Float64List', 'new Float64Array(#, #, #)', arg1, arg2, arg3);
+  static Float64List _create3(arg1, arg2, arg3) {
+    return JS('Float64List', 'new Float64Array(#, #, #)', arg1, arg2, arg3)
+        .._setCachedLength();
+  }
 }
 
 
@@ -315,7 +342,7 @@
 
   static const int BYTES_PER_ELEMENT = 2;
 
-  int get length => JS("int", "#.length", this);
+  int get length => JS("int", '#(#)', fetchLength, this);
 
   int operator[](int index) {
     _checkIndex(index, length);
@@ -329,18 +356,20 @@
 
   List<int> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
-    var source = JS('Int16List', '#.subarray(#, #)', this, start, end);
+    var source = JS('Int16List', '#.subarray(#, #)', this, start, end)
+        .._setCachedLength();
     return _create1(source);
   }
 
   static Int16List _create1(arg) =>
-      JS('Int16List', 'new Int16Array(#)', arg);
+      JS('Int16List', 'new Int16Array(#)', arg).._setCachedLength();
 
   static Int16List _create2(arg1, arg2) =>
-      JS('Int16List', 'new Int16Array(#, #)', arg1, arg2);
+      JS('Int16List', 'new Int16Array(#, #)', arg1, arg2).._setCachedLength();
 
   static Int16List _create3(arg1, arg2, arg3) =>
-      JS('Int16List', 'new Int16Array(#, #, #)', arg1, arg2, arg3);
+      JS('Int16List', 'new Int16Array(#, #, #)', arg1, arg2, arg3)
+          .._setCachedLength();
 }
 
 
@@ -360,7 +389,7 @@
 
   static const int BYTES_PER_ELEMENT = 4;
 
-  int get length => JS("int", "#.length", this);
+  int get length => JS("int", '#(#)', fetchLength, this);
 
   int operator[](int index) {
     _checkIndex(index, length);
@@ -374,18 +403,20 @@
 
   List<int> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
-    var source = JS('Int32List', '#.subarray(#, #)', this, start, end);
+    var source = JS('Int32List', '#.subarray(#, #)', this, start, end)
+        .._setCachedLength();
     return _create1(source);
   }
 
   static Int32List _create1(arg) =>
-      JS('Int32List', 'new Int32Array(#)', arg);
+      JS('Int32List', 'new Int32Array(#)', arg).._setCachedLength();
 
   static Int32List _create2(arg1, arg2) =>
-      JS('Int32List', 'new Int32Array(#, #)', arg1, arg2);
+      JS('Int32List', 'new Int32Array(#, #)', arg1, arg2).._setCachedLength();
 
   static Int32List _create3(arg1, arg2, arg3) =>
-      JS('Int32List', 'new Int32Array(#, #, #)', arg1, arg2, arg3);
+      JS('Int32List', 'new Int32Array(#, #, #)', arg1, arg2, arg3)
+          .._setCachedLength();
 }
 
 
@@ -405,7 +436,7 @@
 
   static const int BYTES_PER_ELEMENT = 1;
 
-  int get length => JS("int", "#.length", this);
+  int get length => JS("int", '#(#)', fetchLength, this);
 
   int operator[](int index) {
     _checkIndex(index, length);
@@ -419,18 +450,20 @@
 
   List<int> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
-    var source = JS('Int8List', '#.subarray(#, #)', this, start, end);
+    var source = JS('Int8List', '#.subarray(#, #)', this, start, end)
+        .._setCachedLength();
     return _create1(source);
   }
 
   static Int8List _create1(arg) =>
-      JS('Int8List', 'new Int8Array(#)', arg);
+      JS('Int8List', 'new Int8Array(#)', arg).._setCachedLength();
 
   static Int8List _create2(arg1, arg2) =>
-      JS('Int8List', 'new Int8Array(#, #)', arg1, arg2);
+      JS('Int8List', 'new Int8Array(#, #)', arg1, arg2).._setCachedLength();
 
   static Int8List _create3(arg1, arg2, arg3) =>
-      JS('Int8List', 'new Int8Array(#, #, #)', arg1, arg2, arg3);
+      JS('Int8List', 'new Int8Array(#, #, #)', arg1, arg2, arg3)
+          .._setCachedLength();
 }
 
 
@@ -451,7 +484,7 @@
 
   static const int BYTES_PER_ELEMENT = 2;
 
-  int get length => JS("int", "#.length", this);
+  int get length => JS("int", '#(#)', fetchLength, this);
 
   int operator[](int index) {
     _checkIndex(index, length);
@@ -465,18 +498,20 @@
 
   List<int> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
-    var source = JS('Uint16List', '#.subarray(#, #)', this, start, end);
+    var source = JS('Uint16List', '#.subarray(#, #)', this, start, end)
+        .._setCachedLength();
     return _create1(source);
   }
 
   static Uint16List _create1(arg) =>
-      JS('Uint16List', 'new Uint16Array(#)', arg);
+      JS('Uint16List', 'new Uint16Array(#)', arg).._setCachedLength();
 
   static Uint16List _create2(arg1, arg2) =>
-      JS('Uint16List', 'new Uint16Array(#, #)', arg1, arg2);
+      JS('Uint16List', 'new Uint16Array(#, #)', arg1, arg2).._setCachedLength();
 
   static Uint16List _create3(arg1, arg2, arg3) =>
-      JS('Uint16List', 'new Uint16Array(#, #, #)', arg1, arg2, arg3);
+      JS('Uint16List', 'new Uint16Array(#, #, #)', arg1, arg2, arg3)
+          .._setCachedLength();
 }
 
 
@@ -497,7 +532,7 @@
 
   static const int BYTES_PER_ELEMENT = 4;
 
-  int get length => JS("int", "#.length", this);
+  int get length => JS("int", '#(#)', fetchLength, this);
 
   int operator[](int index) {
     _checkIndex(index, length);
@@ -511,18 +546,20 @@
 
   List<int> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
-    var source = JS('Uint32List', '#.subarray(#, #)', this, start, end);
+    var source = JS('Uint32List', '#.subarray(#, #)', this, start, end)
+        .._setCachedLength();
     return _create1(source);
   }
 
   static Uint32List _create1(arg) =>
-      JS('Uint32List', 'new Uint32Array(#)', arg);
+      JS('Uint32List', 'new Uint32Array(#)', arg).._setCachedLength();
 
   static Uint32List _create2(arg1, arg2) =>
-      JS('Uint32List', 'new Uint32Array(#, #)', arg1, arg2);
+      JS('Uint32List', 'new Uint32Array(#, #)', arg1, arg2).._setCachedLength();
 
   static Uint32List _create3(arg1, arg2, arg3) =>
-      JS('Uint32List', 'new Uint32Array(#, #, #)', arg1, arg2, arg3);
+      JS('Uint32List', 'new Uint32Array(#, #, #)', arg1, arg2, arg3)
+          .._setCachedLength();
 }
 
 
@@ -556,18 +593,22 @@
 
   List<int> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
-    var source = JS('Uint8ClampedList', '#.subarray(#, #)', this, start, end);
+    var source = JS('Uint8ClampedList', '#.subarray(#, #)', this, start, end)
+        .._setCachedLength();
     return _create1(source);
   }
 
   static Uint8ClampedList _create1(arg) =>
-      JS('Uint8ClampedList', 'new Uint8ClampedArray(#)', arg);
+      JS('Uint8ClampedList', 'new Uint8ClampedArray(#)', arg)
+          .._setCachedLength();
 
   static Uint8ClampedList _create2(arg1, arg2) =>
-      JS('Uint8ClampedList', 'new Uint8ClampedArray(#, #)', arg1, arg2);
+      JS('Uint8ClampedList', 'new Uint8ClampedArray(#, #)', arg1, arg2)
+          .._setCachedLength();
 
   static Uint8ClampedList _create3(arg1, arg2, arg3) =>
-      JS('Uint8ClampedList', 'new Uint8ClampedArray(#, #, #)', arg1, arg2, arg3);
+      JS('Uint8ClampedList', 'new Uint8ClampedArray(#, #, #)', arg1, arg2, arg3)
+          .._setCachedLength();
 }
 
 
@@ -588,7 +629,7 @@
 
   static const int BYTES_PER_ELEMENT = 1;
 
-  int get length => JS("int", "#.length", this);
+  int get length => JS("int", '#(#)', fetchLength, this);
 
   int operator[](int index) {
     _checkIndex(index, length);
@@ -602,18 +643,20 @@
 
   List<int> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
-    var source = JS('Uint8List', '#.subarray(#, #)', this, start, end);
+    var source = JS('Uint8List', '#.subarray(#, #)', this, start, end)
+        .._setCachedLength();
     return _create1(source);
   }
 
   static Uint8List _create1(arg) =>
-      JS('Uint8List', 'new Uint8Array(#)', arg);
+      JS('Uint8List', 'new Uint8Array(#)', arg).._setCachedLength();
 
   static Uint8List _create2(arg1, arg2) =>
-      JS('Uint8List', 'new Uint8Array(#, #)', arg1, arg2);
+      JS('Uint8List', 'new Uint8Array(#, #)', arg1, arg2).._setCachedLength();
 
   static Uint8List _create3(arg1, arg2, arg3) =>
-      JS('Uint8List', 'new Uint8Array(#, #, #)', arg1, arg2, arg3);
+      JS('Uint8List', 'new Uint8Array(#, #, #)', arg1, arg2, arg3)
+          .._setCachedLength();
 }
 
 
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index 7c85f1d..1b1d0db 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -77,7 +77,7 @@
 
   @DomName('AudioBuffer.duration')
   @DocsEditable()
-  final num duration;
+  final double duration;
 
   @DomName('AudioBuffer.gain')
   @DocsEditable()
@@ -93,7 +93,7 @@
 
   @DomName('AudioBuffer.sampleRate')
   @DocsEditable()
-  final num sampleRate;
+  final double sampleRate;
 
   @DomName('AudioBuffer.getChannelData')
   @DocsEditable()
@@ -244,7 +244,7 @@
 
   @DomName('AudioContext.currentTime')
   @DocsEditable()
-  final num currentTime;
+  final double currentTime;
 
   @DomName('AudioContext.destination')
   @DocsEditable()
@@ -256,7 +256,7 @@
 
   @DomName('AudioContext.sampleRate')
   @DocsEditable()
-  final num sampleRate;
+  final double sampleRate;
 
   @DomName('AudioContext.createAnalyser')
   @DocsEditable()
@@ -505,15 +505,15 @@
 
   @DomName('AudioParam.defaultValue')
   @DocsEditable()
-  final num defaultValue;
+  final double defaultValue;
 
   @DomName('AudioParam.maxValue')
   @DocsEditable()
-  final num maxValue;
+  final double maxValue;
 
   @DomName('AudioParam.minValue')
   @DocsEditable()
-  final num minValue;
+  final double minValue;
 
   @DomName('AudioParam.name')
   @DocsEditable()
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index cd8b0b9..f925e65 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -92,7 +92,7 @@
 
   @DomName('AudioBuffer.duration')
   @DocsEditable()
-  num get duration native "AudioBuffer_duration_Getter";
+  double get duration native "AudioBuffer_duration_Getter";
 
   @DomName('AudioBuffer.gain')
   @DocsEditable()
@@ -112,7 +112,7 @@
 
   @DomName('AudioBuffer.sampleRate')
   @DocsEditable()
-  num get sampleRate native "AudioBuffer_sampleRate_Getter";
+  double get sampleRate native "AudioBuffer_sampleRate_Getter";
 
   @DomName('AudioBuffer.getChannelData')
   @DocsEditable()
@@ -286,7 +286,7 @@
 
   @DomName('AudioContext.currentTime')
   @DocsEditable()
-  num get currentTime native "AudioContext_currentTime_Getter";
+  double get currentTime native "AudioContext_currentTime_Getter";
 
   @DomName('AudioContext.destination')
   @DocsEditable()
@@ -298,7 +298,7 @@
 
   @DomName('AudioContext.sampleRate')
   @DocsEditable()
-  num get sampleRate native "AudioContext_sampleRate_Getter";
+  double get sampleRate native "AudioContext_sampleRate_Getter";
 
   @DomName('AudioContext.createAnalyser')
   @DocsEditable()
@@ -642,15 +642,15 @@
 
   @DomName('AudioParam.defaultValue')
   @DocsEditable()
-  num get defaultValue native "AudioParam_defaultValue_Getter";
+  double get defaultValue native "AudioParam_defaultValue_Getter";
 
   @DomName('AudioParam.maxValue')
   @DocsEditable()
-  num get maxValue native "AudioParam_maxValue_Getter";
+  double get maxValue native "AudioParam_maxValue_Getter";
 
   @DomName('AudioParam.minValue')
   @DocsEditable()
-  num get minValue native "AudioParam_minValue_Getter";
+  double get minValue native "AudioParam_minValue_Getter";
 
   @DomName('AudioParam.name')
   @DocsEditable()
diff --git a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
index 57a3f17..dc61a62 100644
--- a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
+++ b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
@@ -15,7 +15,7 @@
 import 'dart:_collection-dev' hide deprecated;
 import 'dart:html';
 import 'dart:html_common';
-import 'dart:_js_helper' show convertDartClosureToJS, Creates, JavaScriptIndexingBehavior, JSName;
+import 'dart:_js_helper' show convertDartClosureToJS, Creates, JSName;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor;
 // DO NOT EDIT - unless you are editing documentation as per:
@@ -197,7 +197,7 @@
 @DomName('SQLResultSetRowList')
 // http://www.w3.org/TR/webdatabase/#sqlresultsetrowlist
 @Experimental() // deprecated
-class SqlResultSetRowList extends Interceptor with ListMixin<Map>, ImmutableListMixin<Map> implements JavaScriptIndexingBehavior, List<Map> native "SQLResultSetRowList" {
+class SqlResultSetRowList extends Interceptor with ListMixin<Map>, ImmutableListMixin<Map> implements List<Map> native "SQLResultSetRowList" {
 
   @DomName('SQLResultSetRowList.length')
   @DocsEditable()
diff --git a/tests/async_helper.dart b/tests/async_helper.dart
deleted file mode 100644
index f1a84b3..0000000
--- a/tests/async_helper.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// This library is used for testing asynchronous tests.
-/// If a test is asynchronous, it needs to notify the testing driver
-/// about this (otherwise tests may get reported as passing [after main()
-/// finished] even if the asynchronous operations fail).
-/// Tests which can't use the unittest framework should use the helper functions
-/// in this library.
-/// This library provides two methods
-///  - asyncStart(): Needs to be called before an asynchronous operation is
-///                  scheduled.
-///  - asyncEnd(): Needs to be called as soon as the asynchronous operation
-///                ended.
-/// After the last asyncStart() called was matched with a corresponding
-/// asyncEnd() call, the testing driver will be notified that the tests is done.
-
-library async_helper;
-
-// TODO(kustermann): This is problematic because we rely on a working
-// 'dart:isolate' (i.e. it is in particular problematic with dart2js).
-// It would be nice if we could use a different mechanism for different
-// runtimes.
-import 'dart:isolate';
-
-bool _initialized = false;
-ReceivePort _port = null;
-int _asyncLevel = 0;
-
-Exception _buildException(String msg) {
-  return new Exception('Fatal: $msg. This is most likely a bug in your test.');
-}
-
-void asyncStart() {
-  if (_initialized && _asyncLevel == 0) {
-    throw _buildException('asyncStart() was called even though we are done '
-                          'with testing.');
-  }
-  if (!_initialized) {
-    print('unittest-suite-wait-for-done');
-    _initialized = true;
-    _port = new ReceivePort();
-  }
-  _asyncLevel++;
-}
-
-void asyncEnd() {
-  if (_asyncLevel <= 0) {
-    if (!_initialized) {
-      throw _buildException('asyncEnd() was called before asyncStart().');
-    } else {
-      throw _buildException('asyncEnd() was called more often than '
-                            'asyncStart().');
-    }
-  }
-  _asyncLevel--;
-  if (_asyncLevel == 0) {
-    _port.close();
-    _port = null;
-    print('unittest-suite-success');
-  }
-}
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index 014c34f..6984c32 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -25,13 +25,17 @@
 # TBF: infinite look: class A {const A();final m = const A();}
 Language/12_Expressions/01_Constants_A17_t03: fail
 
+# analyzer issue https://code.google.com/p/dart/issues/detail?id=11534
+Language/15_Types/4_Interface_Types_A11_t01: Skip
+Language/15_Types/4_Interface_Types_A11_t02: Skip
+
+
+
+
 # co19 issue #380, Strings class has been removed
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: fail, OK
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: fail, OK
 
-# co19 issue #397, List.addLast removed
-LibTest/core/Iterable/where_A01_t07: fail, OK
-
 # co19 issue #400, collection library reorg
 LibTest/core/String/String_class_A01_t01: fail, OK
 LibTest/core/String/concat_A01_t01: fail, OK
@@ -40,15 +44,6 @@
 LibTest/core/Set/isSubsetOf_A01_t01: fail, OK
 LibTest/core/Set/isSubsetOf_A01_t02: fail, OK
 
-# co19 issue #403
-LibTest/core/List/every_A01_t01: fail, OK
-
-# co19 issue #414, extra @compile-error
-Language/03_Overview/1_Scoping_A02_t28: fail, OK
-
-# co19 issue #416, function name is declared the parameter scope
-Language/03_Overview/1_Scoping_A02_t07: fail, OK
-
 # co19 issue #424, Uninitialized finals are warnings not errors
 Language/05_Variables/05_Variables_A07_t05: fail, OK
 Language/05_Variables/05_Variables_A07_t06: fail, OK
@@ -94,10 +89,6 @@
 # co19 issue #448, Collection was removed
 LibTest/collection/Queue/Queue.from_A01_t01: fail, OK
 LibTest/collection/Queue/Queue.from_A01_t02: fail, OK
-LibTest/core/List/List.from_A01_t01: fail, OK
-LibTest/core/Match/pattern_A01_t01: fail, OK
-LibTest/core/Match/str_A01_t01: fail, OK
-LibTest/core/RegExp/allMatches_A01_t01: fail, OK
 LibTest/core/Set/intersection_A01_t02: fail, OK
 
 # co19 issue 452, more method in Iterable
@@ -109,26 +100,6 @@
 Language/14_Libraries_and_Scripts/1_Imports_A02_t12: fail, OK
 Language/14_Libraries_and_Scripts/1_Imports_A02_t15: fail, OK
 
-# co19 issue #486, some override errors are now warnings
-Language/07_Classes/1_Instance_Methods_A01_t01: fail, OK
-Language/07_Classes/1_Instance_Methods_A01_t02: fail, OK
-Language/07_Classes/1_Instance_Methods_A01_t03: fail, OK
-Language/07_Classes/1_Instance_Methods_A01_t04: fail, OK
-Language/07_Classes/1_Instance_Methods_A01_t05: fail, OK
-Language/07_Classes/1_Instance_Methods_A01_t06: fail, OK
-Language/07_Classes/1_Instance_Methods_A02_t02: fail, OK
-Language/07_Classes/1_Instance_Methods_A02_t05: fail, OK
-Language/07_Classes/1_Instance_Methods_A06_t01: fail, OK
-Language/07_Classes/1_Instance_Methods_A06_t02: fail, OK
-Language/07_Classes/4_Abstract_Instance_Members_A03_t01: fail, OK
-Language/07_Classes/4_Abstract_Instance_Members_A03_t02: fail, OK
-Language/07_Classes/4_Abstract_Instance_Members_A03_t03: fail, OK
-Language/07_Classes/4_Abstract_Instance_Members_A03_t04: fail, OK
-Language/07_Classes/4_Abstract_Instance_Members_A03_t05: fail, OK
-Language/07_Classes/4_Abstract_Instance_Members_A04_t01: fail, OK
-Language/07_Classes/4_Abstract_Instance_Members_A04_t05: fail, OK
-Language/07_Classes/4_Abstract_Instance_Members_A04_t06: fail, OK
-
 # co19 issue #513, rules for finals were loosened, contradiction in spec was fixed
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A21_t01: fail, OK
 
@@ -163,9 +134,6 @@
 Language/12_Expressions/01_Constants_A12_t01: fail, OK
 Language/12_Expressions/01_Constants_A13_t06: fail, OK
 
-# co19 issue #397, List.addLast being removed
-Language/12_Expressions/06_Lists_A06_t01: fail, OK
-
 # co19 issue #519, ++5 is not assignable
 Language/12_Expressions/07_Maps_A01_t01: fail, OK
 
@@ -224,9 +192,6 @@
 # co19 issue #530, garbage
 Language/12_Expressions/32_Type_Test_A04_t02: fail, OK
 
-# co19 issue #531, void f(void f()) {f();} is error. Gilad: The formal parameter conflicts with the name of the function.
-Language/13_Statements/04_Local_Function_Declaration_A01_t01: fail, OK
-
 # co19 issue #541: tests contain unqualified reference to static members defined in superclass
 Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t07: fail, OK
 Language/12_Expressions/30_Identifier_Reference_A14_t03: fail, OK
@@ -234,8 +199,8 @@
 # co19 issue #543: invocation of a non-function
 Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t02: fail, OK
 
+LibTest/core/NoSuchMethodError/NoSuchMethodError_A01_t01: Fail, OK # co19 issue 556
 
-# co19-roll r546 (11.08.2013) caused these failures
 Language/13_Statements/11_Return_A07_t01: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/11_Try_A02_t03: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/11_Try_A03_t03: fail # co19-roll r546: Please triage this failure
@@ -247,11 +212,8 @@
 Language/14_Libraries_and_Scripts/2_Exports_A05_t01: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/5_URIs_A01_t24: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/5_URIs_A01_t25: fail # co19-roll r546: Please triage this failure
-Language/15_Types/1_Static_Types_A03_t01: fail # co19-roll r546: Please triage this failure
-Language/15_Types/5_Function_Types_A01_t01: fail # co19-roll r546: Please triage this failure
 Language/15_Types/6_Type_dynamic_A03_t01: fail # co19-roll r546: Please triage this failure
 Language/15_Types/6_Type_dynamic_A04_t01: fail # co19-roll r546: Please triage this failure
-Language/16_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail # co19-roll r546: Please triage this failure
 LibTest/async/EventTransformStream/asBroadcastStream_A01_t02: fail # co19-roll r546: Please triage this failure
 LibTest/async/EventTransformStream/distinct_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/EventTransformStream/distinct_A01_t02: fail # co19-roll r546: Please triage this failure
@@ -293,7 +255,6 @@
 LibTest/async/StreamIterator/cancel_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/listen_A04_t01: fail # co19-roll r546: Please triage this failure
-LibTest/async/StreamSink/close_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/Stream_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/Stream.fromFuture_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/Stream.fromFuture_A02_t02: fail # co19-roll r546: Please triage this failure
@@ -305,9 +266,9 @@
 LibTest/async/Timer/Timer.periodic_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Timer/Timer.periodic_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/DateTime/compareTo_A02_t01: fail # co19-roll r546: Please triage this failure
-LibTest/core/DateTime/isAtSameMomentAs_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/DateTime/subtract_A02_t01: fail # co19-roll r546: Please triage this failure
-LibTest/core/double/parse_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/double/truncate_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/core/double/truncate_A01_t05: fail # co19-roll r559: Please triage this failure
 LibTest/core/Duration/operator_div_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/Duration/operator_eq_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/Duration/operator_gt_A01_t01: fail # co19-roll r546: Please triage this failure
@@ -339,11 +300,8 @@
 LibTest/core/List/replaceRange_A01_t02: fail # co19-roll r546: Please triage this failure
 LibTest/core/List/skipWhile_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/List/takeWhile_A02_t01: fail # co19-roll r546: Please triage this failure
-LibTest/core/List/toList_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/List/toList_A01_t03: fail # co19-roll r546: Please triage this failure
-LibTest/core/List/toSet_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/StringBuffer/writeAll_A03_t01: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/isolate_api/spawnFunction_A03_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/isolate_api/streamSpawnFunction_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateSink/add_A01_t02: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
@@ -354,9 +312,4 @@
 LibTest/isolate/IsolateStream/contains_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateStream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/IsolateStream/last_A01_t01: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/IsolateStream/length_A01_t01: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/IsolateStream/single_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/SendPort/send_A02_t02: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/SendPort/send_A02_t03: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/SendPort/send_A02_t04: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 67c183c..f80c456 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -3,7 +3,6 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2analyzer ]
-
 # not clear: g([var foo = foo + 10]) is parameter 'foo' in the scope of its own initialzer?
 Language/06_Functions/2_Formal_Parameters_A02_t02: fail
 
@@ -16,16 +15,27 @@
 # TBF: _f is private, so does not collide
 Language/07_Classes/1_Instance_Methods_A05_t08: fail
 
+# TBD: should we check that argument for dynamic parameter of constant constructor is not compatible with operation that is performed with it?
+Language/12_Expressions/01_Constants_A16_t03: fail
+
+# TBD: should we report _error_ when constant creation uses arguments with types incompatible with parameters?
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: fail
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t03: fail
+
+# TBF: infinite look: class A {const A();final m = const A();}
+Language/12_Expressions/01_Constants_A17_t03: fail
+
+# analyzer issue https://code.google.com/p/dart/issues/detail?id=11534
+Language/15_Types/4_Interface_Types_A11_t01: Skip
+Language/15_Types/4_Interface_Types_A11_t02: Skip
+
+
+
+
 # co19 issue #380, Strings class has been removed
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: fail, OK
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: fail, OK
 
-# co19 issue #389, ceil, floor, truncate and round return integers
-LibTest/core/int/operator_division_A01_t01: fail, OK
-
-# co19 issue #397, List.addLast removed
-LibTest/core/Iterable/where_A01_t07: fail, OK
-
 # co19 issue #400, collection library reorg
 LibTest/core/String/String_class_A01_t01: fail, OK
 LibTest/core/String/concat_A01_t01: fail, OK
@@ -34,19 +44,6 @@
 LibTest/core/Set/isSubsetOf_A01_t01: fail, OK
 LibTest/core/Set/isSubsetOf_A01_t02: fail, OK
 
-# co19 issue #403
-LibTest/core/List/every_A01_t01: fail, OK
-
-# co19 issue #414, extra @compile-error
-Language/03_Overview/1_Scoping_A02_t28: fail, OK
-
-# co19 issue #416, function name is declared the parameter scope
-Language/03_Overview/1_Scoping_A02_t07: fail, OK
-
-# analyzer issue https://code.google.com/p/dart/issues/detail?id=11534
-Language/15_Types/4_Interface_Types_A11_t01: Skip
-Language/15_Types/4_Interface_Types_A11_t02: Skip
-
 # co19 issue #424, Uninitialized finals are warnings not errors
 Language/05_Variables/05_Variables_A07_t05: fail, OK
 Language/05_Variables/05_Variables_A07_t06: fail, OK
@@ -75,10 +72,6 @@
 LibTest/core/double/ceil_A01_t05: fail, OK
 LibTest/core/double/floor_A01_t05: fail, OK
 
-# co19 issue #434, argument definition was dropped
-#Language/11_Expressions/33_Argument_Definition_Test_A01_t14: fail, OK (this is passing for the wrong reason)
-#Language/11_Expressions/33_Argument_Definition_Test_A01_t18: fail, OK (this is passing for the wrong reason)
-
 # co19 issue 459, FallThroughError is no longer const
 LibTest/core/FallThroughError/FallThroughError_A01_t01: Fail, OK
 
@@ -90,80 +83,124 @@
 # co19 issue #464, not initialized final instance variable is warning, not error
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: fail
 
+# co19 issue #442, undefined name "Expect"
+Language/15_Types/4_Interface_Types_A08_t03: fail, OK
+
 # co19 issue #448, Collection was removed
 LibTest/collection/Queue/Queue.from_A01_t01: fail, OK
 LibTest/collection/Queue/Queue.from_A01_t02: fail, OK
-LibTest/core/List/List.from_A01_t01: fail, OK
-LibTest/core/Match/pattern_A01_t01: fail, OK
-LibTest/core/Match/str_A01_t01: fail, OK
-LibTest/core/RegExp/allMatches_A01_t01: fail, OK
 LibTest/core/Set/intersection_A01_t02: fail, OK
 
 # co19 issue 452, more method in Iterable
 LibTest/core/Set/Set.from_A01_t02: fail, OK
 
-# co19-roll r546 (11.08.2013) caused these failures
-Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
-Language/05_Variables/05_Variables_A05_t02: fail # co19-roll r546: Please triage this failure
-Language/05_Variables/05_Variables_A05_t03: fail # co19-roll r546: Please triage this failure
-Language/07_Classes/3_Setters_A08_t01: fail # co19-roll r546: Please triage this failure
-Language/07_Classes/3_Setters_A08_t02: fail # co19-roll r546: Please triage this failure
-Language/07_Classes/3_Setters_A08_t03: fail # co19-roll r546: Please triage this failure
-Language/07_Classes/3_Setters_A08_t04: fail # co19-roll r546: Please triage this failure
-Language/07_Classes/3_Setters_A08_t05: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/01_Constants_A01_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/01_Constants_A11_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/01_Constants_A12_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/01_Constants_A13_t06: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/01_Constants_A16_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/01_Constants_A16_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/01_Constants_A16_t03: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/01_Constants_A17_t03: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/03_Numbers_A01_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/03_Numbers_A01_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/03_Numbers_A01_t03: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/03_Numbers_A01_t04: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/03_Numbers_A01_t08: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/03_Numbers_A01_t10: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/06_Lists_A06_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/07_Maps_A01_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/08_Throw_A05_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/08_Throw_A05_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/08_Throw_A05_t03: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A01_t04: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A02_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A02_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A02_t07: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A05_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A05_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A05_t03: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A06_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A06_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A06_t03: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A06_t04: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A06_t05: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A06_t06: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A06_t07: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A06_t08: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A06_t09: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A06_t12: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/2_Const_A09_t03: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation_A01_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation_A01_t05: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation_A01_t06: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation_A01_t08: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t07: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/32_Type_Test_A04_t02: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/02_Expression_Statements_A01_t06: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/04_Local_Function_Declaration_A01_t01: fail # co19-roll r546: Please triage this failure
+# co19 issue #455, undeclared identifier is static warning
+Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t10: fail, OK
+Language/13_Statements/04_Local_Function_Declaration_A02_t02: fail, OK
+Language/14_Libraries_and_Scripts/1_Imports_A02_t12: fail, OK
+Language/14_Libraries_and_Scripts/1_Imports_A02_t15: fail, OK
+
+# co19 issue #513, rules for finals were loosened, contradiction in spec was fixed
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A21_t01: fail, OK
+
+# co19 issue #514, it is still an error to have both a n initializing formal and an initializer in the constructor's initializer list
+Language/05_Variables/05_Variables_A05_t03: fail, OK
+
+# co19 issue #515, it is a compile-time error if there is more than one entity with the same name declared in the same scope
+Language/07_Classes/3_Setters_A08_t01: fail, OK
+Language/07_Classes/3_Setters_A08_t02: fail, OK
+Language/07_Classes/3_Setters_A08_t03: fail, OK
+Language/07_Classes/3_Setters_A08_t04: fail, OK
+
+# co19 issue #516, it is a compile-time error if a class has both a getter and a method with the same name.
+Language/07_Classes/3_Setters_A08_t05: fail, OK
+
+# co19 issue #438, Static variables are initialized lazily, need not be constants
+Language/12_Expressions/01_Constants_A16_t01: fail, OK
+Language/12_Expressions/01_Constants_A16_t02: fail, OK
+
+# co19 issue #517, +5 is not a valid expression
+Language/12_Expressions/01_Constants_A01_t01: fail, OK
+Language/12_Expressions/03_Numbers_A01_t01: fail, OK
+Language/12_Expressions/03_Numbers_A01_t02: fail, OK
+Language/12_Expressions/03_Numbers_A01_t03: fail, OK
+Language/12_Expressions/03_Numbers_A01_t04: fail, OK
+Language/12_Expressions/03_Numbers_A01_t08: fail, OK
+Language/12_Expressions/03_Numbers_A01_t10: fail, OK
+Language/13_Statements/02_Expression_Statements_A01_t06: fail, OK
+
+# co19 issue #518, It is a compile-time error if evaluation of a compile-time constant would raise an exception
+Language/12_Expressions/01_Constants_A11_t01: fail, OK
+Language/12_Expressions/01_Constants_A12_t01: fail, OK
+Language/12_Expressions/01_Constants_A13_t06: fail, OK
+
+# co19 issue #519, ++5 is not assignable
+Language/12_Expressions/07_Maps_A01_t01: fail, OK
+
+# co19 issue #420, "throw" requires expression, "rethrow" should be used instead
+Language/12_Expressions/08_Throw_A05_t01: fail, OK
+Language/12_Expressions/08_Throw_A05_t02: fail, OK
+Language/12_Expressions/08_Throw_A05_t03: fail, OK
+
+# co19 issue #454 (wrongly closed)
+Language/12_Expressions/12_Instance_Creation/1_New_A01_t04: fail, OK
+
+# co19 issue #521, attempt to create instance of not a class
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t01: fail, OK
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t02: fail, OK
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail, OK
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail, OK
+Language/12_Expressions/12_Instance_Creation/1_New_A02_t07: fail, OK
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t03: fail, OK
+
+# co19 issue #523, new malbound type
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t01: fail, OK
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t02: fail, OK
+Language/12_Expressions/12_Instance_Creation/1_New_A05_t03: fail, OK
+
+# co19 issue #524, new abstract class
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t01: fail, OK
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t02: fail, OK
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t12: fail, OK
+
+# co19 issue #526, use undefined constructor
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t04: fail, OK
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t05: fail, OK
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t06: fail, OK
+
+# co19 issue #527, not enough or extra positional parameters; no such named paramater
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t07: fail, OK
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t08: fail, OK
+Language/12_Expressions/12_Instance_Creation/1_New_A06_t09: fail, OK
+
+# co19 issue #528, Const: wrong number of type arguments
+Language/12_Expressions/12_Instance_Creation_A01_t02: fail, OK
+Language/12_Expressions/12_Instance_Creation_A01_t05: fail, OK
+Language/12_Expressions/12_Instance_Creation_A01_t06: fail, OK
+
+# co19 issue #529, const instance creation with invalid type arguments
+Language/12_Expressions/12_Instance_Creation_A01_t08: fail, OK
+
+# co19 issue #388 (wrongly closed), StringBuffer methods changed
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail, OK
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail, OK
+
+# co19 issue #433 (wrongly closed), missing @static-warning annotation
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t01: fail, OK
+Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A03_t07: fail, OK
+
+# co19 issue #530, garbage
+Language/12_Expressions/32_Type_Test_A04_t02: fail, OK
+
+# co19 issue #541: tests contain unqualified reference to static members defined in superclass
+Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t07: fail, OK
+Language/12_Expressions/30_Identifier_Reference_A14_t03: fail, OK
+
+# co19 issue #543: invocation of a non-function
+Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A03_t02: fail, OK
+
+LibTest/core/NoSuchMethodError/NoSuchMethodError_A01_t01: Fail, OK # co19 issue 556
+
 Language/13_Statements/11_Return_A07_t01: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/11_Try_A02_t03: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/11_Try_A03_t03: fail # co19-roll r546: Please triage this failure
@@ -175,10 +212,8 @@
 Language/14_Libraries_and_Scripts/2_Exports_A05_t01: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/5_URIs_A01_t24: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/5_URIs_A01_t25: fail # co19-roll r546: Please triage this failure
-Language/15_Types/1_Static_Types_A03_t01: fail # co19-roll r546: Please triage this failure
 Language/15_Types/6_Type_dynamic_A03_t01: fail # co19-roll r546: Please triage this failure
 Language/15_Types/6_Type_dynamic_A04_t01: fail # co19-roll r546: Please triage this failure
-Language/16_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail # co19-roll r546: Please triage this failure
 LibTest/async/EventTransformStream/asBroadcastStream_A01_t02: fail # co19-roll r546: Please triage this failure
 LibTest/async/EventTransformStream/distinct_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/EventTransformStream/distinct_A01_t02: fail # co19-roll r546: Please triage this failure
@@ -187,6 +222,7 @@
 LibTest/async/EventTransformStream/EventTransformStream_A01_t02: fail # co19-roll r546: Please triage this failure
 LibTest/async/EventTransformStream/expand_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/EventTransformStream/first_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/EventTransformStream/handleError_A03_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/EventTransformStream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/EventTransformStream/listen_A04_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/EventTransformStream/transform_A01_t01: fail # co19-roll r546: Please triage this failure
@@ -213,12 +249,12 @@
 LibTest/async/StreamEventTransformer/handleDone_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/StreamEventTransformer/handleError_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/expand_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/handleError_A03_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/isBroadcast_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
 LibTest/async/StreamIterator/cancel_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/listen_A03_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/listen_A04_t01: fail # co19-roll r546: Please triage this failure
-LibTest/async/StreamSink/close_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/Stream_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/Stream.fromFuture_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/Stream.fromFuture_A02_t02: fail # co19-roll r546: Please triage this failure
@@ -230,9 +266,9 @@
 LibTest/async/Timer/Timer.periodic_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Timer/Timer.periodic_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/DateTime/compareTo_A02_t01: fail # co19-roll r546: Please triage this failure
-LibTest/core/DateTime/isAtSameMomentAs_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/DateTime/subtract_A02_t01: fail # co19-roll r546: Please triage this failure
-LibTest/core/double/parse_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/double/truncate_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/core/double/truncate_A01_t05: fail # co19-roll r559: Please triage this failure
 LibTest/core/Duration/operator_div_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/Duration/operator_eq_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/Duration/operator_gt_A01_t01: fail # co19-roll r546: Please triage this failure
@@ -264,11 +300,8 @@
 LibTest/core/List/replaceRange_A01_t02: fail # co19-roll r546: Please triage this failure
 LibTest/core/List/skipWhile_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/List/takeWhile_A02_t01: fail # co19-roll r546: Please triage this failure
-LibTest/core/List/toList_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/List/toList_A01_t03: fail # co19-roll r546: Please triage this failure
-LibTest/core/List/toSet_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/StringBuffer/writeAll_A03_t01: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/isolate_api/spawnFunction_A03_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/isolate_api/streamSpawnFunction_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateSink/add_A01_t02: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateSink/addError_A01_t01: fail # co19-roll r546: Please triage this failure
@@ -279,9 +312,4 @@
 LibTest/isolate/IsolateStream/contains_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateStream/isBroadcast_A01_t02: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/IsolateStream/last_A01_t01: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/IsolateStream/length_A01_t01: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/IsolateStream/single_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/SendPort/send_A02_t02: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/SendPort/send_A02_t03: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/SendPort/send_A02_t04: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index de5a6db..12b1782 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -9,10 +9,14 @@
 ### GENERAL FAILURES ###
 
 [ $runtime == vm || $compiler == dart2js ]
+Language/13_Statements/11_Try_A02_t03: fail # co19 issue 552
+Language/13_Statements/11_Try_A03_t03: fail # co19 issue 552
+Language/13_Statements/11_Try_A04_t03: fail # co19 issue 552
+Language/13_Statements/11_Try_A07_t03: fail # co19 issue 553
+
 Language/07_Classes/6_Constructors_A02_t01: SKIP # co19 issue 415.
-Language/16_Reference/1_Lexical_Rules/2_Comments_A04_t03: FAIL, OK # co19 issue 505
-Language/15_Types/1_Static_Types_A03_t01: FAIL, OK # co19 issue 506
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t01: FAIL, OK # co19 issue 426
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: FAIL, OK # co19 issue 547
 
 LibTest/math/acos_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/asin_A01_t01: PASS, FAIL, OK # co19 issue 44
@@ -28,7 +32,6 @@
 LibTest/math/tan_A01_t01: PASS, FAIL, OK  # co19 issue 44
 
 LibTest/collection/Queue/iterator_current_A01_t02: FAIL, OK # co19 issue 475
-LibTest/collection/Queue/iterator_moveNext_A01_t02: FAIL, OK # co19 issue 475
 
 LibTest/core/double/ceil_A01_t03: FAIL, OK # co19 issue 389
 LibTest/core/double/ceil_A01_t04: FAIL, OK # co19 issue 389
@@ -36,18 +39,12 @@
 LibTest/core/double/floor_A01_t04: FAIL, OK # co19 issue 389
 LibTest/core/double/round_A01_t02: FAIL, OK # co19 issue 389
 LibTest/core/double/round_A01_t04: FAIL, OK # co19 issue 389
-LibTest/core/double/parse_A02_t01: FAIL, OK # co19 issue 418
 LibTest/core/double/truncate_A01_t03: FAIL, OK # co19 issue 389
 LibTest/core/double/truncate_A01_t04: FAIL, OK # co19 issue 389
 
 LibTest/core/int/toStringAsExponential_A02_t01: FAIL, OK # co19 issue 477
-LibTest/core/Iterable/any_A01_t04: FAIL, OK # co19 issue 508.
-LibTest/core/List/skip_A03_t01: FAIL, OK # co19 issue 502
-LibTest/core/List/take_A02_t01: FAIL, OK # co19 issue 502
-LibTest/core/Match/pattern_A01_t01: FAIL, OK # co19 Issue 400, 422
-LibTest/core/RegExp/allMatches_A01_t01: FAIL, OK # co19 Issue 400, 422
 
-LibTest/async/Stream/Stream.periodic_A01_t01: PASS, FAIL, OK # co19 issue 538
+LibTest/async/Stream/Stream.periodic_A01_t01: TIMEOUT, PASS, FAIL, OK # co19 issue 538
 LibTest/async/Stream/Stream.periodic_A03_t01: PASS, FAIL, OK # co19 issue 538
 LibTest/async/Timer/run_A01_t01: PASS, FAIL, OK # co19 issue 538
 LibTest/async/Timer/Timer_A01_t01: PASS, FAIL, OK # co19 issue 538
@@ -55,17 +52,10 @@
 LibTest/async/Timer/Timer.periodic_A01_t01: PASS, FAIL, OK # co19 issue 537
 LibTest/async/Timer/Timer.periodic_A02_t01: PASS, FAIL, OK # co19 issue 538
 LibTest/async/Future/Future.delayed_A01_t02: PASS, FAIL, OK # co19 issue 536
-LibTest/core/DateTime/isAtSameMomentAs_A01_t01: FAIL, OK # co19 issue 503
-LibTest/core/DateTime/year_A01_t01: FAIL, OK # co19 issue 504
-LibTest/core/double/parse_A01_t01: FAIL, OK # co19 issue 503
 
 LibTest/isolate/SendPort/send_A02_t02: SKIP # co19 issue 493
 LibTest/isolate/SendPort/send_A02_t03: SKIP # co19 issue 495
 
-Utils/tests/Expect/listEquals_A02_t01: FAIL, OK # co19 issue 499
-Utils/tests/Expect/listEquals_A03_t01: FAIL, OK # co19 issue 500
-Utils/tests/Expect/setEquals_A02_t01: FAIL, OK # co19 issue 499
-
 LibTest/isolate/isolate_api/streamSpawnFunction_A02_t02: PASS, FAIL, OK # co19 issue 540
 LibTest/isolate/isolate_api/streamSpawnFunction_A02_t03: PASS, FAIL, OK # co19 issue 540
 LibTest/isolate/IsolateStream/contains_A02_t01: PASS, FAIL, OK # co19 issue 540
@@ -75,21 +65,305 @@
 LibTest/async/EventTransformStream/elementAt_A03_t01: FAIL # co19 issue 545
 LibTest/async/Stream/elementAt_A03_t01: FAIL # co19 issue 545
 
+LibTest/typed_data/Float32x4/wwww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwwx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwwy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwwz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wwzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxwx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxwy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxwz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wxzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wyww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wywx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wywy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wywz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wyxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wyxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wyxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wyxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wyyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wyyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wyyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wyyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wyzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wyzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wyzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wyzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzwx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzwy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzwz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/wzzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwwx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwwy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwwz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xwzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxwx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxwy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxwz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xxzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xyww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xywx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xywy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xywz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xyxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xyxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xyxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xyxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xyyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xyyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xyyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xyyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xyzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xyzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xyzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xyzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzwx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzwy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzwz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/xzzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywwx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywwy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywwz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/ywzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxwx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxwy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxwz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yxzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yyww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yywx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yywy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yywz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yyxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yyxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yyxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yyxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yyyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yyyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yyyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yyyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yyzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yyzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yyzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yyzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzwx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzwy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzwz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/yzzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwwx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwwy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwwz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zwzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxwx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxwy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxwz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zxzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zyww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zywx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zywy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zywz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zyxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zyxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zyxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zyxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zyyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zyyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zyyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zyyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zyzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zyzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zyzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zyzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzww_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzwx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzwy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzwz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzxw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzxx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzxy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzxz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzyw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzyx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzyy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzyz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzzw_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzzx_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzzy_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Float32x4/zzzz_A01_t01: FAIL, OK # co19 issue 546
+LibTest/typed_data/Int8List/Int8List.fromList_A01_t02: Fail # co19-roll r559: Please triage this failure
+
+LibTest/typed_data/Float32List/removeAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Float32List/retainAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Float32x4List/removeAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Float32x4List/retainAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Float64List/removeAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Float64List/retainAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Int16List/removeAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Int16List/retainAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Int32List/removeAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Int32List/retainAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Int64List/removeAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Int64List/retainAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Int8List/removeAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Int8List/retainAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Uint16List/removeAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Uint16List/retainAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Uint32List/removeAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Uint32List/retainAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Uint64List/removeAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Uint64List/retainAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Uint8ClampedList/removeAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Uint8ClampedList/retainAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Uint8List/removeAll_A01_t01: Fail  # co19 issue 548
+LibTest/typed_data/Uint8List/retainAll_A01_t01: Fail  # co19 issue 548
+
+
 ### CHECKED MODE FAILURES ###
 
 [ ($runtime == vm || $compiler == dart2js) && $checked]
-Language/13_Statements/09_Switch_A05_t01: FAIL, OK  # co19 issue 498
+Language/13_Statements/09_Switch_A05_t01: FAIL, OK # co19 issue 498
 Language/14_Libraries_and_Scripts/1_Imports_A03_t26: FAIL, OK  # co19 issue 498
+Language/15_Types/1_Static_Types_A03_t01: Fail # co19-roll r559: Please triage this failure
 Language/15_Types/1_Static_Types_A03_t03: FAIL, OK  # co19 issue 498
 Language/15_Types/1_Static_Types_A03_t04: FAIL, OK  # co19 issue 498
-LibTest/async/EventTransformStream/asBroadcastStream_A01_t01: FAIL, OK  # co19 issue 498
 LibTest/async/EventTransformStream/contains_A01_t01: FAIL, OK  # co19 issue 498
 LibTest/async/EventTransformStream/contains_A02_t01: FAIL, OK  # co19 issue 498
 LibTest/async/EventTransformStream/distinct_A01_t01: FAIL, OK  # co19 issue 498
 LibTest/async/EventTransformStream/drain_A01_t01: FAIL, OK  # co19 issue 498
+LibTest/async/EventTransformStream/first_A03_t01: FAIL, OK  # co19 issue 498
 LibTest/async/EventTransformStream/firstWhere_A01_t01: FAIL, OK  # co19 issue 498
 LibTest/async/EventTransformStream/firstWhere_A02_t01: FAIL, OK  # co19 issue 498
-LibTest/async/EventTransformStream/first_A03_t01: FAIL, OK  # co19 issue 498
 LibTest/async/EventTransformStream/fold_A01_t01: FAIL, OK  # co19 issue 498
 LibTest/async/EventTransformStream/fold_A01_t02: FAIL, OK  # co19 issue 498
 LibTest/async/EventTransformStream/forEach_A01_t01: FAIL, OK  # co19 issue 498
@@ -114,6 +388,7 @@
 LibTest/async/EventTransformStream/where_A01_t01: FAIL, OK  # co19 issue 498
 LibTest/async/EventTransformStream/where_A01_t02: FAIL, OK  # co19 issue 498
 LibTest/async/Stream/drain_A01_t01: FAIL, OK  # co19 issue 498
+LibTest/async/StreamEventTransformer/bind_A01_t01: FAIL, OK  # co19 issue 498
 LibTest/async/Stream/firstWhere_A01_t01: FAIL, OK  # co19 issue 498
 LibTest/async/Stream/firstWhere_A02_t01: FAIL, OK  # co19 issue 498
 LibTest/async/Stream/fold_A01_t01: FAIL, OK  # co19 issue 498
@@ -127,7 +402,6 @@
 LibTest/async/Stream/transform_A01_t01: FAIL, OK  # co19 issue 498
 LibTest/async/Stream/where_A01_t01: FAIL, OK  # co19 issue 498
 LibTest/async/Stream/where_A01_t02: FAIL, OK  # co19 issue 498
-LibTest/async/StreamEventTransformer/bind_A01_t01: FAIL, OK  # co19 issue 498
 LibTest/core/DateTime/compareTo_A02_t01: FAIL, OK  # co19 issue 498
 LibTest/core/List/join_A01_t01: FAIL, OK  # co19 issue 498
 LibTest/core/List/removeAt_A02_t01: FAIL, OK  # co19 issue 498
@@ -138,6 +412,4 @@
 LibTest/core/TypeError/line_A01_t01: FAIL, OK # co19 issue 510
 LibTest/core/TypeError/srcType_A01_t01: FAIL, OK # co19 issue 510
 LibTest/core/TypeError/url_A01_t01: FAIL, OK # co19 issue 510
-LibTest/isolate/IsolateStream/last_A01_t01: FAIL, OK # co19 issue 498
-LibTest/isolate/IsolateStream/length_A01_t01: FAIL, OK # co19 issue 498
-LibTest/isolate/IsolateStream/single_A01_t01: FAIL, OK # co19 issue 498
+LibTest/core/NoSuchMethodError/NoSuchMethodError_A01_t01: Fail # co19 issue 550
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index a7ed9ce..1688c19 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -12,10 +12,8 @@
 LibTest/core/double/floor_A01_t05: Fail # issue 428
 LibTest/core/double/ceil_A01_t05: Fail # issue 428
 
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: Fail # TODO(dart2dart-team): Please triage this failure.
 Language/07_Classes/9_Superclasses/1_Inheritance_and_Overriding_A01_t03: Fail # TODO(dart2dart-team): Please triage this failure.
 LibTest/collection/Queue/iterator_current_A01_t02: Fail # co19 issue 475
-LibTest/collection/Queue/iterator_moveNext_A01_t02: Fail # co19 issue 475
 LibTest/core/int/toStringAsExponential_A02_t01: Fail # co19 issue 477
 
 Language/03_Overview/1_Scoping_A01_t39: Fail # http://dartbug.com/7202
@@ -29,14 +27,12 @@
 Language/03_Overview/1_Scoping_A01_t41: Fail # http://dartbug.com/5519
 Language/03_Overview/1_Scoping_A02_t05: Fail # Inherited from dart2js
 Language/03_Overview/1_Scoping_A02_t06: Fail # inherited from dart2js
-Language/03_Overview/1_Scoping_A02_t07: Fail # inherited from dart2js
 Language/05_Variables/05_Variables_A01_t04: Fail # http://dartbug.com/5519
 Language/05_Variables/05_Variables_A01_t05: Fail # http://dartbug.com/5519
 Language/05_Variables/05_Variables_A01_t08: Fail # http://dartbug.com/5519
 Language/05_Variables/05_Variables_A01_t12: Fail # http://dartbug.com/5519
 Language/05_Variables/05_Variables_A01_t13: Fail # http://dartbug.com/5519
 Language/05_Variables/05_Variables_A01_t14: Fail # http://dartbug.com/5519
-Language/05_Variables/05_Variables_A01_t15: Fail # http://dartbug.com/5519
 Language/05_Variables/05_Variables_A07_t05: Fail # Inherited from dart2js
 Language/05_Variables/05_Variables_A07_t06: Fail # Inherited from dart2js
 Language/05_Variables/05_Variables_A07_t07: Fail # Inherited from dart2js
@@ -65,20 +61,7 @@
 Language/07_Classes/07_Classes_A02_t02: Fail # http://dartbug.com/5519
 Language/07_Classes/07_Classes_A02_t04: Fail # http://dartbug.com/5519
 Language/07_Classes/07_Classes_A02_t11: Fail # http://dartbug.com/5519
-Language/07_Classes/07_Classes_A03_t02: Fail # http://dartbug.com/5519
-Language/07_Classes/07_Classes_A03_t07: Fail # inherited from dart2js
-Language/07_Classes/07_Classes_A03_t08: Fail # inherited from dart2js
-Language/07_Classes/07_Classes_A03_t09: Fail # inherited from dart2js
 Language/07_Classes/07_Classes_A03_t10: Fail # http://dartbug.com/6687
-Language/07_Classes/07_Classes_A04_t19: Fail # inherited from dart2js
-Language/07_Classes/07_Classes_A04_t21: Fail # inherited from dart2js
-Language/07_Classes/07_Classes_A04_t22: Fail # inherited from dart2js
-Language/07_Classes/07_Classes_A04_t24: Fail # inherited from dart2js
-Language/07_Classes/07_Classes_A04_t25: Fail # inherited from dart2js
-Language/07_Classes/1_Instance_Methods_A02_t02: Fail # http://dartbug.com/5519
-Language/07_Classes/1_Instance_Methods_A02_t05: Fail # http://dartbug.com/5519
-Language/07_Classes/1_Instance_Methods_A06_t01: Fail # Inherited from dart2js
-Language/07_Classes/1_Instance_Methods_A06_t02: Fail # Inherited from dart2js
 Language/07_Classes/3_Setters_A04_t01: Fail # inherited from VM
 Language/07_Classes/3_Setters_A04_t02: Fail # inherited from VM
 Language/07_Classes/3_Setters_A04_t03: Fail # inherited from VM
@@ -86,12 +69,8 @@
 Language/07_Classes/3_Setters_A04_t05: Fail # inherited from VM
 Language/07_Classes/3_Setters_A04_t06: Fail # inherited from VM
 Language/07_Classes/3_Setters_A04_t07: Fail # inherited from VM
-Language/07_Classes/4_Abstract_Instance_Members_A04_t01: Fail # http://dartbug.com/5519
-Language/07_Classes/4_Abstract_Instance_Members_A04_t05: Fail # inherited from VM
-Language/07_Classes/4_Abstract_Instance_Members_A04_t06: Fail # inherited from VM
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Fail # http://dartbug.com/5519
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A15_t07: Fail # inherited from VM
-Language/07_Classes/6_Constructors/2_Factories_A01_t05: Fail # Inherited from dartjs
 Language/07_Classes/6_Constructors/2_Factories_A07_t01: Fail # inherited from VM
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A03_t01: Fail # http://dartbug.com/5519
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A04_t01: Fail # inherited from VM
@@ -103,7 +82,6 @@
 Language/07_Classes/6_Constructors_A02_t01: Fail # http://dartbug.com/5519
 LibTest/core/Match/operator_subscript_A01_t01: Fail # inherited from VM
 LibTest/core/Match/operator_subscript_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/Match/pattern_A01_t01: Fail, OK # Issue 400
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail # inherited from VM
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail, OK # co19 issue 294
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail # inherited from VM
@@ -115,10 +93,7 @@
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail # inherited from VM
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail, OK # co19 issue 294
-LibTest/core/RegExp/allMatches_A01_t01: Fail, OK # co19 issue 400
 LibTest/core/RegExp/firstMatch_A01_t01: Fail, OK # co19 issue 294
-LibTest/core/String/contains_A01_t02: Fail # inherited from VM
-LibTest/core/double/parse_A02_t01: Fail # Inherited from VM.
 LibTest/core/double/toRadixString_A01_t01: Fail # inherited from VM
 LibTest/core/int/operator_left_shift_A01_t02: Fail, OK # co19 issue 129
 LibTest/core/int/toRadixString_A01_t01: Fail # inherited from VM
@@ -166,23 +141,16 @@
 LibTest/core/double/truncate_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
 LibTest/core/double/truncate_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
 
-LibTest/core/Iterable/any_A01_t04: Fail # setRange now takes end-argument. Issue 402
-
-LibTest/core/Iterable/where_A01_t07: Fail # Issue 397
-
 LibTest/core/Set/isSubsetOf_A01_t01: Fail # Issue 400
 LibTest/core/Set/isSubsetOf_A01_t02: Fail # Issue 400
 
 LibTest/core/FallThroughError/toString_A01_t01: Fail # FallThroughError is no longer const. Issue 459
 LibTest/core/FallThroughError/FallThroughError_A01_t01: Fail # FallThroughError is no longer const. Issue 459
 
-Language/07_Classes/4_Abstract_Instance_Members_A04_t01: Fail # Override rules have been relaxed. Issue
-Language/07_Classes/1_Instance_Methods_A02_t02: Fail # Override rules have been relaxed. Issue
-Language/07_Classes/1_Instance_Methods_A02_t05: Fail # Override rules have been relaxed. Issue
-
 
 # co19-roll r546 (11.08.2013) caused these failures
 [ $compiler == dart2dart ]
+Language/03_Overview/1_Scoping_A02_t28: Fail # co19-roll r559: Please triage this failure
 Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
 Language/05_Variables/05_Variables_A05_t02: fail # co19-roll r546: Please triage this failure
 Language/05_Variables/05_Variables_A05_t03: fail # co19-roll r546: Please triage this failure
@@ -194,10 +162,21 @@
 Language/05_Variables/05_Variables_A06_t06: fail # co19-roll r546: Please triage this failure
 Language/07_Classes/07_Classes_A11_t01: fail # co19-roll r546: Please triage this failure
 Language/07_Classes/07_Classes_A11_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/1_Instance_Methods_A01_t01: Fail # co19-roll r559: Please triage this failure
+Language/07_Classes/1_Instance_Methods_A01_t02: Fail # co19-roll r559: Please triage this failure
+Language/07_Classes/1_Instance_Methods_A01_t03: Fail # co19-roll r559: Please triage this failure
+Language/07_Classes/1_Instance_Methods_A01_t04: Fail # co19-roll r559: Please triage this failure
+Language/07_Classes/1_Instance_Methods_A01_t05: Fail # co19-roll r559: Please triage this failure
+Language/07_Classes/1_Instance_Methods_A01_t06: Fail # co19-roll r559: Please triage this failure
 Language/07_Classes/3_Setters_A08_t01: fail # co19-roll r546: Please triage this failure
 Language/07_Classes/3_Setters_A08_t02: fail # co19-roll r546: Please triage this failure
 Language/07_Classes/3_Setters_A08_t03: fail # co19-roll r546: Please triage this failure
 Language/07_Classes/3_Setters_A08_t04: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/4_Abstract_Instance_Members_A03_t01: Fail # co19-roll r559: Please triage this failure
+Language/07_Classes/4_Abstract_Instance_Members_A03_t02: Fail # co19-roll r559: Please triage this failure
+Language/07_Classes/4_Abstract_Instance_Members_A03_t03: Fail # co19-roll r559: Please triage this failure
+Language/07_Classes/4_Abstract_Instance_Members_A03_t04: Fail # co19-roll r559: Please triage this failure
+Language/07_Classes/4_Abstract_Instance_Members_A03_t05: Fail # co19-roll r559: Please triage this failure
 Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t02: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/01_Constants_A01_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/01_Constants_A03_t02: fail # co19-roll r546: Please triage this failure
@@ -255,8 +234,6 @@
 Language/12_Expressions/03_Numbers_A01_t08: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/03_Numbers_A01_t10: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/05_Strings/1_String_Interpolation_A01_t09: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/05_Strings/1_String_Interpolation_A03_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/05_Strings/1_String_Interpolation_A04_t02: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/05_Strings_A02_t46: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/05_Strings_A02_t48: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/05_Strings_A20_t01: fail # co19-roll r546: Please triage this failure
@@ -286,26 +263,14 @@
 Language/12_Expressions/12_Instance_Creation/1_New_A06_t05: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A06_t06: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A06_t12: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A08_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A08_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A08_t03: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A09_t09: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/2_Const_A06_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/2_Const_A06_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/2_Const_A10_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/17_Getter_Invocation_A02_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/18_Assignment_A05_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/18_Assignment_A05_t04: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/18_Assignment_A05_t05: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/18_Assignment_A08_t04: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/22_Equality_A01_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/22_Equality_A01_t15: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/22_Equality_A01_t16: fail # co19-roll r546: Please triage this failure
@@ -337,11 +302,9 @@
 Language/13_Statements/03_Variable_Declaration_A04_t06: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/03_Variable_Declaration_A04_t07: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/03_Variable_Declaration_A04_t08: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/04_Local_Function_Declaration_A01_t01: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/06_For_A01_t11: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/09_Switch_A01_t02: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/09_Switch_A04_t01: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/09_Switch_A06_t02: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/11_Return_A05_t01: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/11_Return_A05_t02: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/11_Return_A05_t03: fail # co19-roll r546: Please triage this failure
@@ -368,7 +331,6 @@
 Language/14_Libraries_and_Scripts/1_Imports_A03_t69: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A03_t70: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A04_t03: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/3_Parts_A03_t02: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t01: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # co19-roll r546: Please triage this failure
@@ -376,7 +338,6 @@
 Language/14_Libraries_and_Scripts/5_URIs_A01_t21: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/5_URIs_A01_t24: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/5_URIs_A01_t25: fail # co19-roll r546: Please triage this failure
-Language/15_Types/1_Static_Types_A03_t01: fail # co19-roll r546: Please triage this failure
 Language/15_Types/3_Type_Declarations/1_Typedef_A06_t01: fail # co19-roll r546: Please triage this failure
 Language/15_Types/3_Type_Declarations/1_Typedef_A06_t02: fail # co19-roll r546: Please triage this failure
 Language/15_Types/3_Type_Declarations/1_Typedef_A06_t03: fail # co19-roll r546: Please triage this failure
@@ -390,16 +351,10 @@
 Language/15_Types/4_Interface_Types_A11_t02: crash # co19-roll r546: Please triage this failure
 Language/15_Types/5_Function_Types_A06_t01: fail # co19-roll r546: Please triage this failure
 Language/16_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: fail # co19-roll r546: Please triage this failure
-Language/16_Reference/1_Lexical_Rules/2_Comments_A04_t03: fail # co19-roll r546: Please triage this failure
 Language/16_Reference/1_Lexical_Rules_A02_t06: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/Stream.periodic_A03_t01: fail, pass # co19-roll r546: Please triage this failure
 LibTest/async/Timer/Timer.periodic_A02_t01: fail, pass # co19-roll r546: Please triage this failure
-LibTest/core/DateTime/isAtSameMomentAs_A01_t01: 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/year_A01_t01: fail # co19-roll r546: Please triage this failure
-LibTest/core/double/parse_A01_t01: fail # co19-roll r546: Please triage this failure
-LibTest/core/List/skip_A03_t01: fail # co19-roll r546: Please triage this failure
-LibTest/core/List/take_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/isolate_api/spawnFunction_A04_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/isolate_api/spawnUri_A02_t02: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/isolate_api/spawnUri_A02_t03: fail # co19-roll r546: Please triage this failure
@@ -410,10 +365,10 @@
 LibTest/isolate/SendPort/send_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/SendPort/send_A02_t02: timeout # co19-roll r546: Please triage this failure
 LibTest/isolate/SendPort/send_A02_t03: timeout # co19-roll r546: Please triage this failure
-LibTest/isolate/SendPort/send_A02_t04: fail # co19-roll r546: Please triage this failure
-Utils/tests/Expect/listEquals_A02_t01: fail # co19-roll r546: Please triage this failure
-Utils/tests/Expect/listEquals_A03_t01: fail # co19-roll r546: Please triage this failure
-Utils/tests/Expect/setEquals_A02_t01: fail # co19-roll r546: Please triage this failure
 
 [ $compiler == dart2dart && $minified ]
 Language/13_Statements/11_Try_A06_t01: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail # co19-roll r559: Please triage this failure
+Language/12_Expressions/17_Getter_Invocation_A02_t01: fail # co19-roll r559: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t02: fail # co19-roll r559: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t04: fail # co19-roll r559: Please triage this failure
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 82ddff6..8fe176e 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -9,10 +9,9 @@
 
 [ $compiler == dart2js && $runtime == jsshell ]
 LibTest/isolate/isolate_api/spawnUri_A02_t01: Crash # TODO(ahe): Please triage this crash.
-LibTest/core/List/sort_A01_t04: Pass, Timeout # Must be a bug in jsshell, test sometimes times out.
+LibTest/core/List/sort_A01_t04: Fail, Pass, Timeout # Must be a bug in jsshell, test sometimes times out.
 
 [ $compiler == dart2js && $checked && $runtime == ie9 ]
-LibTest/core/Map/Map_class_A01_t04: Slow, Pass
 LibTest/isolate/isolate_api/spawnUri_A02_t03: Pass, Fail # Issue 8920
 
 
@@ -22,15 +21,6 @@
 
 Language/03_Overview/1_Scoping_A02_t05: Fail # TODO(ahe): Please triage this failure.
 Language/03_Overview/1_Scoping_A02_t06: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A07_t05: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A07_t06: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A07_t07: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A07_t08: Fail # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A08_t01: Fail # TODO(ahe): Please triage this failure.
-Language/07_Classes/07_Classes_A03_t07: Fail # TODO(ahe): Please triage this failure.
-Language/07_Classes/1_Instance_Methods_A06_t01: Fail # TODO(ahe): Please triage this failure.
-Language/07_Classes/1_Instance_Methods_A06_t02: Fail # TODO(ahe): Please triage this failure.
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: Fail # TODO(ahe): Please triage this failure.
 Language/07_Classes/6_Constructors/2_Factories_A07_t01: Fail # TODO(ahe): Please triage this failure.
 LibTest/core/List/List_A03_t01: Fail # TODO(kasperl): Please triage this failure.
 LibTest/core/double/INFINITY_A01_t04: Fail # TODO(ahe): Please triage this failure.
@@ -55,9 +45,18 @@
 
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail # Issue 6750
 
-Language/07_Classes/6_Constructors/2_Factories_A01_t05: Fail # Partially implemented rediriecting constructors makes this fail.
+LibTest/typed_data/Float64List/Float64List.view_A01_t01: Fail, OK # Issue 12928
+LibTest/typed_data/Float32List/Float32List.view_A01_t01: Fail, OK # Issue 12928
+LibTest/typed_data/Uint16List/Uint16List.view_A01_t01: Fail, OK # Issue 12928
+LibTest/typed_data/Uint32List/Uint32List.view_A01_t01: Fail, OK # Issue 12928
+LibTest/typed_data/Int32List/Int32List.view_A01_t01: Fail, OK # Issue 12928
+LibTest/typed_data/Float32x4List/Float32x4List.view_A01_t01: Fail, OK # Issue 12928
+
 
 [ $compiler == dart2js && $runtime == ie9 ]
+LibTest/async/Completer/completeError_A02_t01: Pass, Fail # Issue 8920
+LibTest/async/Stream/listen_A04_t01: Pass, Timeout # Issue: 8920
+LibTest/core/DateTime/timeZoneName_A01_t01: Fail # Issue: 8920
 LibTest/core/double/round_A01_t01: Fail # Issue: 8920
 LibTest/core/double/toRadixString_A01_t01: Fail # Issue: 8920
 LibTest/core/double/toStringAsExponential_A01_t04: Fail # Issue: 8920
@@ -69,18 +68,15 @@
 LibTest/core/int/remainder_A01_t01: Fail # Issue: 8920
 LibTest/core/int/remainder_A01_t03: Fail # Issue: 8920
 LibTest/core/int/toRadixString_A01_t01: Fail # Issue: 8920
+LibTest/core/Map/Map_class_A01_t04: Pass, Timeout # Issue 8096
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail # Issue: 8920
 LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail # Issue: 8920
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail # Issue: 8920
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t05: Fail # Issue: 8920
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail # Issue: 8920
-LibTest/core/String/contains_A01_t02: Fail # Issue: 8920
-LibTest/isolate/ReceivePort/toSendPort_A01_t02: Pass, Fail # Issue: 8920
 LibTest/isolate/ReceivePort/toSendPort_A01_t01: Pass, Fail # Issue: 8920
-LibTest/core/DateTime/timeZoneName_A01_t01: Fail # Issue: 8920
-LibTest/async/Stream/listen_A04_t01: Pass, Timeout # Issue: 8920
-LibTest/async/Completer/completeError_A02_t01: Pass, Fail # Issue 8920
-LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: Pass, Timeout # Issue 8920
+LibTest/isolate/ReceivePort/toSendPort_A01_t02: Pass, Fail # Issue: 8920
+LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: Skip # http://dartbug.com/12635
 
 [ $compiler == dart2js && $runtime == jsshell ]
 LibTest/core/Map/Map_class_A01_t04: Pass, Slow # Issue 8096
@@ -104,7 +100,6 @@
 
 LibTest/core/List/getRange_A03_t01: Fail, OK # Tests that fail because they use the legacy try-catch syntax. co19 issue 184.
 
-Language/07_Classes/1_Instance_Methods_A02_t05: Fail, OK # These tests need to be updated for new optional parameter syntax and semantics, co19 issue 258:
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A13_t01: Fail, OK # These tests need to be updated for new optional parameter syntax and semantics, co19 issue 258:
 
 LibTest/isolate/SendPort/send_A02_t04: Fail, Pass, OK # co19 issue 293 Passes on IE
@@ -116,12 +111,6 @@
 LibTest/core/int/isEven_A01_t01: Fail, OK # co19 issue 277
 
 [ $compiler == dart2js ]
-Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t03: Fail # TODO(ahe): Enforce optional parameter semantics.
-Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t04: Fail # TODO(ahe): Enforce optional parameter semantics.
-Language/06_Functions/2_Formal_Parameters_A03_t03: Fail # TODO(ahe): Enforce optional parameter semantics.
-Language/06_Functions/2_Formal_Parameters_A03_t04: Fail # TODO(ahe): Enforce optional parameter semantics.
-Language/06_Functions/2_Formal_Parameters_A03_t06: Fail # TODO(ahe): Enforce optional parameter semantics.
-
 LibTest/isolate/SendPort/send_A02_t01: Fail # Compile-time error: error: not a compile-time constant
 
 LibTest/isolate/isolate_api/spawnUri_A02_t01: Fail # Runtime error: Expect.throws() fails
@@ -151,31 +140,25 @@
 # can understand so he can file a bug later.
 #
 [ $compiler == dart2js ]
-LibTest/core/Set/isSubsetOf_A01_t01: fail # Issue 400
-LibTest/core/Set/isSubsetOf_A01_t02: fail # Issue 400
-
-Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t14: Fail, OK # co19 issue 210
-Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t15: Fail, OK # co19 issue 210
-
 Language/03_Overview/1_Scoping_A01_t40: Fail, OK # co19 issue 188
 Language/03_Overview/1_Scoping_A01_t41: Fail, OK # co19 issue 188
-
-Language/06_Functions/4_External_Functions_A01_t01: Fail, OK # http://dartbug.com/5021
-
 Language/03_Overview/2_Privacy_A01_t09: Fail, OK # co19 issue 198
-
-LibTest/core/int/hashCode_A01_t01: Fail, OK # co19 issue 308
-
 Language/03_Overview/2_Privacy_A01_t11: Pass, OK # co19 issue 316
-
-LibTest/core/Iterable/where_A01_t07: Fail # Issue 397
-
-
+Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t14: Fail, OK # co19 issue 210
+Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A01_t15: Fail, OK # co19 issue 210
+Language/06_Functions/4_External_Functions_A01_t01: Fail, OK # http://dartbug.com/5021
+LibTest/core/FallThroughError/FallThroughError_A01_t01: Fail # FallThroughError is no longer const. Issue 459
+LibTest/core/FallThroughError/toString_A01_t01: Fail # FallThroughError is no longer const. Issue 459
+LibTest/core/int/hashCode_A01_t01: Fail, OK # co19 issue 308
+LibTest/core/Set/isSubsetOf_A01_t01: fail # Issue 400
+LibTest/core/Set/isSubsetOf_A01_t02: fail # Issue 400
 LibTest/core/String/indexOf_A01_t02: Fail # Issue 427
 LibTest/core/String/lastIndexOf_A01_t02: Fail # Issue 427
+LibTest/typed_data/Int64List/*: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int64List/Int64List_A02_t01: pass # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint64List/*: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint64List/Uint64List_A02_t01: pass # co19-roll r559: Please triage this failure
 
-LibTest/core/FallThroughError/toString_A01_t01: Fail # FallThroughError is no longer const. Issue 459
-LibTest/core/FallThroughError/FallThroughError_A01_t01: Fail # FallThroughError is no longer const. Issue 459
 
 [ $compiler == dart2js && $jscl ]
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: Fail, Pass # issue 3333
@@ -196,7 +179,6 @@
 LibTest/core/int/remainder_A01_t03: Fail, OK # Leg only has double.
 LibTest/core/int/toDouble_A01_t01: Fail, OK # Requires big int.
 LibTest/core/int/toRadixString_A01_t01: Fail, OK # Bad test: uses Expect.fail, Expect.throws, assumes case of result, and uses unsupported radixes.
-LibTest/core/String/contains_A01_t02: Fail, OK # co19 issue 105.
 
 [ $compiler == dart2js && $runtime == ie9 ]
 LibTest/math/cos_A01_t01: Fail # co19 issue 44
@@ -209,7 +191,6 @@
 [ $compiler == dart2js ]
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A13_t01: Fail # compiler cancelled: cannot resolve type T
 
-Language/03_Overview/1_Scoping_A02_t07: Fail # duplicate definition of f(var f){f();}
 Language/03_Overview/2_Privacy_A01_t06: Fail # cannot resolve type _inaccessibleFuncType
 
 [ $compiler == dart2js && $jscl ]
@@ -225,37 +206,77 @@
 # Missing compile-time errors.
 #
 [ $compiler == dart2js ]
+Language/03_Overview/1_Scoping_A01_t39: Fail # dartbug.com/7202
 Language/05_Variables/05_Variables_A01_t04: Fail # Checks that a variable declaration cannot contain both 'final' and 'var'.
 Language/05_Variables/05_Variables_A01_t05: Fail # Checks that a variable declaration cannot contain both 'var' and 'type'.
 Language/05_Variables/05_Variables_A01_t08: Fail # Checks different variables in a single variable declaration must be delimited by commas.
 Language/05_Variables/05_Variables_A01_t12: Fail # Checks that variable declaration cannot contain both 'const' and 'var'.
 Language/05_Variables/05_Variables_A01_t13: Fail # Checks that variable declaration cannot contain both 'const' and 'final'.
 Language/05_Variables/05_Variables_A01_t14: Fail # Checks that variable declaration cannot contain 'const', 'final' and 'var' simultaneously.
-Language/05_Variables/05_Variables_A01_t15: Fail # Checks that a variable declaration cannot contain the 'abstract' keyword.
+Language/05_Variables/05_Variables_A07_t05: Fail # Checks that a compile-time error occurs if a local constant variable is not initialized at declaration.
+Language/05_Variables/05_Variables_A07_t06: Fail # Checks that a compile-time error occurs if a local typed constant variable is not initialized at declaration.
+Language/05_Variables/05_Variables_A07_t07: Fail # Checks that a compile-time error occurs if a global constant variable is not initialized at declaration.
+Language/05_Variables/05_Variables_A07_t08: Fail # Checks that a compile-time error occurs if a global typed constant variable is not initialized at declaration.
+Language/05_Variables/05_Variables_A08_t01: Fail # Checks that a compile-time error occurs if a constant variable is not initialized.
 Language/06_Functions/2_Formal_Parameters/1_Required_Formals_A02_t03: Fail # Checks that a required parameter can be constant. Reassigning it should produce a compile-time error.
 Language/06_Functions/2_Formal_Parameters/1_Required_Formals_A02_t04: Fail # Checks that static variable declaration can't be a required formal parameter
 Language/06_Functions/2_Formal_Parameters/1_Required_Formals_A02_t06: Fail # Checks that a functionSignature parameter cannot be final.
 Language/06_Functions/2_Formal_Parameters/1_Required_Formals_A02_t07: Fail # Checks that a functionSignature parameter cannot be declared as variable.
+Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t03: Fail # TODO(ahe): Enforce optional parameter semantics.
+Language/06_Functions/2_Formal_Parameters/2_Optional_Formals_A03_t04: Fail # TODO(ahe): Enforce optional parameter semantics.
 Language/06_Functions/2_Formal_Parameters_A03_t01: Fail # Checks that it is a compile-time error if a required parameter is declared as a constant variable.
 Language/06_Functions/2_Formal_Parameters_A03_t02: Fail # Checks that it is a compile-time error if a required parameter is declared as a constant typed variable.
+Language/06_Functions/2_Formal_Parameters_A03_t03: Fail # TODO(ahe): Enforce optional parameter semantics.
+Language/06_Functions/2_Formal_Parameters_A03_t04: Fail # TODO(ahe): Enforce optional parameter semantics.
 Language/06_Functions/2_Formal_Parameters_A03_t05: Fail # Checks that it is a compile-time error if an optional named parameter is declared as a constant typed variable.
 Language/06_Functions/2_Formal_Parameters_A03_t05: Fail # Checks that it is a compile-time error if an optional positional parameter is declared as a constant variable.
+Language/06_Functions/2_Formal_Parameters_A03_t06: Fail # TODO(ahe): Enforce optional parameter semantics.
 Language/07_Classes/07_Classes_A02_t02: Fail # Checks that it is a compile-time error if a constant constructor declaration includes a body.
 Language/07_Classes/07_Classes_A02_t04: Fail # Checks that it is a compile-time error if a constant constructor declaration with initializers includes a body.
 Language/07_Classes/07_Classes_A02_t11: Fail # Checks that it is a compile-time error if a static final variable declaration does not include explicit initializer.
-Language/07_Classes/07_Classes_A03_t02: Fail # Checks that it is a compile-time error if a factory constructor method definition does not include a body.
-Language/07_Classes/07_Classes_A03_t08: Fail # Checks that it is a compile-time error if a static setter method definition does not include a body.
-Language/07_Classes/07_Classes_A03_t09: Fail # Checks that it is a compile-time error if a static function method definition does not include a body.
-Language/07_Classes/07_Classes_A04_t19: Fail # Checks that an abstract static method can't be used in place of a class member definition./
-Language/07_Classes/07_Classes_A04_t21: Fail # Checks that a static operator can't be used in place of a class member definition.
-Language/07_Classes/07_Classes_A04_t22: Fail # Checks that an abstract static operator can't be used in place of a class member definition./
-Language/07_Classes/07_Classes_A04_t24: Fail # Checks that a static abstract getter can't be used in place of a class member definition.
-Language/07_Classes/07_Classes_A04_t25: Fail # Checks that a static abstract setter can't be used in place of a class member definition.
-Language/07_Classes/1_Instance_Methods_A02_t02: Fail # Checks that a compile-time error is produced if m1 has fewer named parameters than m2 (1 vs. 0) and neither have any required parameters.
-Language/07_Classes/1_Instance_Methods_A02_t05: Fail # Checks that a compile-time error is produced if m1 has almost the same set of named  parameters as m2 except for one of them having a different name.
-Language/07_Classes/4_Abstract_Instance_Members_A04_t01: Fail # Checks that a compile-time error is produced when the overriding abstract method has fewer named parameters than the instance method being overridden (2 vs 3) and neither  have any required parameters.
-Language/07_Classes/4_Abstract_Instance_Members_A04_t05: Fail # Checks that a compile-time error is produced when the overriding non-abstract  instance method has the same set of named parameters as the abstract method being overriden,  but in a different order.
-Language/07_Classes/4_Abstract_Instance_Members_A04_t06: Fail # Checks that a compile-time error is produced when the overriding non-abstract  instance method has almost the same set of named parameters as the abstract method being overriden,  except for one that has a different name.
+Language/07_Classes/07_Classes_A11_t01: Fail # Checks that a class name cannot be used as a name of a member variable.
+Language/07_Classes/07_Classes_A11_t03: Fail # Checks that a class name cannot be used as a name of a static variable.
+Language/07_Classes/6_Constructors/3_Constant_Constructors_A03_t01: Fail # Checks that a compile-time error is produced when a class with constant  constructor also declares a non-final instance variable.
+Language/12_Expressions/01_Constants_A16_t01: Fail # Checks that an IntegerDivisionByZeroException raised during evaluation  of a compile-time constant causes a compile-time error.
+Language/12_Expressions/01_Constants_A16_t02: Fail # Checks that an OutOfMemoryException raised during evaluation of a compile-time constant causes a compile-time error.
+Language/12_Expressions/01_Constants_A20_t03: Fail # Checks that an identifier expression that denotes a type parameter  can not be assigned to a constant variable.
+Language/12_Expressions/05_Strings/1_String_Interpolation_A01_t09: Fail # Checks that it is a compile-time error if a string interpolation construct does not start with IDENTIFIER_NO_DOLLAR or opening brace.
+Language/12_Expressions/05_Strings_A02_t46: Fail # Checks that multi-line strings that contain characters and sequences prohibited by this grammar, cause compile-time errors.
+Language/12_Expressions/05_Strings_A02_t48: Fail # Checks that multi-line strings that contain characters and sequences prohibited by this grammar, cause compile-time errors.
+Language/12_Expressions/22_Equality_A01_t15: Fail # Checks that equality expressions cannot be operands of another equality expression.
+Language/12_Expressions/22_Equality_A01_t16: Fail # Checks that equality expressions cannot be operands of another equality expression.
+Language/12_Expressions/23_Relational_Expressions_A01_t10: Fail # Checks that a relational expression cannot be the operand of another relational expression.
+Language/12_Expressions/23_Relational_Expressions_A01_t11: Fail # Checks that a relational expression cannot be the operand of another relational expression.
+Language/12_Expressions/23_Relational_Expressions_A01_t12: Fail # Checks that a relational expression cannot be the operand of another relational expression.
+Language/12_Expressions/23_Relational_Expressions_A01_t13: Fail # Checks that a relational expression cannot be the operand of another relational expression.
+Language/12_Expressions/30_Identifier_Reference_A04_t09: Fail # Checks that it is a compile-time error when a built-in identifier dynamic is used as the declared name of a type variable.
+Language/12_Expressions/30_Identifier_Reference_A05_t01: Fail # Checks that it is a compile-time error when a built-in identifier "abstract" is used as a type annotation of a local variable.
+Language/12_Expressions/30_Identifier_Reference_A05_t12: Fail # Checks that it is a compile-time error when a built-in identifier "static" is used as a type annotation of a local variable.
+Language/13_Statements/03_Variable_Declaration_A04_t01: Fail # Checks that a variable declaration statement var e = e; causes a compile-time error.
+Language/13_Statements/03_Variable_Declaration_A04_t02: Fail # Checks that a variable declaration statement T e = e; causes a compile-time error.
+Language/13_Statements/03_Variable_Declaration_A04_t03: Fail # Checks that a variable declaration statement const e = e; causes a compile-time error.
+Language/13_Statements/03_Variable_Declaration_A04_t04: Fail # Checks that a variable declaration statement const T e = e; causes a compile-time error.
+Language/13_Statements/03_Variable_Declaration_A04_t05: Fail # Checks that a variable declaration statement final e = e; causes a compile-time error.
+Language/13_Statements/03_Variable_Declaration_A04_t06: Fail # Checks that a variable declaration statement final T e = e; causes a compile-time error.
+Language/13_Statements/03_Variable_Declaration_A04_t07: Fail # Checks that a variable declaration statement var e = e; causes a compile-time error. A top-level variable with the same name is declared.
+Language/13_Statements/03_Variable_Declaration_A04_t08: Fail # Checks that it is a compile-time error if the initializing expression of a local variable v refers to the name v= even when a top-level variable  with the same name is declared.
+Language/13_Statements/11_Return_A05_t01: Fail # Checks that a compile-time error occurs if a return statement  of the form return e; appears in a generative constructor.
+Language/13_Statements/11_Return_A05_t02: Fail # Checks that a compile-time error occurs if a return statement  of the form return e; appears in a named generative constructor.
+Language/13_Statements/11_Return_A05_t03: Fail # Checks that a compile-time error occurs if a return statement  of the form return e; appears in a generative constructor.
+Language/14_Libraries_and_Scripts/5_URIs_A01_t24: Fail # Checks that it is a compile-time error when the URI in a part directive consists of two adjacent string literals instead of one.
+Language/14_Libraries_and_Scripts/5_URIs_A01_t25: Fail # Checks that it is a compile-time error when the URI in a part directive consists of two adjacent multi-line string literals  instead of one.
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t01: Fail # Checks that a compile error is produced when a null default value is specified for a required argument in a function type alias.
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t02: Fail # Checks that a compile error is produced when a default value is specified for an optional positional  argument in a function type alias.
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t03: Fail # Checks that a compile error is produced when a default value is specified for an optional named  argument in a function type alias.
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t04: Fail # Checks that a compile error is produced when a default value is specified for one of the required arguments in a function type alias.
+Language/15_Types/3_Type_Declarations/1_Typedef_A06_t05: Fail # Checks that a compile error is produced when default values are specified for several parameters in a function type alias.
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t01: Fail # Checks that self-referencing typedef is not allowed (return value type annotation has the same name as the type alias).
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t02: Fail # Checks that self-referencing typedef is not allowed (positional formal parameter type annotation has the same name as the type alias).
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t03: Fail # Checks that self-referencing typedef is not allowed (positional optional parameter type annotation has the same name as the type alias).
+Language/15_Types/3_Type_Declarations/1_Typedef_A07_t04: Fail # Checks that self-referencing typedef is not allowed (named optional parameter type annotation has the same name as the type alias).
+Language/16_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: Fail # Checks that other Unicode whitespaces are not allowed:  check NO-BREAK SPACE (U+00A0)
+Language/16_Reference/1_Lexical_Rules_A02_t06: Fail # Checks that Unicode whitespaces other than WHITESPACE are not permitted in the source code. Checks symbol U+00a0.
+
 
 #
 # Unexpected compile-time errors.
@@ -272,25 +293,53 @@
 Language/07_Classes/07_Classes_A03_t10: Fail # http://dartbug.com/6687
 
 
-#
-# Unexpected runtime errors.
-#
-[ $compiler == dart2js ]
-Language/03_Overview/1_Scoping_A01_t39: Fail # dartbug.com/7202
+[ $compiler == dart2js && $runtime == ie9 ]
+# These are most likey due to the fact that IE9 doesn't support typed data
+LibTest/typed_data/Float32List/*: fail, crash # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4/*: fail, crash # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/*: fail, crash # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/*: fail, crash # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int8List/*: fail, crash # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/*: fail, crash # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/*: fail, crash # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int64List/*: fail, crash # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/*: fail, crash # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8List/*: fail, crash # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/*: fail, crash # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32List/*: fail, crash # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32x4/*: fail, crash # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint64List/*: fail, crash # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/Float32List_A02_t01: pass # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/Float32x4List_A02_t01: pass # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/Float64List_A02_t01: pass # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/Int16List_A02_t01: pass # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/Int32List_A02_t01: pass # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int8List/Int8List_A02_t01: pass # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/Uint16List_A02_t01: pass # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32List/Uint32List_A02_t01: pass # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList_A02_t01: pass # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8List/Uint8List_A02_t01: pass # co19-roll r559: Please triage this failure
 
-
-# co19-roll r546 (11.08.2013) caused these failures
 [ $compiler == dart2js ]
+Language/03_Overview/1_Scoping_A02_t28: fail # co19-roll r559: Please triage this failure
 Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
 Language/05_Variables/05_Variables_A05_t02: fail # co19-roll r546: Please triage this failure
 Language/05_Variables/05_Variables_A05_t03: fail # co19-roll r546: Please triage this failure
-Language/07_Classes/07_Classes_A11_t01: fail # co19-roll r546: Please triage this failure
-Language/07_Classes/07_Classes_A11_t03: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/1_Instance_Methods_A01_t01: fail # co19-roll r559: Please triage this failure
+Language/07_Classes/1_Instance_Methods_A01_t02: fail # co19-roll r559: Please triage this failure
+Language/07_Classes/1_Instance_Methods_A01_t03: fail # co19-roll r559: Please triage this failure
+Language/07_Classes/1_Instance_Methods_A01_t04: fail # co19-roll r559: Please triage this failure
+Language/07_Classes/1_Instance_Methods_A01_t05: fail # co19-roll r559: Please triage this failure
+Language/07_Classes/1_Instance_Methods_A01_t06: fail # co19-roll r559: Please triage this failure
 Language/07_Classes/3_Setters_A08_t01: fail # co19-roll r546: Please triage this failure
 Language/07_Classes/3_Setters_A08_t02: fail # co19-roll r546: Please triage this failure
 Language/07_Classes/3_Setters_A08_t03: fail # co19-roll r546: Please triage this failure
 Language/07_Classes/3_Setters_A08_t04: fail # co19-roll r546: Please triage this failure
-Language/07_Classes/6_Constructors/3_Constant_Constructors_A03_t01: fail # co19-roll r546: Please triage this failure
+Language/07_Classes/4_Abstract_Instance_Members_A03_t01: fail # co19-roll r559: Please triage this failure
+Language/07_Classes/4_Abstract_Instance_Members_A03_t02: fail # co19-roll r559: Please triage this failure
+Language/07_Classes/4_Abstract_Instance_Members_A03_t03: fail # co19-roll r559: Please triage this failure
+Language/07_Classes/4_Abstract_Instance_Members_A03_t04: fail # co19-roll r559: Please triage this failure
+Language/07_Classes/4_Abstract_Instance_Members_A03_t05: fail # co19-roll r559: Please triage this failure
 Language/12_Expressions/00_Object_Identity/1_Object_Identity_A02_t02: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/00_Object_Identity/1_Object_Identity_A04_t02: fail # co19-roll r546: Please triage this failure
@@ -300,16 +349,8 @@
 Language/12_Expressions/01_Constants_A11_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/01_Constants_A12_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/01_Constants_A13_t06: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/01_Constants_A16_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/01_Constants_A16_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/01_Constants_A20_t03: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/03_Numbers_A01_t06: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/03_Numbers_A01_t09: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/05_Strings/1_String_Interpolation_A01_t09: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/05_Strings/1_String_Interpolation_A03_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/05_Strings/1_String_Interpolation_A04_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/05_Strings_A02_t46: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/05_Strings_A02_t48: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/05_Strings_A20_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/07_Maps_A01_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/07_Maps_A08_t02: fail # co19-roll r546: Please triage this failure
@@ -325,35 +366,14 @@
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t06: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t07: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A08_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A08_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/1_New_A08_t03: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/2_Const_A11_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/2_Const_A11_t03: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/17_Getter_Invocation_A02_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/18_Assignment_A05_t02: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/18_Assignment_A05_t04: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/18_Assignment_A05_t05: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/18_Assignment_A08_t04: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/22_Equality_A01_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/22_Equality_A01_t15: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/22_Equality_A01_t16: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/22_Equality_A05_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/23_Relational_Expressions_A01_t10: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/23_Relational_Expressions_A01_t11: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/23_Relational_Expressions_A01_t12: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/23_Relational_Expressions_A01_t13: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/30_Identifier_Reference_A02_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/30_Identifier_Reference_A04_t09: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/30_Identifier_Reference_A05_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/30_Identifier_Reference_A05_t12: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/32_Type_Test_A04_t02: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/32_Type_Test_A04_t03: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/32_Type_Test_A04_t04: fail # co19-roll r546: Please triage this failure
@@ -361,25 +381,10 @@
 Language/12_Expressions/33_Type_Cast_A03_t02: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/33_Type_Cast_A03_t03: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/02_Expression_Statements_A01_t08: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/03_Variable_Declaration_A04_t01: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/03_Variable_Declaration_A04_t02: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/03_Variable_Declaration_A04_t03: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/03_Variable_Declaration_A04_t04: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/03_Variable_Declaration_A04_t05: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/03_Variable_Declaration_A04_t06: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/03_Variable_Declaration_A04_t07: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/03_Variable_Declaration_A04_t08: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/04_Local_Function_Declaration_A01_t01: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/06_For_A01_t11: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/09_Switch_A06_t02: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/11_Return_A05_t01: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/11_Return_A05_t02: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/11_Return_A05_t03: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/11_Try_A02_t03: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/11_Try_A03_t03: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/11_Try_A04_t03: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/10_Rethrow_A01_t04: fail # co19-roll r559: Please triage this failure
+Language/13_Statements/10_Rethrow_A01_t05: fail # co19-roll r559: Please triage this failure
 Language/13_Statements/11_Try_A06_t01: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/11_Try_A07_t03: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t03: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A02_t28: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A02_t29: fail # co19-roll r546: Please triage this failure
@@ -399,36 +404,22 @@
 Language/14_Libraries_and_Scripts/1_Imports_A03_t69: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A03_t70: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A04_t03: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/3_Parts_A03_t02: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t01: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/5_URIs_A01_t11: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/5_URIs_A01_t21: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/5_URIs_A01_t24: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/5_URIs_A01_t25: fail # co19-roll r546: Please triage this failure
-Language/15_Types/3_Type_Declarations/1_Typedef_A06_t01: fail # co19-roll r546: Please triage this failure
-Language/15_Types/3_Type_Declarations/1_Typedef_A06_t02: fail # co19-roll r546: Please triage this failure
-Language/15_Types/3_Type_Declarations/1_Typedef_A06_t03: fail # co19-roll r546: Please triage this failure
-Language/15_Types/3_Type_Declarations/1_Typedef_A06_t04: fail # co19-roll r546: Please triage this failure
-Language/15_Types/3_Type_Declarations/1_Typedef_A06_t05: fail # co19-roll r546: Please triage this failure
-Language/15_Types/3_Type_Declarations/1_Typedef_A07_t01: fail # co19-roll r546: Please triage this failure
-Language/15_Types/3_Type_Declarations/1_Typedef_A07_t02: fail # co19-roll r546: Please triage this failure
-Language/15_Types/3_Type_Declarations/1_Typedef_A07_t03: fail # co19-roll r546: Please triage this failure
-Language/15_Types/3_Type_Declarations/1_Typedef_A07_t04: fail # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t01: crash # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t02: crash # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t04: fail # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A12_t10: fail # co19-roll r546: Please triage this failure
-Language/16_Reference/1_Lexical_Rules/1_Reserved_Words_A40_t04: fail # co19-roll r546: Please triage this failure
-Language/16_Reference/1_Lexical_Rules_A02_t06: fail # co19-roll r546: 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/double/parse_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/Duration/operator_div_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/List/List_A02_t01: fail # co19-roll r546: Please triage this failure
+LibTest/core/Match/pattern_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/core/RegExp/allMatches_A01_t01: fail # co19-roll r559: Please triage this failure
 LibTest/isolate/isolate_api/spawnFunction_A02_t01: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/isolate_api/spawnFunction_A03_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/isolate_api/spawnFunction_A04_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/isolate_api/spawnFunction_A04_t02: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/isolate_api/spawnFunction_A04_t03: fail # co19-roll r546: Please triage this failure
@@ -446,9 +437,68 @@
 LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/SendPort/send_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/typed_data/Float32List/buffer_A01_t01: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Float32List/Float32List.view_A01_t02: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Float32List/Float32List.view_A05_t01: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/Float32List.view_A05_t02: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/Float32List.view_A05_t03: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/fold_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/join_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/join_A01_t02: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/offsetInBytes_A01_t01: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Float32x4/clamp_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/Float32x4List.view_A01_t02: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Float32x4List/Float32x4List.view_A02_t01: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/Float32x4List.view_A05_t01: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/Float32x4List.view_A05_t02: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/Float32x4List.view_A05_t03: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/fold_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/join_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/join_A01_t02: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/buffer_A01_t01: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Float64List/Float64List.view_A01_t02: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Float64List/Float64List.view_A05_t01: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/Float64List.view_A05_t02: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/Float64List.view_A05_t03: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/fold_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/join_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/join_A01_t02: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/offsetInBytes_A01_t01: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Int16List/buffer_A01_t01: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Int16List/Int16List.view_A01_t02: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Int16List/Int16List.view_A05_t01: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/Int16List.view_A05_t02: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/Int16List.view_A05_t03: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/offsetInBytes_A01_t01: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Int32List/buffer_A01_t01: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Int32List/Int32List.view_A01_t02: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Int32List/Int32List.view_A05_t01: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/Int32List.view_A05_t02: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/Int32List.view_A05_t03: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/offsetInBytes_A01_t01: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Int8List/Int8List.view_A05_t01: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int8List/Int8List.view_A05_t02: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int8List/Int8List.view_A05_t03: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/buffer_A01_t01: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Uint16List/offsetInBytes_A01_t01: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Uint16List/Uint16List.view_A01_t02: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Uint16List/Uint16List.view_A05_t01: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/Uint16List.view_A05_t02: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/Uint16List.view_A05_t03: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32List/buffer_A01_t01: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Uint32List/offsetInBytes_A01_t01: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Uint32List/Uint32List.view_A01_t02: Fail, Ok # co19 issue: 549
+LibTest/typed_data/Uint32List/Uint32List.view_A05_t01: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32List/Uint32List.view_A05_t02: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32List/Uint32List.view_A05_t03: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t01: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t02: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t03: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8List/Uint8List.view_A05_t01: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8List/Uint8List.view_A05_t02: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8List/Uint8List.view_A05_t03: Fail # co19-roll r559: Please triage this failure
 Utils/tests/Expect/identical_A01_t01: fail # co19-roll r546: Please triage this failure
 
-# co19-roll r546 (11.08.2013) caused these failures
 [ $compiler == dart2js && $checked ]
 Language/10_Generics/09_Generics_A03_t01: fail # co19-roll r546: Please triage this failure
 Language/10_Generics/09_Generics_A04_t06: fail # co19-roll r546: Please triage this failure
@@ -459,18 +509,42 @@
 Language/12_Expressions/07_Maps_A11_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A07_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A12_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: Fail # co19-roll r559: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/2_Const_A09_t03: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation_A01_t07: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/19_Conditional_A04_t03: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/20_Logical_Boolean_Expressions_A03_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/27_Unary_Expressions_A02_t03: fail # co19-roll r546: Please triage this failure
 Language/13_Statements/06_For/1_For_Loop_A01_t08: fail # co19-roll r546: Please triage this failure
-LibTest/core/List/getRange_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/Set/intersection_A01_t02: fail # co19-roll r546: Please triage this failure
+LibTest/typed_data/Float32x4List/operator_subscripted_assignment_A02_t01: Fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4List/reduce_A01_t01: Fail # co19-roll r559: Please triage this failure
 
+[ $compiler == dart2js && $runtime == jsshell ]
+LibTest/typed_data/Float32List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/toList_A01_t01: timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32x4/toUint32x4_A01_t02: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/toList_A01_t01: fail, timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/toList_A01_t01: pass, fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/toList_A01_t01: timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/toList_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/toList_A01_t01: pass, timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int8List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int8List/toList_A01_t01: fail, timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/toList_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/toList_A01_t01: timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32List/toList_A01_t01: fail, timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/toList_A01_t01: fail, timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8List/toList_A01_t01: timeout # co19-roll r559: Please triage this failure
 
 # Could this be dart issue 7728?
-# co19-roll r546 (11.08.2013) caused these failures
 [ $compiler == dart2js && ($runtime == d8 || $runtime == jsshell) ]
 LibTest/async/Future/Future.delayed_A01_t01: Fail # co19-roll r546: Please triage this failure
 LibTest/async/Future/Future.delayed_A03_t01: fail # co19-roll r546: Please triage this failure
@@ -482,3 +556,24 @@
 LibTest/async/Stream/Stream.periodic_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Timer/cancel_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Timer/Timer_A01_t01: fail # co19-roll r546: Please triage this failure
+
+[ $compiler == dart2js && $minified ]
+Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail # co19-roll r559: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail # co19-roll r559: Please triage this failure
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail # co19-roll r559: Please triage this failure
+Language/12_Expressions/17_Getter_Invocation_A02_t01: fail # co19-roll r559: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t02: fail # co19-roll r559: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t04: fail # co19-roll r559: Please triage this failure
+Language/12_Expressions/18_Assignment_A05_t05: fail # co19-roll r559: Please triage this failure
+Language/12_Expressions/18_Assignment_A08_t04: fail # co19-roll r559: Please triage this failure
+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
+LibTest/typed_data/Float64List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int8List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8List/runtimeType_A01_t01: fail # co19-roll r559: Please triage this failure
+
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index d9637be..dd687c2 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -11,13 +11,6 @@
 LibTest/core/double/floor_A01_t05: Fail # co19 issue 428
 LibTest/core/double/ceil_A01_t05: Fail # co19 issue 428
 
-Language/07_Classes/4_Abstract_Instance_Members_A03_t02: Fail # Dart issue 978
-Language/07_Classes/4_Abstract_Instance_Members_A03_t03: Fail # Dart issue 978
-Language/07_Classes/4_Abstract_Instance_Members_A03_t04: Fail # Dart issue 978
-Language/07_Classes/4_Abstract_Instance_Members_A03_t05: Fail # Dart issue 978
-Language/07_Classes/4_Abstract_Instance_Members_A04_t05: Fail # Dart issue 978
-Language/07_Classes/4_Abstract_Instance_Members_A04_t06: Fail # Dart issue 978
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A04_t15: Fail # Dart issue 6954
 LibTest/math/pow_A18_t01: Fail # co19 issue 507
 
 Language/05_Variables/1_Evaluation_of_Implicit_Variable_Getters_A01_t02: Fail # Dart issue 5802
@@ -38,8 +31,6 @@
 LibTest/core/double/toRadixString_A01_t01: Fail # co19 issue 491
 LibTest/core/int/toRadixString_A01_t01: Fail # co19 issue 492
 
-LibTest/core/String/contains_A01_t02: Fail  # Issue 12508
-
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail # VM triage, check spec.
 LibTest/isolate/isolate_api/spawnUri_A02_t02: Fail # VM triage, check spec.
 LibTest/isolate/isolate_api/spawnUri_A02_t03: Fail # VM triage, check spec.
@@ -47,8 +38,6 @@
 
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A15_t07: Fail $ co19 issue 494
 
-LibTest/core/Iterable/where_A01_t07: Fail # Issue 397
-
 LibTest/core/Set/isSubsetOf_A01_t01: fail # Issue 400
 LibTest/core/Set/isSubsetOf_A01_t02: fail # Issue 400
 
@@ -58,20 +47,6 @@
 LibTest/core/FallThroughError/toString_A01_t01: Fail # FallThroughError is no longer const. Issue 459
 LibTest/core/FallThroughError/FallThroughError_A01_t01: Fail # FallThroughError is no longer const. Issue 459
 
-Language/07_Classes/1_Instance_Methods_A01_t01: Fail # Issue 485
-Language/07_Classes/1_Instance_Methods_A01_t02: Fail # Issue 485
-Language/07_Classes/1_Instance_Methods_A01_t03: Fail # Issue 485
-Language/07_Classes/1_Instance_Methods_A01_t04: Fail # Issue 485
-Language/07_Classes/1_Instance_Methods_A01_t05: Fail # Issue 485
-Language/07_Classes/1_Instance_Methods_A01_t06: Fail # Issue 485
-Language/07_Classes/1_Instance_Methods_A02_t02: Fail # Issue 485
-Language/07_Classes/1_Instance_Methods_A02_t05: Fail # Issue 485
-Language/07_Classes/1_Instance_Methods_A06_t01: Fail # Issue 485
-Language/07_Classes/1_Instance_Methods_A06_t02: Fail # Issue 485
-Language/07_Classes/4_Abstract_Instance_Members_A03_t01: Fail # Issue 485
-Language/07_Classes/4_Abstract_Instance_Members_A04_t01: Fail # Issue 485
-
-Language/03_Overview/1_Scoping_A02_t28: Fail # Issue 463
 Language/03_Overview/2_Privacy_A01_t06: Fail # Issue 463
 
 LibTest/async/Timer/Timer.periodic_A02_t01: Pass, Fail # co19 issue 537
@@ -81,13 +56,6 @@
 
 [ $compiler == none && $runtime == vm && $checked ]
 LibTest/async/Future/catchError_A01_t01: Fail # Future constructors have changed # issue 408
-LibTest/core/List/getRange_A01_t01: Fail # getRange now takes end-argument and returns Iterable. Issue 399
-LibTest/core/Set/intersection_A03_t01: Fail # co19 issue 510
-LibTest/core/int/operator_division_A01_t01: Fail # co19 issue 509
-
-LibTest/core/Set/intersection_A01_t01: Fail # issue 390
-LibTest/core/Set/intersection_A01_t02: Fail # issue 390
-LibTest/core/Set/intersection_A01_t03: Fail # issue 390
 
 # Passing for the wrong reasons:
 LibTest/async/Completer/completeError_A03_t02: Pass # No AsyncError anymore. Issue 407 and 463
@@ -109,7 +77,11 @@
 LibTest/math/log_A01_t01: Fail
 LibTest/core/double/toInt_A01_t01: Fail
 
-# co19-roll r546 (11.08.2013) caused these failures
+[ $compiler == none && $runtime == vm && $arch == arm ]
+LibTest/typed_data/Float32List/Float32List.view_A01_t02: Crash  # Issue 12868
+LibTest/typed_data/Float32x4/toUint32x4_A01_t02: Fail  # Issue 12868
+LibTest/typed_data/Float64List/Float64List.view_A01_t02: Crash  # Issue 12868
+
 [ $compiler == none && $runtime == vm ]
 Language/05_Variables/05_Variables_A05_t01: fail # Dart issue 12539
 Language/05_Variables/05_Variables_A05_t02: fail # Dart issue 12539
@@ -138,32 +110,19 @@
 Language/12_Expressions/03_Numbers_A01_t04: fail # co19 issue 522
 Language/12_Expressions/03_Numbers_A01_t08: fail # co19 issue 522
 Language/12_Expressions/03_Numbers_A01_t10: fail # co19 issue 522
-Language/12_Expressions/05_Strings/1_String_Interpolation_A03_t02: fail # co19 issue 397
-Language/12_Expressions/05_Strings/1_String_Interpolation_A04_t02: fail # co19 issue 397
 Language/12_Expressions/05_Strings_A02_t46: fail # Dart issue 12547
 Language/12_Expressions/05_Strings_A02_t48: fail # Dart issue 12547
 Language/12_Expressions/05_Strings_A20_t01: fail # Dart issue 12518
 Language/12_Expressions/07_Maps_A01_t01: fail # co19 issue 522
 Language/12_Expressions/12_Instance_Creation/1_New_A06_t12: fail # Dart issue 12549
-Language/12_Expressions/12_Instance_Creation/1_New_A08_t01: fail # co19 issue 397
-Language/12_Expressions/12_Instance_Creation/1_New_A08_t02: fail # co19 issue 397
-Language/12_Expressions/12_Instance_Creation/1_New_A08_t03: fail # co19 issue 397
-Language/12_Expressions/12_Instance_Creation/1_New_A09_t09: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/12_Instance_Creation/1_New_A09_t09: fail # Dart issue 1372
 Language/12_Expressions/12_Instance_Creation/2_Const_A10_t01: fail # co19 issue 525
-Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A01_t02: fail # co19 issue 532
 Language/12_Expressions/14_Function_Invocation/4_Function_Expression_Invocation_A05_t01: fail # Dart issue 12550
-Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t02: fail # co19 issue 532
-Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t03: fail # co19 issue 532
 Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t05: fail # co19 issue 533
 Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: fail # Dart issue 12549
 Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A02_t04: fail # Dart issue 12549
-Language/12_Expressions/17_Getter_Invocation_A02_t01: fail # co19 issue 532
-Language/12_Expressions/18_Assignment_A05_t02: fail # co19 issue 532
-Language/12_Expressions/18_Assignment_A05_t04: fail # co19 issue 532
-Language/12_Expressions/18_Assignment_A05_t05: fail # co19 issue 532
-Language/12_Expressions/18_Assignment_A08_t04: fail # co19 issue 532
 Language/12_Expressions/30_Identifier_Reference_A05_t02: fail # Dart issue 12551
-Language/12_Expressions/30_Identifier_Reference_A08_t02: fail # co19-roll r546: Please triage this failure
+Language/12_Expressions/30_Identifier_Reference_A08_t02: fail # Dart issue 12593
 Language/12_Expressions/32_Type_Test_A04_t02: fail # co19 issue 503
 Language/12_Expressions/32_Type_Test_A04_t03: fail # co19 issue 534
 Language/12_Expressions/32_Type_Test_A04_t04: fail # co19 issue 534
@@ -173,34 +132,27 @@
 Language/13_Statements/03_Variable_Declaration_A04_t07: fail # co19 issue 535
 Language/13_Statements/03_Variable_Declaration_A04_t08: fail # co19 issue 535
 Language/13_Statements/06_For_A01_t11: fail # Dart issue 5675
-Language/13_Statements/09_Switch_A01_t02: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/09_Switch_A02_t02: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/09_Switch_A03_t01: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/09_Switch_A03_t02: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/09_Switch_A04_t01: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/09_Switch_A06_t02: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/11_Try_A02_t03: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/11_Try_A03_t03: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/11_Try_A04_t03: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/11_Try_A07_t03: fail # co19-roll r546: Please triage this failure
-Language/13_Statements/12_Labels_A01_t03: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t04: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/1_Imports_A02_t21: crash # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/1_Imports_A02_t22: crash # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/1_Imports_A03_t09: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/1_Imports_A03_t10: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/1_Imports_A03_t27: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/1_Imports_A03_t47: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/1_Imports_A03_t49: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/1_Imports_A03_t50: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/1_Imports_A03_t67: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/1_Imports_A03_t69: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/1_Imports_A03_t70: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/2_Exports_A04_t02: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/2_Exports_A04_t03: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/2_Exports_A05_t01: fail # co19-roll r546: Please triage this failure
+Language/13_Statements/09_Switch_A01_t02: fail # Dart issue 12908
+Language/13_Statements/09_Switch_A02_t02: fail # Dart issue 7307
+Language/13_Statements/09_Switch_A03_t01: fail # Dart issue 7307
+Language/13_Statements/09_Switch_A03_t02: fail # Dart issue 7307
+Language/13_Statements/09_Switch_A04_t01: fail # Dart issue 11233
+Language/13_Statements/12_Labels_A01_t03: fail # Dart issue 2238
+Language/14_Libraries_and_Scripts/13_Libraries_and_Scripts_A05_t04: fail # Dart issue 12913
+Language/14_Libraries_and_Scripts/1_Imports_A03_t09: fail # Dart issue 12915
+Language/14_Libraries_and_Scripts/1_Imports_A03_t10: fail # Dart issue 12915
+Language/14_Libraries_and_Scripts/1_Imports_A03_t27: fail # Dart issue 12915
+Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # Dart issue 12915
+Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # Dart issue 12915
+Language/14_Libraries_and_Scripts/1_Imports_A03_t47: fail # Dart issue 12915
+Language/14_Libraries_and_Scripts/1_Imports_A03_t49: fail # Dart issue 12915
+Language/14_Libraries_and_Scripts/1_Imports_A03_t50: fail # Dart issue 12915
+Language/14_Libraries_and_Scripts/1_Imports_A03_t67: fail # Dart issue 12915
+Language/14_Libraries_and_Scripts/1_Imports_A03_t69: fail # Dart issue 12915
+Language/14_Libraries_and_Scripts/1_Imports_A03_t70: fail # Dart issue 12915
+Language/14_Libraries_and_Scripts/2_Exports_A04_t02: fail # Dart issue 12916
+Language/14_Libraries_and_Scripts/2_Exports_A04_t03: fail # Dart issue 12916
+Language/14_Libraries_and_Scripts/2_Exports_A05_t01: fail # Dart issue 12918
 Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # Issue 12521
 Language/14_Libraries_and_Scripts/5_URIs_A01_t04: fail # Issue 12521
 Language/14_Libraries_and_Scripts/5_URIs_A01_t05: fail # Issue 12521
@@ -208,7 +160,6 @@
 Language/14_Libraries_and_Scripts/5_URIs_A01_t14: fail # Issue 12521
 Language/14_Libraries_and_Scripts/5_URIs_A01_t15: fail # Issue 12521
 Language/14_Libraries_and_Scripts/5_URIs_A01_t21: fail # Issue 12518
-LibTest/async/StreamSink/close_A01_t01: fail # co19 503
 
 LibTest/core/DateTime/parse_A03_t01: fail # Issue 12514
 LibTest/isolate/isolate_api/spawnFunction_A04_t01: fail # co19-roll r546: Please triage this failure
@@ -219,21 +170,37 @@
 LibTest/isolate/IsolateStream/contains_A02_t01: fail, pass # co19-roll r546: Please triage this failure
 LibTest/isolate/isolate_api/streamSpawnFunction_A02_t03: fail, pass # co19-roll r546: Please triage this failure
 LibTest/isolate/SendPort/send_A01_t01: fail # co19-roll r546: Please triage this failure
-LibTest/isolate/SendPort/send_A02_t04: fail # co19 issue 501
-
 
 [ $compiler == none && $runtime == vm && $checked ]
 Language/12_Expressions/12_Instance_Creation_A01_t08: FAIL, OK  # co19 issue 498
-LibTest/core/Set/intersection_A01_t01: pass # co19-roll r546: Please triage this failure
-LibTest/core/Set/intersection_A01_t03: pass # co19-roll r546: Please triage this failure
-LibTest/core/Set/intersection_A03_t01: pass # co19-roll r546: Please triage this failure
+LibTest/core/double/truncate_A01_t01: Fail # co19 issue 554
+LibTest/core/double/truncate_A01_t05: Fail #  co19 issue 554
 LibTest/core/int/ceilToDouble_A01_t01: fail  # co19 issue 498
 LibTest/core/int/floorToDouble_A01_t01: fail  # co19 issue 498
 LibTest/core/int/roundToDouble_A01_t01: fail  # co19 issue 498
 LibTest/core/int/truncateToDouble_A01_t01: fail  # co19 issue 498
-LibTest/isolate/isolate_api/spawnFunction_A03_t01: fail # co19 issue 497
-
-# co19-roll r546 (11.08.2013) caused these failures
-[ $compiler == none && $runtime == vm && $unchecked ]
-Language/12_Expressions/12_Instance_Creation/2_Const_A09_t02: Fail # co19 issue 496
-
+LibTest/typed_data/Float32List/operator_subscripted_assignment_A02_t01: Fail # co19 issue 555
+LibTest/typed_data/Float64List/operator_subscripted_assignment_A02_t01: Fail # co19 issue 555
+LibTest/typed_data/Float32x4List/elementAt_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/fillRange_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/first_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/first_A03_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/firstWhere_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/firstWhere_A02_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/getRange_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/getRange_A02_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/last_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/lastWhere_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/map_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/map_A02_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/map_A03_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/operator_subscript_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/operator_subscripted_assignment_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/operator_subscripted_assignment_A02_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/reduce_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/reversed_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/single_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/singleWhere_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/skip_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/take_A01_t01: Fail # Dart issue 12861
+LibTest/typed_data/Float32x4List/take_A02_t01: Fail # Dart issue 12861
diff --git a/tests/compiler/dart2js/message_kind_helper.dart b/tests/compiler/dart2js/message_kind_helper.dart
index 6302bf1..b7163fe 100644
--- a/tests/compiler/dart2js/message_kind_helper.dart
+++ b/tests/compiler/dart2js/message_kind_helper.dart
@@ -14,13 +14,8 @@
 
 const String ESCAPE_REGEXP = r'[[\]{}()*+?.\\^$|]';
 
-Compiler check(MessageKind kind, Compiler cachedCompiler,
-               {bool expectNoHowToFix: false}) {
-  if (expectNoHowToFix) {
-    Expect.isNull(kind.howToFix);
-  } else {
-    Expect.isNotNull(kind.howToFix);
-  }
+Compiler check(MessageKind kind, Compiler cachedCompiler) {
+  Expect.isNotNull(kind.howToFix);
   Expect.isFalse(kind.examples.isEmpty);
 
   for (String example in kind.examples) {
@@ -42,7 +37,7 @@
 
     Expect.isFalse(messages.isEmpty, 'No messages in """$example"""');
 
-    String expectedText = kind.howToFix == null
+    String expectedText = !kind.hasHowToFix
         ? kind.template : '${kind.template}\n${kind.howToFix}';
     String pattern = expectedText.replaceAllMapped(
         new RegExp(ESCAPE_REGEXP), (m) => '\\${m[0]}');
@@ -52,6 +47,8 @@
       Expect.isTrue(new RegExp('^$pattern\$').hasMatch(message),
                     '"$pattern" does not match "$message"');
     }
-    return compiler;
+    cachedCompiler = compiler;
   }
+
+  return cachedCompiler;
 }
diff --git a/tests/compiler/dart2js/message_kind_test.dart b/tests/compiler/dart2js/message_kind_test.dart
index 6a2e641..55f9bed 100644
--- a/tests/compiler/dart2js/message_kind_test.dart
+++ b/tests/compiler/dart2js/message_kind_test.dart
@@ -27,15 +27,9 @@
     }
   });
   List<String> names = kinds.keys.toList()..sort();
-  Map<String, bool> examples = <String, bool>{};
+  List<String> examples = <String>[];
   for (String name in names) {
     MessageKind kind = kinds[name];
-    bool expectNoHowToFix = false;
-    if (name == 'READ_SCRIPT_ERROR') {
-      // For this we can give no how-to-fix since the underlying error is
-      // unknown.
-      expectNoHowToFix = true;
-    }
     if (name == 'GENERIC' // Shouldn't be used.
         // We can't provoke a crash.
         || name == 'COMPILER_CRASHED'
@@ -43,17 +37,16 @@
         // We cannot provide examples for patch errors.
         || name.startsWith('PATCH_')) continue;
     if (kind.examples != null) {
-      examples[name] = expectNoHowToFix;
+      examples.add(name);
     } else {
       print("No example in '$name'");
     }
   };
   var cachedCompiler;
-  examples.forEach((String name, bool expectNoHowToFix) {
+  for (String name in examples) {
     Stopwatch sw = new Stopwatch()..start();
-    cachedCompiler = check(kinds[name], cachedCompiler,
-                           expectNoHowToFix: expectNoHowToFix);
+    cachedCompiler = check(kinds[name], cachedCompiler);
     sw.stop();
     print("Checked '$name' in ${sw.elapsedMilliseconds}ms.");
-  });
+  }
 }
diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/patch_test.dart
index 7463d7e..779efce 100644
--- a/tests/compiler/dart2js/patch_test.dart
+++ b/tests/compiler/dart2js/patch_test.dart
@@ -506,9 +506,13 @@
   Expect.isTrue(compiler.warnings.isEmpty,
                 "Unexpected warnings: ${compiler.warnings}");
   print('testPatchNonPatchableOrigin:${compiler.errors}');
-  Expect.equals(1, compiler.errors.length);
-  Expect.isTrue(
-      compiler.errors[0].message.kind == MessageKind.PATCH_NONPATCHABLE);
+  Expect.equals(2, compiler.errors.length);
+  Expect.equals(
+      MessageKind.EXTRANEOUS_MODIFIER, compiler.errors[0].message.kind);
+  Expect.equals(
+      // TODO(ahe): Eventually, this error should be removed as it will be
+      // handled by the regular parser.
+      MessageKind.PATCH_NONPATCHABLE, compiler.errors[1].message.kind);
 }
 
 testPatchNonExternalTopLevel() {
diff --git a/tests/compiler/dart2js_extra/crash_library_metadata.dart b/tests/compiler/dart2js_extra/crash_library_metadata.dart
new file mode 100644
index 0000000..b274687
--- /dev/null
+++ b/tests/compiler/dart2js_extra/crash_library_metadata.dart
@@ -0,0 +1,10 @@
+// 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.
+
+@Constant()
+library foo;
+
+class Constant {
+  const Constant();
+}
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 3e81bd4..416799d 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -10,10 +10,6 @@
 
 constant_javascript_semantics4_test: Fail, OK
 
-[ $runtime == ff || $jscl ]
-deferred/deferred_constant_test: Pass, Crash, Fail # Issue 9158
-deferred/deferred_class_test: Pass, Crash # Issue 9158
-
 [ $compiler == dart2js && $checked ]
 variable_type_test/03: Fail, OK
 variable_type_test/01: Fail, OK
@@ -24,7 +20,7 @@
 
 [ $compiler == dart2js && $runtime == ie9 ]
 class_test: Fail
-deferred/deferred_function_test: Pass, Fail, Timeout # Issue 12635
+deferred/*: Skip # http://dartbug.com/12635
 
 [ $compiler == dart2js && $runtime == none ]
 *: Fail, Pass # TODO(ahe): Triage these tests.
@@ -42,3 +38,12 @@
 
 [ $csp ]
 mirrors_test: Fail # http://dartbug.com/6490
+mirror_printer_test: Fail # http://dartbug.com/6490
+mirror_invalid_field_access_test: Fail # http://dartbug.com/6490
+mirror_invalid_field_access2_test: Fail # http://dartbug.com/6490
+mirror_invalid_field_access3_test: Fail # http://dartbug.com/6490
+mirror_invalid_field_access4_test: Fail # http://dartbug.com/6490
+deferred/deferred_class_test: Fail # http://dartbug.com/3940
+deferred/deferred_constant_test: Fail # http://dartbug.com/3940
+mirror_type_inference_field_test: Fail # http://dartbug.com/6490
+mirror_type_inference_field2_test: Fail # http://dartbug.com/6490
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart
index 4eaa40d..7b6279b 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
 import 'dart:async';
 
 @lazy import 'deferred_class_library.dart';
@@ -16,21 +18,25 @@
   Expect.throws(() { x = new MyClass(); }, isNoSuchMethodError);
   Expect.isNull(x);
   int counter = 0;
+  asyncStart();
   lazy.load().then((bool didLoad) {
     Expect.isTrue(didLoad);
     Expect.equals(1, ++counter);
     print('deferred_class_library was loaded');
     x = new MyClass();
     Expect.equals(42, x.foo(87));
+    asyncEnd();
   });
   Expect.equals(0, counter);
   Expect.isNull(x);
+  asyncStart();
   lazy.load().then((bool didLoad) {
     Expect.isFalse(didLoad);
     Expect.equals(2, ++counter);
     print('deferred_class_library was loaded');
     x = new MyClass();
     Expect.equals(42, x.foo(87));
+    asyncEnd();
   });
   Expect.equals(0, counter);
   Expect.isNull(x);
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_constant_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_constant_test.dart
index 87728934..22e7265 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_constant_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_constant_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
 import 'dart:async';
 
 @lazy import 'deferred_class_library.dart';
@@ -16,6 +18,7 @@
   Expect.isNull(const [const Constant(42)]);
   Expect.isNull(x);
   int counter = 0;
+  asyncStart();
   lazy.load().then((bool didLoad) {
     Expect.isTrue(didLoad);
     Expect.equals(1, ++counter);
@@ -23,9 +26,11 @@
     x = const MyClass();
     Expect.equals(42, x.foo(87));
     Expect.listEquals(const [const Constant(42)], [new Constant(42)]);
+    asyncEnd();
   });
   Expect.equals(0, counter);
   Expect.isNull(x);
+  asyncStart();
   lazy.load().then((bool didLoad) {
     Expect.isFalse(didLoad);
     Expect.equals(2, ++counter);
@@ -33,6 +38,7 @@
     x = const MyClass();
     Expect.equals(42, x.foo(87));
     Expect.listEquals(const [const Constant(42)], [new Constant(42)]);
+    asyncEnd();
   });
   Expect.equals(0, counter);
   Expect.isNull(x);
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
index 3f15bec6..fb4c282 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
@@ -5,8 +5,11 @@
 // Test that loading of a library (with top-level functions only) can
 // be deferred.
 
-import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
 import 'dart:async';
+
 @lazy import 'deferred_function_library.dart';
 
 const lazy = const DeferredLibrary('deferred_function_library');
@@ -21,26 +24,27 @@
 }
 
 main() {
-  print('unittest-suite-wait-for-done');
-
   Expect.throws(() { foo('a'); }, isNoSuchMethodError);
   Expect.isNull(readFoo());
   int counter = 0;
+  asyncStart();
   lazy.load().then((bool didLoad) {
     Expect.isTrue(didLoad);
     Expect.equals(1, ++counter);
     print('lazy was loaded');
     Expect.equals(42, foo('b'));
     Expect.isNotNull(readFoo());
+    asyncEnd();
   });
   Expect.equals(0, counter);
+  asyncStart();
   lazy.load().then((bool didLoad) {
     Expect.isFalse(didLoad);
     Expect.equals(2, ++counter);
     print('lazy was loaded');
     Expect.equals(42, foo('b'));
     Expect.isNotNull(readFoo());
-    print('unittest-suite-success');
+    asyncEnd();
   });
   Expect.equals(0, counter);
   Expect.throws(() { foo('a'); }, isNoSuchMethodError);
diff --git a/tests/compiler/dart2js_extra/field_initializer_test.dart b/tests/compiler/dart2js_extra/field_initializer_test.dart
index 43dbe3a..cb4a34b 100644
--- a/tests/compiler/dart2js_extra/field_initializer_test.dart
+++ b/tests/compiler/dart2js_extra/field_initializer_test.dart
@@ -7,21 +7,21 @@
 class A {
   static var a;
   static var b = c;
-  static const var c = 499;
-  static const var d = c;
-  static const var e = d;
-  static const var f = B.g;
-  static const var h = true;
-  static const var i = false;
-  static const var j = n;
-  static const var k = 4.99;
-  static const var l;
-  static const var m = l;
-  static const var n = 42;
+  static const c = 499;
+  static const d = c;
+  static const e = d;
+  static const f = B.g;
+  static const h = true;
+  static const i = false;
+  static const j = n;
+  static const k = 4.99;
+  static const l;
+  static const m = l;
+  static const n = 42;
 }
 
 class B {
-  static const var g = A.c;
+  static const g = A.c;
 }
 
 testInitialValues() {
diff --git a/tests/compiler/dart2js_extra/mirror_invalid_field_access2_test.dart b/tests/compiler/dart2js_extra/mirror_invalid_field_access2_test.dart
new file mode 100644
index 0000000..e972bbb
--- /dev/null
+++ b/tests/compiler/dart2js_extra/mirror_invalid_field_access2_test.dart
@@ -0,0 +1,33 @@
+// 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.
+
+// Test that we cannot reflect on elements not covered by the `MirrorsUsed`
+// annotation.
+
+library test;
+
+@MirrorsUsed(targets: 'C.foo')
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class C {
+  var foo;
+  var bar;
+}
+
+main() {
+  var c = new C();
+
+  c.bar = 1;
+  var local = c.bar;
+
+  var mirror = reflect(c);
+  Expect.equals(1, mirror.setField(const Symbol('foo'), 1).reflectee);
+  Expect.equals(1, mirror.getField(const Symbol('foo')).reflectee);
+  Expect.throws(() => mirror.setField(const Symbol('bar'),  2),
+                (e) => e is NoSuchMethodError);
+  Expect.throws(() => mirror.getField(const Symbol('bar')),
+                (e) => e is NoSuchMethodError);
+}
diff --git a/tests/compiler/dart2js_extra/mirror_invalid_field_access3_test.dart b/tests/compiler/dart2js_extra/mirror_invalid_field_access3_test.dart
new file mode 100644
index 0000000..e100442
--- /dev/null
+++ b/tests/compiler/dart2js_extra/mirror_invalid_field_access3_test.dart
@@ -0,0 +1,30 @@
+// 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.
+
+// Test that we cannot reflect on elements not covered by the `MirrorsUsed`
+// annotation.
+
+library test;
+
+@MirrorsUsed(targets: 'C.foo')
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class C {
+  static var foo;
+  static var bar;
+}
+
+main() {
+  C.bar = 1;
+  var local = C.bar;
+  var mirror = reflect(new C()).type; // Workaround bug 12799.
+  Expect.equals(1, mirror.setField(const Symbol('foo'), 1).reflectee);
+  Expect.equals(1, mirror.getField(const Symbol('foo')).reflectee);
+  Expect.throws(() => mirror.setField(const Symbol('bar'),  2),
+                (e) => e is NoSuchMethodError);
+  Expect.throws(() => mirror.getField(const Symbol('bar')),
+                (e) => e is NoSuchMethodError);
+}
diff --git a/tests/compiler/dart2js_extra/mirror_invalid_field_access4_test.dart b/tests/compiler/dart2js_extra/mirror_invalid_field_access4_test.dart
new file mode 100644
index 0000000..cdd562e
--- /dev/null
+++ b/tests/compiler/dart2js_extra/mirror_invalid_field_access4_test.dart
@@ -0,0 +1,40 @@
+// 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.
+
+// Test that we cannot reflect on elements not covered by the `MirrorsUsed`
+// annotation.
+
+library test;
+
+@MirrorsUsed(targets: 'C.foo')
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class C {
+  var foo;
+  var bar;
+}
+
+class D {
+  get bar {}
+  set bar(x) {}
+}
+
+int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
+
+main() {
+  var c = inscrutable(1) == 1 ? new C() : new D();
+
+  c.bar = 1;
+  var local = c.bar;
+
+  var mirror = reflect(c);
+  Expect.equals(1, mirror.setField(const Symbol('foo'), 1).reflectee);
+  Expect.equals(1, mirror.getField(const Symbol('foo')).reflectee);
+  Expect.throws(() => mirror.setField(const Symbol('bar'),  2),
+                (e) => e is UnsupportedError);
+  Expect.throws(() => mirror.getField(const Symbol('bar')),
+                (e) => e is UnsupportedError);
+}
diff --git a/tests/compiler/dart2js_extra/mirror_invalid_field_access_test.dart b/tests/compiler/dart2js_extra/mirror_invalid_field_access_test.dart
new file mode 100644
index 0000000..42badbd
--- /dev/null
+++ b/tests/compiler/dart2js_extra/mirror_invalid_field_access_test.dart
@@ -0,0 +1,29 @@
+// 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.
+
+// Test that we cannot reflect on elements not covered by the `MirrorsUsed`
+// annotation.
+
+library test;
+
+@MirrorsUsed(targets: 'foo')
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+var foo;
+var bar;
+
+main() {
+  bar = 1;
+  var local = bar;
+
+  var mirror = currentMirrorSystem().findLibrary(const Symbol('test')).single;
+  Expect.equals(1, mirror.setField(const Symbol('foo'), 1).reflectee);
+  Expect.equals(1, mirror.getField(const Symbol('foo')).reflectee);
+  Expect.throws(() => mirror.setField(const Symbol('bar'),  2),
+                (e) => e is NoSuchMethodError);
+  Expect.throws(() => mirror.getField(const Symbol('bar')),
+                (e) => e is NoSuchMethodError);
+}
diff --git a/tests/compiler/dart2js_extra/mirror_invalid_invoke2_test.dart b/tests/compiler/dart2js_extra/mirror_invalid_invoke2_test.dart
new file mode 100644
index 0000000..5955594
--- /dev/null
+++ b/tests/compiler/dart2js_extra/mirror_invalid_invoke2_test.dart
@@ -0,0 +1,33 @@
+// 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.
+
+// Test that we cannot reflect on elements not covered by the `MirrorsUsed`
+// annotation.
+
+library test;
+
+@MirrorsUsed(targets: 'C.foo')
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+import '../../language/compiler_annotations.dart';
+
+class C {
+  foo() => 1;
+
+  @DontInline
+  // Use a closure to prevent inlining until the annotation is implemented.
+  bar() => () => 2;
+}
+
+main() {
+  var c = new C();
+  c.bar();  // Call bar, so it is included in the program.
+
+  var mirror = reflect(c);
+  Expect.equals(1, mirror.invoke(const Symbol('foo'), []).reflectee);
+  Expect.throws(() => mirror.invoke(const Symbol('bar'),  []),
+                (e) => e is UnsupportedError);
+}
diff --git a/tests/compiler/dart2js_extra/mirror_invalid_invoke3_test.dart b/tests/compiler/dart2js_extra/mirror_invalid_invoke3_test.dart
new file mode 100644
index 0000000..0783c70
--- /dev/null
+++ b/tests/compiler/dart2js_extra/mirror_invalid_invoke3_test.dart
@@ -0,0 +1,32 @@
+// 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.
+
+// Test that we cannot reflect on elements not covered by the `MirrorsUsed`
+// annotation.
+
+library test;
+
+@MirrorsUsed(targets: 'C.foo')
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+import '../../language/compiler_annotations.dart';
+
+class C {
+  static foo() => 1;
+
+  @DontInline
+  // Use a closure to prevent inlining until the annotation is implemented.
+  static bar() => () => 2;
+}
+
+main() {
+  C.bar();  // Call bar, so it is included in the program.
+
+  var mirror = reflect(new C()).type; // Workaround bug 12799.
+  Expect.equals(1, mirror.invoke(const Symbol('foo'), []).reflectee);
+  Expect.throws(() => mirror.invoke(const Symbol('bar'),  []),
+                (e) => e is UnsupportedError);
+}
diff --git a/tests/compiler/dart2js_extra/mirror_invalid_invoke_test.dart b/tests/compiler/dart2js_extra/mirror_invalid_invoke_test.dart
new file mode 100644
index 0000000..7e8b9fd
--- /dev/null
+++ b/tests/compiler/dart2js_extra/mirror_invalid_invoke_test.dart
@@ -0,0 +1,29 @@
+// 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.
+
+// Test that we cannot reflect on elements not covered by the `MirrorsUsed`
+// annotation.
+
+library test;
+
+@MirrorsUsed(targets: 'foo')
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+import '../../language/compiler_annotations.dart';
+
+foo() => 1;
+
+@DontInline
+// Use a closure to prevent inlining until the annotation is implemented.
+bar() => () => 2;
+
+main() {
+  bar();  // Call bar, so it is included in the program.
+
+  var lm = currentMirrorSystem().findLibrary(const Symbol('test')).single;
+  Expect.equals(1, lm.invoke(const Symbol('foo'), []).reflectee);
+  Expect.throws(() => lm.invoke(const Symbol('bar'),  []));
+}
diff --git a/tests/compiler/dart2js_extra/mirror_printer_test.dart b/tests/compiler/dart2js_extra/mirror_printer_test.dart
new file mode 100644
index 0000000..63c1d12
--- /dev/null
+++ b/tests/compiler/dart2js_extra/mirror_printer_test.dart
@@ -0,0 +1,184 @@
+// 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.
+
+/// Prints all information about all mirrors. This tests that it is possible to
+/// enumerate all reflective information without crashing.
+
+// Note: Adding imports below is fine for regression tests. For example,
+// 'crash_library_metadata.dart' is imported to ensure the compiler doesn't
+// crash.
+
+// TODO(ahe): This test should be extended until we are sure all data is
+// printed.
+
+library test.mirror_printer_test;
+
+@MirrorsUsed(targets: '*')
+import 'dart:mirrors';
+
+import 'crash_library_metadata.dart'; // This would crash dart2js.
+
+// Importing dart:html to make things interesting.
+import 'dart:html';
+
+class MirrorPrinter {
+  final StringBuffer buffer;
+  final TypeMirror dynamicType = currentMirrorSystem().dynamicType;
+
+  int indentationLevel = 0;
+
+  MirrorPrinter(this.buffer);
+
+  void w(object) {
+    buffer.write(object);
+  }
+
+  n(Symbol symbol) => MirrorSystem.getName(symbol);
+
+  void indented(action) {
+    indentationLevel++;
+    action();
+    indentationLevel--;
+  }
+
+  get indent {
+    for (int i = 0; i < indentationLevel; i++) {
+      w('  ');
+    }
+  }
+
+  String stringifyInstance(InstanceMirror mirror) {
+    var reflectee = mirror.reflectee;
+    if (reflectee is String) return '"${reflectee}"';
+    if (reflectee is Null || reflectee is bool || reflectee is num ||
+        reflectee is List || reflectee is Map) {
+      return '$reflectee';
+    }
+    StringBuffer buffer = new StringBuffer();
+    Map<Symbol, VariableMirror> variables = mirror.type.variables;
+    buffer
+        ..write(n(mirror.type.simpleName))
+        ..write('(');
+    bool first = true;
+    variables.forEach((Symbol name, VariableMirror variable) {
+      if (variable.isStatic) return;
+      // TODO(ahe): Include superclasses.
+      if (first) {
+        first = false;
+      } else {
+        buffer.write(', ');
+      }
+      buffer
+          ..write(n(name))
+          ..write(': ')
+          ..write(stringifyInstance(mirror.getField(name)));
+    });
+    buffer.write(')');
+    return buffer.toString();
+  }
+
+  String stringifyMetadata(InstanceMirror mirror) {
+    return '@${stringifyInstance(mirror)}';
+  }
+
+  bool writeType(TypeMirror mirror) {
+    if (mirror == null || mirror == dynamicType) return false;
+    w('${n(mirror.simpleName)} ');
+    return true;
+  }
+
+  writeVariable(VariableMirror mirror) {
+    bool needsVar = true;
+    if (mirror.isStatic) w('static ');
+    // TODO(ahe): What about const?
+    if (mirror.isFinal) {
+      w('final ');
+      needsVar = false;
+    }
+
+    if (writeType(mirror.type)) needsVar = false;
+
+    if (needsVar) {
+      w('var ');
+    }
+    w('${n(mirror.simpleName)};');
+  }
+
+  writeMethod(MethodMirror mirror) {
+    writeType(mirror.returnType);
+    if (mirror.isOperator) {
+      w('operator ');
+    }
+    if (mirror.isGetter) {
+      w('get ');
+    }
+    if (mirror.isSetter) {
+      w('set ');
+    }
+    w('${n(mirror.simpleName)}');
+    if (!mirror.isGetter) {
+      w('()');
+    }
+    w(';');
+  }
+
+  writeClass(ClassMirror mirror) {
+    // TODO(ahe): Write 'abstract' if [mirror] is abstract.
+    w('class ${n(mirror.simpleName)}');
+    // TODO(ahe): Write superclass and interfaces.
+    w(' {');
+    bool first = true;
+    indented(() {
+      for (DeclarationMirror declaration in mirror.members.values) {
+        if (first) {
+          first = false;
+        } else {
+          w('\n');
+        }
+        writeDeclaration(declaration);
+      }
+    });
+    w('\n}\n');
+  }
+
+  writeDeclaration(DeclarationMirror declaration) {
+    w('\n');
+    var metadata = declaration.metadata;
+    if (!metadata.isEmpty) {
+      indent;
+      buffer.writeAll(metadata.map(stringifyMetadata), ' ');
+      w('\n');
+    }
+    indent;
+    if (declaration is ClassMirror) {
+      writeClass(declaration);
+    } else if (declaration is VariableMirror) {
+      writeVariable(declaration);
+    } else if (declaration is MethodMirror) {
+      writeMethod(declaration);
+    } else {
+      // TODO(ahe): Test other subclasses of DeclarationMirror.
+      w('$declaration');
+    }
+  }
+
+  writeLibrary(LibraryMirror library) {
+    w('library ${n(library.simpleName)};\n\n');
+    library.members.values.forEach(writeDeclaration);
+    w('\n');
+  }
+
+  static StringBuffer stringify(Map<Uri, LibraryMirror> libraries) {
+    StringBuffer buffer = new StringBuffer();
+    libraries.values.forEach(new MirrorPrinter(buffer).writeLibrary);
+    return buffer;
+  }
+}
+
+main() {
+  print(MirrorPrinter.stringify(currentMirrorSystem().libraries));
+  // Clear the nodes to avoid confusing the fine test framework (by "fine" I
+  // mean something else) -- ahe.
+  document.body.nodes.clear();
+}
diff --git a/tests/compiler/dart2js_extra/mirror_type_inference_field2_test.dart b/tests/compiler/dart2js_extra/mirror_type_inference_field2_test.dart
new file mode 100644
index 0000000..0d8c34d
--- /dev/null
+++ b/tests/compiler/dart2js_extra/mirror_type_inference_field2_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// Test that type inference sees the possible modification of `fisk` from
+// the mirror system and not infers the value to be an integer, or any
+// other elements that use `fisk` like `otherFisk` to be of type integer.
+library test;
+
+@MirrorsUsed(targets: 'fisk', override: '*')
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+var fisk = 1;
+var otherFisk = 42;
+
+main() {
+  var lm = currentMirrorSystem().findLibrary(const Symbol('test')).single;
+  lm.setField(const Symbol('fisk'), 'hest');
+  otherFisk = fisk;
+  Expect.isTrue(otherFisk is String);
+}
diff --git a/tests/compiler/dart2js_extra/mirror_type_inference_field_test.dart b/tests/compiler/dart2js_extra/mirror_type_inference_field_test.dart
new file mode 100644
index 0000000..860d8c7
--- /dev/null
+++ b/tests/compiler/dart2js_extra/mirror_type_inference_field_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+// Test that type inference sees the possible modification of `fisk` from
+// the mirror system and not infers the value to be an integer.
+library test;
+
+@MirrorsUsed(targets: 'fisk', override: '*')
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+var fisk = 1;
+
+main() {
+  var lm = currentMirrorSystem().findLibrary(const Symbol('test')).single;
+  lm.setField(const Symbol('fisk'), 'hest');
+  Expect.isTrue(fisk is String);
+}
diff --git a/tests/compiler/dart2js_extra/mirror_type_inference_function_test.dart b/tests/compiler/dart2js_extra/mirror_type_inference_function_test.dart
new file mode 100644
index 0000000..a6ed031
--- /dev/null
+++ b/tests/compiler/dart2js_extra/mirror_type_inference_function_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+// Test that type inference sees the call to `fisk` from the mirror system
+// and not infers the argument to be an integer.
+library test;
+
+@MirrorsUsed(targets: 'fisk', override: '*')
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+bool fisk(a) => a is int;
+
+main() {
+  Expect.isTrue(fisk(1));
+  var lm = currentMirrorSystem().findLibrary(const Symbol('test')).single;
+  Expect.isFalse(lm.invoke(const Symbol('fisk'), ['hest']).reflectee);
+}
diff --git a/tests/compiler/dart2js_foreign/dart2js_foreign.status b/tests/compiler/dart2js_foreign/dart2js_foreign.status
index 7945115..1807eab 100644
--- a/tests/compiler/dart2js_foreign/dart2js_foreign.status
+++ b/tests/compiler/dart2js_foreign/dart2js_foreign.status
@@ -2,63 +2,4 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-[ $compiler == dart2js && $runtime == none ]
-foreign_test: Fail # Cannot resolve JS.
-
-
-[ $checked ]
-native_checked_fields_test: Fail
-
-
-[ $compiler == dart2js && ( $jscl || $browser ) ]
-foreign_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_call_arity1_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_call_arity2_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_call_arity3_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_checked_arguments1_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_class_avoids_hidden_name_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_class_inheritance1_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_class_inheritance2_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_class_inheritance3_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_class_is_check1_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_class_is_check3_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_closure_identity_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_exceptions1_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_field_rename_1_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_field_rename_2_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_library_same_name_used_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_literal_class_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_method_rename1_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_method_rename2_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_method_rename3_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_method_with_keyword_name_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_named_constructors2_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_named_constructors3_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_no_such_method_exception2_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_no_such_method_exception3_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_no_such_method_exception4_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_no_such_method_exception5_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_no_such_method_exception_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_null_closure_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_null_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_parameter_names_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_property_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_use_native_name_in_table_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_wrapping_function2_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_wrapping_function3_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_wrapping_function_test: Fail # TODO(ahe): Convert to metadata syntax.
-
-native_checked_fields_test: Pass # For the wrong reason.
-native_class_inheritance4_test: Pass # For the wrong reason.
-native_class_with_dart_methods_test: Pass # For the wrong reason.
-native_to_string_test: Pass # For the wrong reason.
-native_window1_test: Pass # For the wrong reason.
-native_window2_test: Pass # For the wrong reason.
-
-native_checked_fields_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_class_inheritance4_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_class_with_dart_methods_test: Fail # TODO(ahe): Convert to metadata syntax.
-native_to_string_test: Fail # TODO(ahe): Convert to metadata syntax.
-
-[ $browser ]
 *: Skip
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index cb7557d..0191a10 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -8,3 +8,9 @@
 [ $compiler == dart2js ]
 native_no_such_method_exception4_frog_test: Fail  # Issue 9631
 native_no_such_method_exception5_frog_test: Fail  # Issue 9631
+
+[ $browser || $runtime == jsshell ]
+only_pass_on_d8_test: Fail, OK # This test should only pass on D8.
+
+[ $browser || $runtime == d8 ]
+only_pass_on_jsshell_test: Fail, OK # This test should only pass on jsshell.
diff --git a/tests/compiler/dart2js_native/only_pass_on_d8_test.dart b/tests/compiler/dart2js_native/only_pass_on_d8_test.dart
new file mode 100644
index 0000000..db44fc6
--- /dev/null
+++ b/tests/compiler/dart2js_native/only_pass_on_d8_test.dart
@@ -0,0 +1,12 @@
+// 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.
+
+import 'package:expect/expect.dart';
+
+import 'dart:_isolate_helper';
+
+main() {
+  Expect.isTrue(IsolateNatives.isD8);
+  Expect.isFalse(IsolateNatives.isJsshell);
+}
diff --git a/tests/compiler/dart2js_native/only_pass_on_jsshell_test.dart b/tests/compiler/dart2js_native/only_pass_on_jsshell_test.dart
new file mode 100644
index 0000000..8bb4811
--- /dev/null
+++ b/tests/compiler/dart2js_native/only_pass_on_jsshell_test.dart
@@ -0,0 +1,12 @@
+// 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.
+
+import 'package:expect/expect.dart';
+
+import 'dart:_isolate_helper';
+
+main() {
+  Expect.isFalse(IsolateNatives.isD8);
+  Expect.isTrue(IsolateNatives.isJsshell);
+}
diff --git a/tests/corelib/big_integer_vm_test.dart b/tests/corelib/big_integer_vm_test.dart
index 12be55e..e57b3be 100644
--- a/tests/corelib/big_integer_vm_test.dart
+++ b/tests/corelib/big_integer_vm_test.dart
@@ -73,6 +73,17 @@
     Expect.equals(20000000000000.0, b * a);
   }
 
+  static testBigintHugeMul() {
+    var block = 28 * 256;   // 28 bit chunks with 8 bit 'carry' in a DoubleChunk.
+    var bits = block * 32;  // plenty of blocks in longest column sum;
+    var a = 1 << bits;
+    var a1 = a - 1;      // all 1's
+    var p1 = a1 * a1;
+    var p2 = a * a - a - a + 1;
+    // Use isTrue instead of equals to avoid trying to print such big numbers.
+    Expect.isTrue(p1 == p2, 'products do not match');
+  }
+
   static testBigintTruncDiv() {
     var a = 12345678901234567890;
     var b = 10;
@@ -160,6 +171,7 @@
     testBigintAdd();
     testBigintSub();
     testBigintMul();
+    testBigintHugeMul();
     testBigintModulo();
     testBigintTruncDiv();
     testBigintDiv();
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index ecd14b0..186f01e 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -2,8 +2,6 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-reg_exp_unicode_2_test: Fail # Bug 6592
-
 [ $compiler == dart2js && $runtime == drt ]
 hash_set_test: Pass, Fail # v8 bug: Issue 12293
 list_test: Pass, Fail # v8 bug: Issue 12293
@@ -31,9 +29,7 @@
 [ $runtime == ie9 ]
 double_round4_test: Fail, OK # IE bug: Math.round(4503599627370497) != 4503599627370497.
 double_round_to_double3_test: Fail, OK # IE bug: Math.round(4503599627370497) != 4503599627370497.
-
-[ $compiler == dart2js && ($runtime == chrome || $runtime == drt || $runtime == d8 || $runtime == safari) ]
-string_trim_unicode_test: Fail  # V8 bug 2408
+collection_length_test: Pass, Timeout # Issue 12844
 
 [ $runtime == opera ]
 core_runtime_types_test: Fail
@@ -41,27 +37,18 @@
 date_time7_test: Fail
 unicode_test: Fail
 
-[ $runtime == vm ]
-string_trim_unicode_test: Fail  # Bug 6569
-
 [ $compiler == dart2js ]
 error_stack_trace1_test: Fail # Issue 12399
-math_parse_double_test: Fail # Expect.equals(expected: <78187493520>, actual: <0>)
-math_test: Fail # issue 3333
-surrogate_pair_toUpper_test: Fail # Issue 6707
 
 big_integer_vm_test: Fail, OK # VM specific test.
 compare_to2_test: Fail, OK    # Requires bigint support.
 string_base_vm_test: Fail, OK # VM specific test.
 
-string_replace_func_test: Skip # Bug 6554 - doesn't terminate.
-
 [ $compiler == dart2js && $runtime == none ]
 *: Fail, Pass # TODO(ahe): Triage these tests.
 
 [ $compiler == dart2js && $runtime == ie9 ]
 date_time7_test: Fail # BUG(3304): Maybe this doesn't time out?
-json_strict_test: Fail # IE parses slightly harmless no-standard JSON.
 string_base_vm_test: Fail # BUG(3304): Maybe this doesn't time out?
 list_test: Fail # IE doesn't support typed data.
 
@@ -115,4 +102,4 @@
 collection_length_test: Pass, Timeout
 
 [ $arch == simmips && $mode == debug ]
-collection_to_string_test: Pass, Crash # Issue: 11207
+collection_to_string_test: Pass, Crash # Issue: 11207
\ No newline at end of file
diff --git a/tests/corelib/json_test.dart b/tests/corelib/json_test.dart
index f22cb98..e5d0758 100644
--- a/tests/corelib/json_test.dart
+++ b/tests/corelib/json_test.dart
@@ -115,7 +115,7 @@
   testError(integers: "");
 
   // Test for "Initial zero only allowed for zero integer part" moved to
-  // json_strict_test.dart because IE's JSON.parse accepts additional initial
+  // json_strict_test.dart because IE's JSON.decode accepts additional initial
   // zeros.
 
   // Only minus allowed as sign.
diff --git a/tests/corelib/linked_hash_map_from_iterable_test.dart b/tests/corelib/linked_hash_map_from_iterable_test.dart
index 02c9029..a8de693 100644
--- a/tests/corelib/linked_hash_map_from_iterable_test.dart
+++ b/tests/corelib/linked_hash_map_from_iterable_test.dart
@@ -101,12 +101,17 @@
 }
 
 void genericTypeTest() {
-  var map = new LinkedHashMap<int, String>.fromIterable([1, 2, 3], value: (x) => '$x');
+  var map = new LinkedHashMap<int, String>.fromIterable(
+      <int>[1, 2, 3], value: (x) => '$x');
   Expect.isTrue(map is Map<int, String>);
   Expect.isTrue(map is LinkedHashMap<int, String>);
 
+  map = new LinkedHashMap<String, String>.fromIterable(
+      <int>[1, 2, 3], key: (x) => '$x', value: (x) => '$x');
+  Expect.isTrue(map is Map<String, String>);
+  Expect.isTrue(map is LinkedHashMap<String, String>);
+
   // Make sure it is not just LinkedHashMap<dynamic, dynamic>.
-  Expect.isFalse(map is LinkedHashMap<String, dynamic>);
+  Expect.isFalse(map is LinkedHashMap<int, dynamic>);
   Expect.isFalse(map is LinkedHashMap<dynamic, int>);
 }
-
diff --git a/tests/corelib/map_from_iterable_test.dart b/tests/corelib/map_from_iterable_test.dart
index c5aa0c0..ed86cde 100644
--- a/tests/corelib/map_from_iterable_test.dart
+++ b/tests/corelib/map_from_iterable_test.dart
@@ -16,10 +16,10 @@
 }
 
 void defaultFunctionValuesTest() {
-  var map = new Map.fromIterable([1, 2, 3]);
+  var map = new HashMap.fromIterable([1, 2, 3]);
 
   Expect.isTrue(map is Map);
-  Expect.isTrue(map is LinkedHashMap);
+  Expect.isTrue(map is HashMap);
 
   Expect.equals(3, map.length);
   Expect.equals(3, map.keys.length);
@@ -31,10 +31,10 @@
 }
 
 void defaultKeyFunctionTest() {
-  var map = new Map.fromIterable([1, 2, 3], value: (x) => x + 1);
+  var map = new HashMap.fromIterable([1, 2, 3], value: (x) => x + 1);
 
   Expect.isTrue(map is Map);
-  Expect.isTrue(map is LinkedHashMap);
+  Expect.isTrue(map is HashMap);
 
   Expect.equals(3, map.length);
   Expect.equals(3, map.keys.length);
@@ -46,10 +46,10 @@
 }
 
 void defaultValueFunctionTest() {
-  var map = new Map.fromIterable([1, 2, 3], key: (x) => x + 1);
+  var map = new HashMap.fromIterable([1, 2, 3], key: (x) => x + 1);
 
   Expect.isTrue(map is Map);
-  Expect.isTrue(map is LinkedHashMap);
+  Expect.isTrue(map is HashMap);
 
   Expect.equals(3, map.length);
   Expect.equals(3, map.keys.length);
@@ -61,11 +61,11 @@
 }
 
 void noDefaultValuesTest() {
-  var map = new Map.fromIterable([1, 2, 3],
+  var map = new HashMap.fromIterable([1, 2, 3],
       key: (x) => x + 1, value: (x) => x - 1);
 
   Expect.isTrue(map is Map);
-  Expect.isTrue(map is LinkedHashMap);
+  Expect.isTrue(map is HashMap);
 
   Expect.equals(3, map.length);
   Expect.equals(3, map.keys.length);
@@ -77,9 +77,9 @@
 }
 
 void emptyIterableTest() {
-  var map = new Map.fromIterable([]);
+  var map = new HashMap.fromIterable([]);
   Expect.isTrue(map is Map);
-  Expect.isTrue(map is LinkedHashMap);
+  Expect.isTrue(map is HashMap);
 
   Expect.equals(0, map.length);
   Expect.equals(0, map.keys.length);
@@ -87,10 +87,10 @@
 }
 
 void equalElementsTest() {
-  var map = new Map.fromIterable([1, 2, 2], key: (x) => x + 1);
+  var map = new HashMap.fromIterable([1, 2, 2], key: (x) => x + 1);
 
   Expect.isTrue(map is Map);
-  Expect.isTrue(map is LinkedHashMap);
+  Expect.isTrue(map is HashMap);
 
   Expect.equals(2, map.length);
   Expect.equals(2, map.keys.length);
@@ -101,11 +101,12 @@
 }
 
 void genericTypeTest() {
-  var map = new Map<int, String>.fromIterable([1, 2, 3], value: (x) => '$x');
-  Expect.isTrue(map is Map<int, String>);
+  var map = new HashMap<String, String>.fromIterable(
+      <int>[1, 2, 3], key: (x) => '$x', value: (x) => '$x');
+  Expect.isTrue(map is Map<String, String>);
 
   // Make sure it is not just Map<dynamic, dynamic>.
-  Expect.isFalse(map is Map<String, dynamic>);
+  Expect.isFalse(map is Map<int, dynamic>);
   Expect.isFalse(map is Map<dynamic, int>);
 }
 
diff --git a/tests/corelib/string_source_test.dart b/tests/corelib/string_source_test.dart
new file mode 100644
index 0000000..9c16be5
--- /dev/null
+++ b/tests/corelib/string_source_test.dart
@@ -0,0 +1,35 @@
+// 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.
+
+// Test that different representations of the same string are all equal.
+
+import "dart:json" as json;
+
+import "package:expect/expect.dart";
+
+main() {
+  var base = "\u{10412}";
+  var strings = [
+    "\u{10412}",
+    "𐐒",
+    new String.fromCharCodes([0xd801, 0xdc12]),
+    base[0] + base[1],
+    "$base",
+    "${base[0]}${base[1]}",
+    "${base[0]}${base.substring(1)}",
+    new String.fromCharCodes([0x10412]),
+    ("a" + base).substring(1),
+    (new StringBuffer()..writeCharCode(0xd801)
+                       ..writeCharCode(0xdc12)).toString(),
+    (new StringBuffer()..writeCharCode(0x10412)).toString(),
+    json.parse('"\u{10412}"'),
+    json.parse('{"\u{10412}":[]}').keys.first
+  ];
+  for (String string in strings) {
+    Expect.equals(base.length, string.length);
+    Expect.equals(base, string);
+    Expect.equals(base.hashCode, string.hashCode);
+    Expect.listEquals(base.codeUnits.toList(), string.codeUnits.toList());
+  }
+}
diff --git a/tests/html/dromaeo_noop/dromaeo_smoke.dart b/tests/html/dromaeo_noop/dromaeo_smoke.dart
index 4dd24f2..68c5dc4 100644
--- a/tests/html/dromaeo_noop/dromaeo_smoke.dart
+++ b/tests/html/dromaeo_noop/dromaeo_smoke.dart
@@ -5,7 +5,7 @@
 library dromaeo;
 import 'dart:async';
 import 'dart:html';
-import 'dart:json' as json;
+import "dart:convert";
 import '../../../samples/third_party/dromaeo/common/common.dart';
 import 'dart:math' as Math;
 import '../../../pkg/unittest/lib/unittest.dart';
diff --git a/tests/html/element_test.dart b/tests/html/element_test.dart
index 199262f..42015fd 100644
--- a/tests/html/element_test.dart
+++ b/tests/html/element_test.dart
@@ -185,6 +185,7 @@
 
     test('.html tr', () {
       var table = new TableElement();
+      document.body.append(table);
       var tBody = table.createTBody();
       var node = tBody.createFragment('<tr><td>foo<td>bar').nodes.single;
       expect(node, predicate((x) => x is TableRowElement,
@@ -196,6 +197,7 @@
 
     test('.html td', () {
       var table = new TableElement();
+      document.body.append(table);
       var tBody = table.createTBody();
       var tRow = tBody.addRow();
       var node = tRow.createFragment('<td>foobar').nodes.single;
@@ -208,6 +210,7 @@
 
     test('.html th', () {
       var table = new TableElement();
+      document.body.append(table);
       var tBody = table.createTBody();
       var tRow = tBody.addRow();
       var node = tRow.createFragment('<th>foobar').nodes.single;
@@ -593,6 +596,7 @@
   group('matches', () {
     test('matches', () {
       var element = new DivElement();
+      document.body.append(element);
       element.classes.add('test');
 
       expect(element.matches('div'), true);
diff --git a/tests/html/html.status b/tests/html/html.status
index 98b47fb..29d55f0 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -2,6 +2,11 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+cssstyledeclaration_test: Skip # Issue 12951
+indexeddb_3_test: Skip # Issue 12948
+indexeddb_4_test: Skip # Issue 12948
+indexeddb_5_test: Skip # Issue 12948
+
 async_window_test: Skip #TODO(gram): investigating
 event_test: Skip  # Issue 1996
 interactive_test: Skip # Must be run manually.
@@ -16,6 +21,9 @@
 [ $compiler == none && ($runtime == drt || $runtime == dartium) && $mode == debug && $system == macos]
 audiobuffersourcenode_test: Pass, Fail, Crash # http://crbug.com/256601
 
+[ $compiler == none && $runtime == dartium && $system == macos]
+canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Pass,Fail # Issue 11834
+
 [ $compiler == none && ($runtime == drt || $runtime == dartium) ]
 # postMessage in dartium always transfers the typed array buffer, never a view
 postmessage_structured_test/typed_arrays: Fail
@@ -30,9 +38,11 @@
 dom_isolates_test: Skip # Need to migrate to new spawnDomFunction.
 
 [ $compiler == dart2js && $runtime == ie10 ]
-indexeddb_3_test: Pass, Timeout, Slow # Issue: http://dartbug.com/9437
-indexeddb_4_test: Pass, Timeout, Slow # Issue: http://dartbug.com/9437
 async_test: Pass, Fail # timers test fails on ie10.
+indexeddb_2_test: Fail # Issue 12893
+indexeddb_3_test: Fail, Timeout # Issue 9437 + 12893
+indexeddb_4_test: Fail, Timeout # Issue 9437 + 12893
+indexeddb_5_test: Fail # Issue 12893
 
 [ $compiler == dart2js && ( $runtime == ie9 || $runtime == ie10 ) ]
 worker_api_test: Fail # IE does not support URL.createObjectURL in web workers.
@@ -84,7 +94,7 @@
 dromaeo_smoke_test: Skip #TODO(efortuna): investigating.
 element_test/click: Fail                # IE does not support firing this event.
 history_test/history: Pass, Fail # issue 8183
-indexeddb_1_test/functional: Pass, Timeout # http://dartbug.com/9269
+indexeddb_1_test/functional: Fail, Timeout # Issue 9269 + 12893
 isolates_test: Skip
 microtask_test: Fail, Pass # Appears to be flaky
 native_gc_test: Fail, Pass # BUG(7774): Untriaged.
@@ -145,8 +155,6 @@
 dom_constructors_test: Fail
 dromaeo_smoke_test: Skip #TODO(efortuna): investigating.
 element_test/click: Fail                # IE does not support firing this event.
-element_test/constructors: Fail         # IE9 does not support innerHTML on table elements
-element_test/matches: Fail # IE9 does not support matches
 form_element_test: Fail # Issue 4793.
 isolates_test: Skip         # BUG(4016)
 localstorage_test: Fail
@@ -158,6 +166,7 @@
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # IE does not support drawImage w/ video element
 canvasrenderingcontext2d_test/drawImage_image_element: Pass, Fail # Issue: 11416
 input_element_test/attributes: Fail # IE returns null while others ''
+xhr_cross_origin_test: Skip # Issue 12920
 
 # IE9 Feature support statuses-
 # All changes should be accompanied by platform support annotation changes.
@@ -237,7 +246,6 @@
 websocket_test/supported: Fail
 websql_test/supported: Fail
 worker_test/supported: Fail
-xhr_cross_origin_test/supported: Fail
 xhr_test/supported_HttpRequestProgressEvent: Fail
 xhr_test/supported_onLoadEnd: Fail
 xhr_test/supported_onProgress: Fail
@@ -356,9 +364,6 @@
 xhr_test/supported_HttpRequestProgressEvent: Fail
 
 
-[ $runtime == ff && ($system == linux || $system == windows) ]
-rtc_test/functionality: Fail # Issue: 12109.
-
 # 'html' tests import the HTML library, so they only make sense in
 # a browser environment.
 [ $runtime == vm ]
@@ -379,3 +384,6 @@
 js_test: Skip                      # Test cannot run under CSP restrictions (times out).
 postmessage_structured_test: Skip  # Test cannot run under CSP restrictions (times out).
 safe_dom_test: Skip                # Test cannot run under CSP restrictions (times out).
+
+[ $compiler == dart2js && $runtime == drt ]
+wheelevent_test: Fail # http://dartbug.com/12958
diff --git a/tests/html/node_validator_test.dart b/tests/html/node_validator_test.dart
index 7f76762..ae25743 100644
--- a/tests/html/node_validator_test.dart
+++ b/tests/html/node_validator_test.dart
@@ -87,6 +87,11 @@
         '<div><script></script><script></script></div>',
         '<div></div>');
 
+    testHtml('blocks inline styles',
+        validator,
+        '<div style="background: red"></div>',
+        '<div></div>');
+
     testHtml('blocks namespaced attributes',
         validator,
         '<div ns:foo="foo"></div>',
@@ -373,6 +378,34 @@
           '<foreignobject width="100" height="150"></foreignobject>'
         '</svg>');
     });
+
+    group('allowInlineStyles', () {
+      var validator = new NodeValidatorBuilder()
+          ..allowTextElements()
+          ..allowInlineStyles();
+
+      testHtml('allows inline styles',
+          validator,
+          '<span style="background-color:red">text</span>');
+
+      testHtml('blocks other attributes',
+          validator,
+          '<span class="red-span"></span>',
+          '<span></span>');
+
+      validator = new NodeValidatorBuilder()
+          ..allowTextElements()
+          ..allowInlineStyles(tagName: 'span');
+
+      testHtml('scoped allows inline styles on spans',
+          validator,
+          '<span style="background-color:red">text</span>');
+
+      testHtml('scoped blocks inline styles on LIs',
+          validator,
+          '<li style="background-color:red">text</li>',
+          '<li>text</li>');
+    });
   });
 
   group('throws', () {
diff --git a/tests/html/safe_dom_test.dart b/tests/html/safe_dom_test.dart
index 15f781c..7407d76 100644
--- a/tests/html/safe_dom_test.dart
+++ b/tests/html/safe_dom_test.dart
@@ -70,7 +70,7 @@
   }
 
   if (Range.supportsCreateContextualFragment) {
-    var range = doc.$dom_createRange();
+    var range = doc.createRange();
     range.selectNode(contextElement);
     return range.createContextualFragment(html);
   } else {
diff --git a/tests/html/wheelevent_test.dart b/tests/html/wheelevent_test.dart
index ce801f5..4acb908 100644
--- a/tests/html/wheelevent_test.dart
+++ b/tests/html/wheelevent_test.dart
@@ -19,7 +19,7 @@
     element.onMouseWheel.listen(expectAsync1((e) {
       expect(e.screen.x, 100);
       expect(e.deltaX, 0);
-      expect(e.deltaY, 240);
+      expect(e.deltaY.toDouble(), 240.0);
       expect(e.deltaMode, isNotNull);
     }));
     var event = new WheelEvent(eventType,
@@ -36,7 +36,7 @@
     element.onMouseWheel.listen(expectAsync1((e) {
       expect(e.screen.x, 100);
       expect(e.deltaX, 0);
-      expect(e.deltaY, 240);
+      expect(e.deltaY.toDouble(), 240.0);
     }));
     var event = new WheelEvent(eventType,
       deltaX: 0,
diff --git a/tests/html/xhr_cross_origin_test.dart b/tests/html/xhr_cross_origin_test.dart
index a9eda40..5a0f6cb 100644
--- a/tests/html/xhr_cross_origin_test.dart
+++ b/tests/html/xhr_cross_origin_test.dart
@@ -6,7 +6,7 @@
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_individual_config.dart';
 import 'dart:html';
-import 'dart:json' as json;
+import "dart:convert";
 
 /**
  * Examine the value of "crossOriginPort" as passed in from the url from
@@ -42,7 +42,7 @@
       var gotError = false;
       var url = '$host/root_dart/tests/html/xhr_cross_origin_data.txt';
       return HttpRequest.request(url).then((xhr) {
-        var data = json.parse(xhr.response);
+        var data = JSON.decode(xhr.response);
         expect(data, contains('feed'));
         expect(data['feed'], contains('entry'));
         expect(data, isMap);
@@ -92,7 +92,7 @@
       xhr.onReadyStateChange.listen((e) {
         guardAsync(() {
           if (xhr.readyState == HttpRequest.DONE) {
-            validate(json.parse(xhr.response));
+            validate(JSON.decode(xhr.response));
           }
         });
       });
@@ -102,7 +102,7 @@
     test('XHR.getWithCredentials Cross-domain', () {
       var url = '$host/root_dart/tests/html/xhr_cross_origin_data.txt';
       return HttpRequest.request(url, withCredentials: true).then((xhr) {
-        var data = json.parse(xhr.response);
+        var data = JSON.decode(xhr.response);
         expect(data, contains('feed'));
         expect(data['feed'], contains('entry'));
         expect(data, isMap);
diff --git a/tests/html/xhr_test.dart b/tests/html/xhr_test.dart
index 1d53209..b5c538b 100644
--- a/tests/html/xhr_test.dart
+++ b/tests/html/xhr_test.dart
@@ -7,7 +7,7 @@
 import '../../pkg/unittest/lib/html_individual_config.dart';
 import 'dart:async';
 import 'dart:html';
-import 'dart:json' as json;
+import "dart:convert";
 import 'dart:typed_data';
 
 void fail(message) {
@@ -26,7 +26,7 @@
 
   void validate200Response(xhr) {
     expect(xhr.status, equals(200));
-    var data = json.parse(xhr.responseText);
+    var data = JSON.decode(xhr.responseText);
     expect(data, contains('feed'));
     expect(data['feed'], contains('entry'));
     expect(data, isMap);
diff --git a/tests/isolate/global_error_handler2_test.dart b/tests/isolate/global_error_handler2_test.dart
index d038f88..a71d595 100644
--- a/tests/isolate/global_error_handler2_test.dart
+++ b/tests/isolate/global_error_handler2_test.dart
@@ -7,7 +7,7 @@
 import 'package:expect/expect.dart';
 import 'dart:async';
 import 'dart:isolate';
-import '../async_helper.dart';
+import "package:async_helper/async_helper.dart";
 
 runTest() {
   SendPort mainIsolate;
diff --git a/tests/isolate/global_error_handler_stream2_test.dart b/tests/isolate/global_error_handler_stream2_test.dart
index 8590046..8a1aa5f 100644
--- a/tests/isolate/global_error_handler_stream2_test.dart
+++ b/tests/isolate/global_error_handler_stream2_test.dart
@@ -7,7 +7,7 @@
 import 'package:expect/expect.dart';
 import 'dart:async';
 import 'dart:isolate';
-import '../async_helper.dart';
+import "package:async_helper/async_helper.dart";
 
 runTest() {
   IsolateSink mainIsolate;
diff --git a/tests/isolate/illegal_msg_stream_test.dart b/tests/isolate/illegal_msg_stream_test.dart
index 2271ed5..5f80065 100644
--- a/tests/isolate/illegal_msg_stream_test.dart
+++ b/tests/isolate/illegal_msg_stream_test.dart
@@ -6,7 +6,7 @@
 
 import 'package:expect/expect.dart';
 import 'dart:isolate';
-import '../async_helper.dart';
+import "package:async_helper/async_helper.dart";
 
 funcFoo(x) => x + 2;
 
diff --git a/tests/isolate/illegal_msg_test.dart b/tests/isolate/illegal_msg_test.dart
index aa17b46..ed29bd9 100644
--- a/tests/isolate/illegal_msg_test.dart
+++ b/tests/isolate/illegal_msg_test.dart
@@ -5,7 +5,7 @@
 library illegal_msg_tests;
 import "package:expect/expect.dart";
 import 'dart:isolate';
-import '../async_helper.dart';
+import "package:async_helper/async_helper.dart";
 
 funcFoo(x) => x + 2;
 
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 5798289..1e076c7 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -22,9 +22,6 @@
 spawn_uri_vm_negative_test: Fail
 unresolved_ports_negative_test: Fail
 
-[ $compiler == dart2analyzer ]
-isolate_import_negative_test: Fail
-
 [ $compiler == dart2js && $jscl ]
 browser/*: SkipByDesign  # Browser specific tests
 illegal_msg_stream_test: Fail # Issue 6750
diff --git a/tests/isolate/isolate2_negative_test.dart b/tests/isolate/isolate2_negative_test.dart
index 01cf0ed..49ccb2e 100644
--- a/tests/isolate/isolate2_negative_test.dart
+++ b/tests/isolate/isolate2_negative_test.dart
@@ -7,7 +7,7 @@
 
 library isolate2_negative_test;
 import 'dart:isolate';
-import '../async_helper.dart';
+import "package:async_helper/async_helper.dart";
 
 void entry() {
   throw "foo";
diff --git a/tests/isolate/mandel_isolate_stream_test.dart b/tests/isolate/mandel_isolate_stream_test.dart
index 302696e..ffe3c9a 100644
--- a/tests/isolate/mandel_isolate_stream_test.dart
+++ b/tests/isolate/mandel_isolate_stream_test.dart
@@ -13,6 +13,8 @@
 const ISOLATES = 20;
 
 main() {
+  // Test is really slow in debug builds of the VM.
+  unittestConfiguration.timeout = const Duration(seconds: 480);
   test("Render Mandelbrot in parallel", () {
     final state = new MandelbrotState();
     state._validated.future.then(expectAsync1((result) {
diff --git a/tests/isolate/mandel_isolate_test.dart b/tests/isolate/mandel_isolate_test.dart
index 3e03544..9e3e14f 100644
--- a/tests/isolate/mandel_isolate_test.dart
+++ b/tests/isolate/mandel_isolate_test.dart
@@ -13,6 +13,8 @@
 const ISOLATES = 20;
 
 main() {
+  // Test is really slow in debug builds of the VM.
+  unittestConfiguration.timeout = const Duration(seconds: 480);
   test("Render Mandelbrot in parallel", () {
     final state = new MandelbrotState();
     state._validated.future.then(expectAsync1((result) {
diff --git a/tests/json/json_test.dart b/tests/json/json_test.dart
index ca21451..891fef3 100644
--- a/tests/json/json_test.dart
+++ b/tests/json/json_test.dart
@@ -4,7 +4,7 @@
 
 library json_tests;
 import "package:expect/expect.dart";
-import 'dart:json' as json;
+import "dart:convert";
 import 'dart:html';
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
@@ -13,61 +13,61 @@
   useHtmlConfiguration();
   test('Parse', () {
     // Scalars.
-    expect(json.parse(' 5 '), equals(5));
-    expect(json.parse(' -42 '), equals(-42));
-    expect(json.parse(' 3e0 '), equals(3));
-    expect(json.parse(' 3.14 '), equals(3.14));
-    expect(json.parse('true '), isTrue);
-    expect(json.parse(' false'), isFalse);
-    expect(json.parse(' null '), isNull);
-    expect(json.parse('\n\rnull\t'), isNull);
-    expect(json.parse(' "hi there\\" bob" '), equals('hi there" bob'));
-    expect(json.parse(' "" '), isEmpty);
+    expect(JSON.decode(' 5 '), equals(5));
+    expect(JSON.decode(' -42 '), equals(-42));
+    expect(JSON.decode(' 3e0 '), equals(3));
+    expect(JSON.decode(' 3.14 '), equals(3.14));
+    expect(JSON.decode('true '), isTrue);
+    expect(JSON.decode(' false'), isFalse);
+    expect(JSON.decode(' null '), isNull);
+    expect(JSON.decode('\n\rnull\t'), isNull);
+    expect(JSON.decode(' "hi there\\" bob" '), equals('hi there" bob'));
+    expect(JSON.decode(' "" '), isEmpty);
 
     // Lists.
-    expect(json.parse(' [] '), isEmpty);
-    expect(json.parse('[ ]'), isEmpty);
-    expect(json.parse(' [3, -4.5, true, "hi", false] '),
+    expect(JSON.decode(' [] '), isEmpty);
+    expect(JSON.decode('[ ]'), isEmpty);
+    expect(JSON.decode(' [3, -4.5, true, "hi", false] '),
       equals([3, -4.5, true, 'hi', false]));
     // Nulls are tricky.
-    expect(json.parse('[null]'), orderedEquals([null]));
-    expect(json.parse(' [3, -4.5, null, true, "hi", false] '),
+    expect(JSON.decode('[null]'), orderedEquals([null]));
+    expect(JSON.decode(' [3, -4.5, null, true, "hi", false] '),
       equals([3, -4.5, null, true, 'hi', false]));
-    expect(json.parse('[[null]]'), equals([[null]]));
-    expect(json.parse(' [ [3], [], [null], ["hi", true]] '),
+    expect(JSON.decode('[[null]]'), equals([[null]]));
+    expect(JSON.decode(' [ [3], [], [null], ["hi", true]] '),
       equals([[3], [], [null], ['hi', true]]));
 
     // Maps.
-    expect(json.parse(' {} '), isEmpty);
-    expect(json.parse('{ }'), isEmpty);
+    expect(JSON.decode(' {} '), isEmpty);
+    expect(JSON.decode('{ }'), isEmpty);
 
-    expect(json.parse(
+    expect(JSON.decode(
         ' {"x":3, "y": -4.5,  "z" : "hi","u" : true, "v": false } '),
         equals({"x":3, "y": -4.5,  "z" : "hi", "u" : true, "v": false }));
 
-    expect(json.parse(' {"x":3, "y": -4.5,  "z" : "hi" } '),
+    expect(JSON.decode(' {"x":3, "y": -4.5,  "z" : "hi" } '),
         equals({"x":3, "y": -4.5,  "z" : "hi" }));
 
-    expect(json.parse(' {"y": -4.5,  "z" : "hi" ,"x":3 } '),
+    expect(JSON.decode(' {"y": -4.5,  "z" : "hi" ,"x":3 } '),
         equals({"y": -4.5,  "z" : "hi" ,"x":3 }));
 
-    expect(json.parse('{ " hi bob " :3, "": 4.5}'),
+    expect(JSON.decode('{ " hi bob " :3, "": 4.5}'),
         equals({ " hi bob " :3, "": 4.5}));
 
-    expect(json.parse(' { "x" : { } } '), equals({ 'x' : {}}));
-    expect(json.parse('{"x":{}}'), equals({ 'x' : {}}));
+    expect(JSON.decode(' { "x" : { } } '), equals({ 'x' : {}}));
+    expect(JSON.decode('{"x":{}}'), equals({ 'x' : {}}));
 
     // Nulls are tricky.
-    expect(json.parse('{"w":null}'), equals({ 'w' : null}));
+    expect(JSON.decode('{"w":null}'), equals({ 'w' : null}));
 
-    expect(json.parse('{"x":{"w":null}}'), equals({"x":{"w":null}}));
+    expect(JSON.decode('{"x":{"w":null}}'), equals({"x":{"w":null}}));
 
-    expect(json.parse(' {"x":3, "y": -4.5,  "z" : "hi",'
+    expect(JSON.decode(' {"x":3, "y": -4.5,  "z" : "hi",'
                    '"w":null, "u" : true, "v": false } '),
         equals({"x":3, "y": -4.5,  "z" : "hi",
                    "w":null, "u" : true, "v": false }));
 
-    expect(json.parse('{"x": {"a":3, "b": -4.5}, "y":[{}], '
+    expect(JSON.decode('{"x": {"a":3, "b": -4.5}, "y":[{}], '
                    '"z":"hi","w":{"c":null,"d":true}, "v":null}'),
         equals({"x": {"a":3, "b": -4.5}, "y":[{}],
                    "z":"hi","w":{"c":null,"d":true}, "v":null}));
@@ -75,34 +75,34 @@
 
   test('stringify', () {
     // Scalars.
-    expect(json.stringify(5), equals('5'));
-    expect(json.stringify(-42), equals('-42'));
+    expect(JSON.encode(5), equals('5'));
+    expect(JSON.encode(-42), equals('-42'));
     // Dart does not guarantee a formatting for doubles,
     // so reparse and compare to the original.
     validateRoundTrip(3.14);
-    expect(json.stringify(true), equals('true'));
-    expect(json.stringify(false), equals('false'));
-    expect(json.stringify(null), equals('null'));
-    expect(json.stringify(' hi there" bob '), equals('" hi there\\" bob "'));
-    expect(json.stringify('hi\\there'), equals('"hi\\\\there"'));
+    expect(JSON.encode(true), equals('true'));
+    expect(JSON.encode(false), equals('false'));
+    expect(JSON.encode(null), equals('null'));
+    expect(JSON.encode(' hi there" bob '), equals('" hi there\\" bob "'));
+    expect(JSON.encode('hi\\there'), equals('"hi\\\\there"'));
     // TODO(devoncarew): these tests break the dartium build
-    //expect(json.stringify('hi\nthere'), equals('"hi\\nthere"'));
-    //expect(json.stringify('hi\r\nthere'), equals('"hi\\r\\nthere"'));
-    expect(json.stringify(''), equals('""'));
+    //expect(JSON.encode('hi\nthere'), equals('"hi\\nthere"'));
+    //expect(JSON.encode('hi\r\nthere'), equals('"hi\\r\\nthere"'));
+    expect(JSON.encode(''), equals('""'));
 
     // Lists.
-    expect(json.stringify([]), equals('[]'));
-    expect(json.stringify(new List(0)), equals('[]'));
-    expect(json.stringify(new List(3)), equals('[null,null,null]'));
+    expect(JSON.encode([]), equals('[]'));
+    expect(JSON.encode(new List(0)), equals('[]'));
+    expect(JSON.encode(new List(3)), equals('[null,null,null]'));
     validateRoundTrip([3, -4.5, null, true, 'hi', false]);
-    expect(json.stringify([[3], [], [null], ['hi', true]]),
+    expect(JSON.encode([[3], [], [null], ['hi', true]]),
       equals('[[3],[],[null],["hi",true]]'));
 
     // Maps.
-    expect(json.stringify({}), equals('{}'));
-    expect(json.stringify(new Map()), equals('{}'));
-    expect(json.stringify({'x':{}}), equals('{"x":{}}'));
-    expect(json.stringify({'x':{'a':3}}), equals('{"x":{"a":3}}'));
+    expect(JSON.encode({}), equals('{}'));
+    expect(JSON.encode(new Map()), equals('{}'));
+    expect(JSON.encode({'x':{}}), equals('{"x":{}}'));
+    expect(JSON.encode({'x':{'a':3}}), equals('{"x":{"a":3}}'));
 
     // Dart does not guarantee an order on the keys
     // of a map literal, so reparse and compare to the original Map.
@@ -114,17 +114,17 @@
         {'x':{'a':3, 'b':-4.5}, 'y':[{}], 'z':'hi', 'w':{'c':null, 'd':true},
                   'v':null});
 
-    expect(json.stringify(new ToJson(4)), "4");
-    expect(json.stringify(new ToJson([4, "a"])), '[4,"a"]');
-    expect(json.stringify(new ToJson([4, new ToJson({"x":42})])),
+    expect(JSON.encode(new ToJson(4)), "4");
+    expect(JSON.encode(new ToJson([4, "a"])), '[4,"a"]');
+    expect(JSON.encode(new ToJson([4, new ToJson({"x":42})])),
            '[4,{"x":42}]');
 
     Expect.throws(() {
-      json.stringify([new ToJson(new ToJson(4))]);
+      JSON.encode([new ToJson(new ToJson(4))]);
     });
 
     Expect.throws(() {
-      json.stringify([new Object()]);
+      JSON.encode([new Object()]);
     });
 
   });
@@ -134,7 +134,7 @@
      * Checks that we get an exception (rather than silently returning null) if
      * we try to stringify something that cannot be converted to json.
      */
-    expect(() => json.stringify(new TestClass()), throws);
+    expect(() => JSON.encode(new TestClass()), throws);
   });
 }
 
@@ -156,7 +156,7 @@
  * back, and produce something equivalent to the argument.
  */
 validateRoundTrip(expected) {
-  expect(json.parse(json.stringify(expected)), equals(expected));
+  expect(JSON.decode(JSON.encode(expected)), equals(expected));
 }
 
 
diff --git a/tests/language/abstract_syntax_test.dart b/tests/language/abstract_syntax_test.dart
index 531b0ef2..875b203 100644
--- a/tests/language/abstract_syntax_test.dart
+++ b/tests/language/abstract_syntax_test.dart
@@ -10,8 +10,8 @@
 }
 
 class A {
-  /* abstract */ foo();
-  /* abstract */ static bar(); /// 01: compile-time error
+  foo();  /// 00: static type warning
+  static bar();  /// 01: compile-time error
 }
 
 class B extends A {
diff --git a/tests/language/call_nonexistent_static_test.dart b/tests/language/call_nonexistent_static_test.dart
index dd2835f..b97b542 100644
--- a/tests/language/call_nonexistent_static_test.dart
+++ b/tests/language/call_nonexistent_static_test.dart
@@ -24,7 +24,7 @@
 }
 
 alwaysThrows() {
-  throw new NoSuchMethodError(null, 'foo', [], {});
+  throw new NoSuchMethodError(null, const Symbol('foo'), [], {});
 }
 
 test01() {
diff --git a/tests/language/class_cycle2_test.dart b/tests/language/class_cycle2_test.dart
new file mode 100644
index 0000000..5e352b3
--- /dev/null
+++ b/tests/language/class_cycle2_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Check fail because of cycles in super class relationship.
+
+class C extends B {}
+
+class A extends B {}
+
+class B
+  extends A  /// 01: compile-time error
+  extends A  /// 02: compile-time error
+{}
+
+main() {
+  new C();  /// 01: continued
+  new List<C>();  /// 02: continued
+}
diff --git a/tests/language/class_cycle_negative_test.dart b/tests/language/class_cycle_negative_test.dart
deleted file mode 100644
index f54b9f8..0000000
--- a/tests/language/class_cycle_negative_test.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// Check fail because of cycles in super class relationship.
-
-class C extends B {
-
-}
-
-class A extends B {
-
-}
-
-class B extends A {
-
-}
-
-class ClassCycleNegativeTest {
-  static testMain() {
-  }
-}
-main() {
-  ClassCycleNegativeTest.testMain();
-}
diff --git a/tests/language/constructor2_negative_test.dart b/tests/language/constructor9_test.dart
similarity index 66%
rename from tests/language/constructor2_negative_test.dart
rename to tests/language/constructor9_test.dart
index 013ffc0..4c7a74e 100644
--- a/tests/language/constructor2_negative_test.dart
+++ b/tests/language/constructor9_test.dart
@@ -1,22 +1,18 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// Check that all final instance fields of a class are initialized by constructors.
+
+// Check that all final instance fields of a class are initialized by
+// constructors.
 
 
 class Klass {
   Klass(var v): field_ = v { }
-  final uninitializedFinalField_;
+  final uninitializedFinalField_;  /// 01: compile-time error
   var field_;
 }
 
 
-class Constructor2NegativeTest {
-  static testMain() {
-    var o = new Klass(5);
-  }
-}
-
 main() {
-  Constructor2NegativeTest.testMain();
+  new Klass(5);
 }
diff --git a/tests/language/constructor_return_negative_test.dart b/tests/language/constructor_return_negative_test.dart
deleted file mode 100644
index 112b565..0000000
--- a/tests/language/constructor_return_negative_test.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-class A {
-  A() { return null; }
-}
-
-main() {
-  new A();
-}
diff --git a/tests/language/constructor_return_test.dart b/tests/language/constructor_return_test.dart
index 8f30645..f46c9ec 100644
--- a/tests/language/constructor_return_test.dart
+++ b/tests/language/constructor_return_test.dart
@@ -8,10 +8,18 @@
 // statements in the form 'return;'.
 class A {
   int x;
-  A(this.x) { return; } // 'return;' is equivalent to 'return this;'
+  A(this.x) { return; }
+  A.test1(this.x) {
+    return this;  /// 01: compile-time error
+  }
+  A.test2(this.x) {
+    return null;  /// 02: compile-time error
+  }
   int foo(int y) => x + y;
 }
 
 main() {
   Expect.equals((new A(1)).foo(10), 11);
+  Expect.equals((new A.test1(1)).foo(10), 11);
+  Expect.equals((new A.test2(1)).foo(10), 11);
 }
diff --git a/tests/language/inferrer_synthesized_constructor_test.dart b/tests/language/inferrer_synthesized_constructor_test.dart
new file mode 100644
index 0000000..aa6c52b
--- /dev/null
+++ b/tests/language/inferrer_synthesized_constructor_test.dart
@@ -0,0 +1,27 @@
+// 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.
+
+// Regression test for dart2js's type inferrer that used to not
+// propagate default types in synthesized calls.
+
+import "package:expect/expect.dart";
+
+class A {
+  final x;
+  A([this.x = 'foo']);
+}
+
+class B extends A {
+  // The synthesized constructor was not saying that it would call
+  // [A]'s constructor with its default type.
+}
+
+main() {
+  // By calling [B]'s constructor with an int parameter, the inferrer
+  // used to only see this call and consider the [A.x] field to always
+  // be int.
+  Expect.equals(84, new A(42).x + 42);
+  Expect.throws(() => new B().x + 42,
+                (e) => e is ArgumentError || e is TypeError);
+}
diff --git a/tests/language/instanceof4_test.dart b/tests/language/instanceof4_test.dart
index 1a3d1ca..86282da 100644
--- a/tests/language/instanceof4_test.dart
+++ b/tests/language/instanceof4_test.dart
@@ -22,23 +22,23 @@
   Expect.isTrue(!o.isNotT());
   Expect.isTrue(o.isListT());
   Expect.isTrue(!o.isNotListT());
-  Expect.isTrue(!o.isAlsoListT());
-  Expect.isTrue(o.isNeitherListT());
+  Expect.isTrue(!o.isAlsoListT());  /// 01: ok
+  Expect.isTrue(o.isNeitherListT());  /// 01: ok
   for (var i = 0; i < 20; i++) {
     // Make sure methods are optimized.
     o.isT();
     o.isNotT();
     o.isListT();
     o.isNotListT();
-    o.isAlsoListT();
-    o.isNeitherListT();
+    o.isAlsoListT();  /// 01: ok
+    o.isNeitherListT();  /// 01: ok
   }
-  Expect.isTrue(o.isT());
-  Expect.isTrue(!o.isNotT());
-  Expect.isTrue(o.isListT());
-  Expect.isTrue(!o.isNotListT());
-  Expect.isTrue(!o.isAlsoListT());
-  Expect.isTrue(o.isNeitherListT());
+  Expect.isTrue(o.isT(), "1");
+  Expect.isTrue(!o.isNotT(), "2");
+  Expect.isTrue(o.isListT(), "3");
+  Expect.isTrue(!o.isNotListT(), "4");
+  Expect.isTrue(!o.isAlsoListT(), "5");  /// 01: ok
+  Expect.isTrue(o.isNeitherListT(), "6");  /// 01: ok
 }
 
 testFooInt() {
diff --git a/tests/language/interface_cycle_negative_test.dart b/tests/language/interface_cycle_negative_test.dart
deleted file mode 100644
index f8e268b..0000000
--- a/tests/language/interface_cycle_negative_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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
-// BSD-style license that can be found in the LICENSE file.
-// Check fail because of cycles in super interface relationship.
-
-abstract class C implements B {
-
-}
-
-abstract class A implements B {
-
-}
-
-abstract class B implements A {
-
-}
-
-class InterfaceCycleNegativeTest {
-  static testMain() {
-  }
-}
-
-main() {
-  InterfaceCycleNegativeTest.testMain();
-}
diff --git a/tests/language/interface_cycle_test.dart b/tests/language/interface_cycle_test.dart
new file mode 100644
index 0000000..db57fd1
--- /dev/null
+++ b/tests/language/interface_cycle_test.dart
@@ -0,0 +1,18 @@
+// 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
+// BSD-style license that can be found in the LICENSE file.
+// Check fail because of cycles in super interface relationship.
+
+class C implements B {}
+
+class A implements B {}
+
+class B
+  implements A  /// 01: compile-time error
+  implements A  /// 02: compile-time error
+{}
+
+main() {
+  new C();  /// 01: continued
+  new List<C>();  /// 02: continued
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index 8e8443b..1470441 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -18,12 +18,10 @@
 constructor5_test: Fail # Issue 6422
 constructor6_test: Fail # Issue 6422
 closure_in_initializer_test: Fail # Issue 6422
-call_nonexistent_constructor_test: Fail # Issue 12820
 
 # Regular bugs which should be fixed.
 super_first_constructor_test: Fail # Issue 1372.
 lazy_static3_test: Fail # Issue 12593
-export_cyclic_test: Fail, Crash # Issue 6060
 duplicate_export_negative_test: Fail # Issue 6134
 on_catch_malformed_type_test: Fail # Issue 8601
 mixin_mixin_test: Fail # Issue 9683
@@ -57,6 +55,5 @@
 dynamic_prefix_core_test: Fail # Issue 12478
 
 [ $compiler == none && $runtime == drt ]
-vm/reflect_core_vm_test: Fail  # Temporarily marked as fail.
 mixin_illegal_object_test/01: pass # Issue 10952.
 mixin_illegal_object_test/02: pass # Issue 10952.
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 80e7313..0eea3a2 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -10,6 +10,10 @@
 # TBD: using built-in identifers
 built_in_identifier_prefix_test: fail # Issue 12694
 
+# TBD: these look like bad tests, no issue number
+class_literal_test: fail
+constructor_call_as_function_test/01: fail
+
 # TBF: It is a static type warning if a type parameter is a supertype of its upper bound.
 cyclic_type_variable_test/01: fail
 cyclic_type_variable_test/02: fail
@@ -54,8 +58,6 @@
 pseudo_kw_test: fail
 
 
-
-
 # test issue 10683, It is a compile-time error if e refers to the name v or the name v=.
 block_scope_test: fail
 lazy_static3_test: fail
@@ -80,7 +82,6 @@
 
 # test issue 11575, classes with abstrac members are not marked as abstract
 abstract_factory_constructor_test/none: fail # Issue 11575
-abstract_syntax_test/none: fail # Issue 11575
 get_set_syntax_test/none: fail # Issue 11575
 implicit_this_test/none: fail # Issue 11575
 interface_test/none: fail # Issue 11575
@@ -134,10 +135,9 @@
 # test issue 11595, It is static warning to create instance (new) of the malformed type
 instantiate_type_variable_negative_test: fail
 
-# test issue 11598, Any use of a malbounded type gives rise to a static warning
-mixin_type_parameters_errors_test/01: fail
-mixin_type_parameters_errors_test/02: fail
-mixin_type_parameters_errors_test/05: fail
+mixin_type_parameters_errors_test/01: fail # Issue 11598
+mixin_type_parameters_errors_test/02: fail # Issue 11598
+mixin_type_parameters_errors_test/05: fail # Issue 11598
 
 # test issue 11698, no setter, so warning, not error
 assign_instance_method_negative_test: fail
@@ -168,7 +168,7 @@
 
 # test issue 12157, uninitializer instance variable is warning, so not negative test
 static_final_field_negative_test: fail
-constructor2_negative_test: fail
+constructor9_test/01: fail # Issue 12157
 
 # test issue 12159, print(exception.message_); causes static warning, not an error
 throw7_negative_test: fail
@@ -196,9 +196,6 @@
 # test issue 12191, ambiguous import is always warning now
 prefix3_negative_test: fail # Issue 12191
 library_ambiguous_test/00: fail # Issue 12191
-library_ambiguous_test/01: fail # Issue 12191
-library_ambiguous_test/02: fail # Issue 12191
-library_ambiguous_test/03: fail # Issue 12191
 
 # test issue 12289, assignment in assert statement
 type_error_test: fail # Issue 12289
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 96785d6..1a19e14 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -7,24 +7,12 @@
 # Runtime negative test. No static errors or warnings.
 closure_call_wrong_argument_count_negative_test: skip
 
-illegal_invocation_test/01: fail # Issue: 11892
-
-# TBF: m([int p = 'String'])
-assign_static_type_test/06: fail
-
 # TBD: using built-in identifers
 built_in_identifier_prefix_test: fail # Issue 12694
 
-# TBF: (o as C) is not rolled back
-cast_test/04: fail
-cast_test/05: fail
-
-# TBF: It is a compile-time error if the superclass of a class C appears in the implements clause of C.
-const_constructor_super_test/01: fail
-
-# TBF: m([int p = 'String']) and call 'const' instance creation
-compile_time_constant_checked2_test/03: fail
-compile_time_constant_checked3_test/03: fail
+# TBD: these look like bad tests, no issue number
+class_literal_test: fail
+constructor_call_as_function_test/01: fail
 
 # TBF: It is a static type warning if a type parameter is a supertype of its upper bound.
 cyclic_type_variable_test/01: fail
@@ -49,20 +37,14 @@
 list_literal_syntax_test/03: fail # Issue 12103
 malformed_test/none: fail # Issue 12696
 
-# TBF: disallowed in the most recent spec
-named_parameters_aggregated_test/03: fail
-positional_parameters_type_test: fail
-
-# TBF: non-const superinitializer; 7.6.3 Constant Constructors: The superinitializer that appears, explicitly or implicitly, in the initializer list of a constant constructor must specify a constant constructor of the superclass of the immediately enclosing class.
-non_const_super_negative_test: fail
-
 # TBF: 1is int; invalid character in number
 number_identifier_negative_test: fail
 
 # TBF: we should check conflicts not only for methods, but for accessors too
-override_field_test/01: fail
 override_field_test/02: fail
 override_field_test/03: fail
+method_override7_test/03: Fail # Issue 11496
+method_override8_test/03: Fail # Issue 11496
 
 # TBF: prefix T hidden by type variable T in 'new T.Class()'
 prefix10_negative_test: fail
@@ -75,28 +57,6 @@
 # TBF
 pseudo_kw_test: fail
 
-# TBF: hiding at start of the block and declared after declaration statement
-scope_negative_test: fail
-
-# TBF: 'instance.staticMethod()' is static warning
-static_field_test/01: fail
-static_field_test/02: fail
-static_field_test/03: fail
-
-# TBF
-method_override2_test/00: fail # issue 11497
-method_override2_test/01: fail # issue 11497
-method_override2_test/02: fail # issue 11497
-method_override2_test/03: fail # issue 11497
-method_override3_test/00: fail # issue 11497
-method_override3_test/01: fail # issue 11497
-method_override3_test/02: fail # issue 11497
-method_override4_test: fail # issue 11497
-method_override5_test: fail # issue 11497
-method_override6_test: fail # issue 11497
-
-
-
 
 # test issue 10683, It is a compile-time error if e refers to the name v or the name v=.
 block_scope_test: fail
@@ -117,37 +77,30 @@
 const_escape_frog_test: fail
 compile_time_constant_test/none: fail
 
-# Test issue 11544, using @TypeName as annotation is not valid
-inferrer_constructor2_test: fail
-inferrer_constructor3_test: fail
-multiple_field_assignment_constructor_test: fail
-
 # Test issue 11545, using not existing constructor name in annotation
 metadata_test: fail
 
-# Test issue 11564, named parameter starts with '_'
-named_parameters_with_object_property_names_test: fail
-
 # test issue 11575, classes with abstrac members are not marked as abstract
-abstract_factory_constructor_test/none: fail
-abstract_syntax_test/none: fail
-get_set_syntax_test/none: fail
-implicit_this_test/none: fail
-interface_test/none: fail
-syntax_test/none: fail
+abstract_factory_constructor_test/none: fail # Issue 11575
+get_set_syntax_test/none: fail # Issue 11575
+implicit_this_test/none: fail # Issue 11575
+interface_test/none: fail # Issue 11575
+syntax_test/none: fail # Issue 11575
 
 # test issue 11576
-bad_constructor_test/none: fail
+bad_constructor_test/none: fail # Issue 11576
 
 # test issue 11577, has return type for []=
-cascade_test/none: fail
+cascade_test/none: fail # Issue 11577
 
 # test issue 11578, redirecting factory with not subtype
-factory5_test/none: fail
-factory_redirection_test/none: fail
-type_variable_bounds_test/none: fail
-type_variable_scope_test/none: fail
-factory_implementation_test/none: fail
+factory5_test/none: fail # Issue 11578
+factory_redirection_test/none: fail # Issue 11578
+type_variable_bounds_test/none: fail # Issue 11578
+type_variable_scope_test/none: fail # Issue 11578
+factory_implementation_test/none: fail # Issue 11578
+
+redirecting_factory_malbounded_test/none: Fail # Issue 12827
 
 # test issue 11579, assignment, no setter
 getter_no_setter_test/none: fail
@@ -182,10 +135,9 @@
 # test issue 11595, It is static warning to create instance (new) of the malformed type
 instantiate_type_variable_negative_test: fail
 
-# test issue 11598, Any use of a malbounded type gives rise to a static warning
-mixin_type_parameters_errors_test/01: fail
-mixin_type_parameters_errors_test/02: fail
-mixin_type_parameters_errors_test/05: fail
+mixin_type_parameters_errors_test/01: fail # Issue 11598
+mixin_type_parameters_errors_test/02: fail # Issue 11598
+mixin_type_parameters_errors_test/05: fail # Issue 11598
 
 # test issue 11698, no setter, so warning, not error
 assign_instance_method_negative_test: fail
@@ -216,7 +168,7 @@
 
 # test issue 12157, uninitializer instance variable is warning, so not negative test
 static_final_field_negative_test: fail
-constructor2_negative_test: fail
+constructor9_test/01: fail # Issue 12157
 
 # test issue 12159, print(exception.message_); causes static warning, not an error
 throw7_negative_test: fail
@@ -236,22 +188,34 @@
 
 # test issue 12163, unresolved identifier is static warning in static context
 unresolved_in_factory_negative_test: fail # Issue 12163
-unresolved_top_level_method_negative_test: fail # Issue 12163
 unresolved_top_level_var_negative_test: fail # Issue 12163
 
 # test issue 12181, uses argument definition test
 constructor_initializer_test: fail # Issue 12181
 
-# test issue 12191, ambuguous import is always warning now
+# test issue 12191, ambiguous import is always warning now
 prefix3_negative_test: fail # Issue 12191
 library_ambiguous_test/00: fail # Issue 12191
-library_ambiguous_test/01: fail # Issue 12191
-library_ambiguous_test/02: fail # Issue 12191
-library_ambiguous_test/03: fail # Issue 12191
 
 # test issue 12289, assignment in assert statement
 type_error_test: fail # Issue 12289
 
+# test issue 12381, It is compile-time error to invoke not existing function
+issue11724_test: fail # Issue 12381
+call_nonexistent_static_test/08: fail # Issue 12381
+
+# test issue 12397; it is static warning, not error to use variable before declaration (or hidden)
+scope_negative_test: fail # Issue 12397
+
+# test issue 12539, rules for finals were loosened, contradiction in spec was fixed
+const_syntax_test/09: fail # Issue 12539
+
+# test issue 12541; there shouldn't be a static warning
+static_field_test/01: fail # Issue 12541
+static_field_test/02: fail # Issue 12541
+static_field_test/03: fail # Issue 12541
+static_field_test/04: fail # Issue 12541
+
 [ $compiler == dart2analyzer && $checked ]
 factory1_test/00: fail
 factory1_test/01: fail
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 113b668..7db88ec 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -67,6 +67,11 @@
 compile_time_constant_checked3_test/05: Fail, OK
 compile_time_constant_checked3_test/06: Fail, OK
 generic_test: Fail, OK
+named_parameters_type_test/01: Fail, OK
+named_parameters_type_test/02: Fail, OK
+named_parameters_type_test/03: Fail, OK
+positional_parameters_type_test/01: Fail, OK
+positional_parameters_type_test/02: Fail, OK
 
 [ $compiler == dart2js && $minified ]
 f_bounded_quantification4_test: Fail # Issue 12605.
@@ -111,15 +116,12 @@
 getter_no_setter_test/01: Fail # Issue 5519
 not_enough_positional_arguments_test/01: Fail # Issue 12838
 not_enough_positional_arguments_test/02: Fail # Issue 12838
-not_enough_positional_arguments_test/04: Fail # Issue 12838
 not_enough_positional_arguments_test/05: Fail # Issue 12838
 dynamic_test: Fail # Issue 12398
 dynamic_prefix_core_test: Fail # Issue 12398
 metadata_test: Fail # Issue 5841
 infinity_test: Fail # Issue 4984
 positive_bit_operations_test: Fail # Issue 12795
-named_parameters_type_test: Fail
-positional_parameters_type_test: Fail
 
 # Compilation errors.
 const_var_test: Fail # Issue 12793
@@ -128,11 +130,6 @@
 function_type_alias5_test/01: Fail # Issue 12754
 function_type_alias5_test/02: Fail # Issue 12754
 function_type_alias7_test/00: Fail # Issue 12801
-get_set_syntax_test/00: Fail # Issue 12805
-get_set_syntax_test/01: Fail # Issue 12805
-get_set_syntax_test/02: Fail # Issue 12805
-get_set_syntax_test/03: Fail # Issue 12805
-get_set_syntax_test/04: Fail # Issue 12805
 method_binding_test: Fail # Issue 12807
 method_override_test: Fail # Issue 12808
 method_override5_test: Fail # Issue 12809
@@ -140,45 +137,33 @@
 named_parameters_aggregated_test/01: Fail # Issue 12801
 named_parameters_aggregated_test/03: Fail # Issue 12812
 pseudo_kw_test: Fail # Unexpected token '('
-super_implicit_closure_test: Fail # internal error: super property read not implemented
-
-# Missing compilation error for wrong number of type arguments.
-mixin_type_parameters_errors_test/01: Fail
-mixin_type_parameters_errors_test/02: Fail
-mixin_type_parameters_errors_test/05: Fail
-
-# External tests.
-external_test/01: Fail
-external_test/02: Fail
-external_test/11: Fail
-external_test/12: Fail
-external_test/13: Skip  # Runtime error (missing patch).
-external_test/14: Fail
-external_test/20: Skip  # Runtime error (missing patch).
-external_test/21: Fail
-external_test/22: Fail
-external_test/23: Fail
-external_test/30: Fail
-external_test/31: Fail
-
-
-# Implementation errors (library or generated code).
-instanceof4_test: Fail # Expect.isTrue(false) fails.
-list_literal4_test: Fail # Illegal argument(s): 0 -- checked mode test.
-map_literal4_test: Fail # Attempt to modify an immutable object -- checked mode test.
-
-class_cycle_negative_test: Fail, OK # Bad test: assumes eager loading.
-interface_cycle_negative_test: Fail, OK # Bad test: assumes eager loading.
-
+super_implicit_closure_test: Fail # Issue 12884
+mixin_type_parameters_errors_test/01: Fail # Issue 12885
+mixin_type_parameters_errors_test/02: Fail # Issue 12885
+mixin_type_parameters_errors_test/05: Fail # Issue 12885
+external_test/11: Fail # Issue 12887
+external_test/12: Fail # Issue 12887
+external_test/13: Fail # Issue 12887
+external_test/21: Fail # Issue 12887
+external_test/22: Fail # Issue 12887
+external_test/23: Fail # Issue 12887
+external_test/30: Fail # Issue 12887
+external_test/31: Fail # Issue 12887
+instanceof4_test/01: Fail # Issue 12889
+list_literal4_test: Fail # Issue 12890
+map_literal4_test: Fail # Issue 12891
 
 #
 # The following tests are all negative tests that should be fixed.
 #
-abstract_syntax_test/01: Fail # Negative language test.
-const_constructor_syntax_test/04: Fail # Negative language test.
-const_syntax_test/04: Fail # Negative language test.
-constructor2_negative_test: Fail # Negative language test.
-constructor_return_negative_test: Fail # Negative language test.
+const_constructor_syntax_test/04: Fail # Issue 12900
+const_syntax_test/01: Fail # Issue 12932
+const_syntax_test/02: Fail # Issue 12932
+const_syntax_test/03: Fail # Issue 12932
+const_syntax_test/04: Fail # Issue 12932
+constructor9_test/01: Fail # Issue 12934
+constructor_return_test/01: Fail # Issue 12937
+constructor_return_test/02: Fail # Issue 12937
 constructor_return_with_arrow_negative_test: Fail # Negative language test.
 constructor_return_with_init_and_arrow_negative_test: Fail # Negative language test.
 constructor_return_with_init_negative_test: Fail # Negative language test.
@@ -186,22 +171,12 @@
 duplicate_implements_test/02: Fail # Negative language test.
 duplicate_implements_test/03: Fail # Negative language test.
 duplicate_implements_test/04: Fail # Negative language test.
-field3_negative_test: Fail # Negative language test.
 instantiate_type_variable_negative_test: Pass  # For the wrong reason.
 list_literal1_negative_test: Fail # Negative language test.
 map_literal1_negative_test: Fail # Negative language test.
 number_identifier_negative_test: Fail # Negative language test.
-operator1_negative_test: Fail # Negative language test.
 scope_negative_test: Fail # Negative language test.
 static_final_field_negative_test: Fail # Negative language test.
-static_top_level_test/00: Fail # Negative language test.
-static_top_level_test/01: Fail # Negative language test.
-static_top_level_test/02: Fail # Negative language test.
-static_top_level_test/03: Fail # Negative language test.
-static_top_level_test/04: Fail # Negative language test.
-static_top_level_test/05: Fail # Negative language test.
-static_top_level_test/06: Fail # Negative language test.
-static_top_level_test/07: Fail # Negative language test.
 throw7_negative_test: Fail # Negative language test.
 
 numbers_test: Fail, OK # (unintended?) VM specific test.
@@ -210,9 +185,6 @@
 final_syntax_test/02: Fail # Missing error for uninitialized final field.
 final_syntax_test/03: Fail # Missing error for uninitialized final field.
 final_syntax_test/04: Fail # Missing error for uninitialized final field.
-const_syntax_test/01: Fail # Missing error for uninitialized final field.
-const_syntax_test/02: Fail # Missing error for uninitialized final field.
-const_syntax_test/03: Fail # Missing error for uninitialized final field.
 
 canonical_const2_test: Fail, OK # Dart2js only has doubles.
 
@@ -247,7 +219,6 @@
 expect_test: Fail
 stack_overflow_test: Fail
 stack_overflow_stacktrace_test: Fail
-licm2_test: Pass, Timeout # Issue: 11848
 
 
 [ $runtime == opera ]
@@ -279,8 +250,9 @@
 
 on_catch_malformed_type_test: Fail # Issue 8601
 
-# False positive compile-time error is masking expected compile-time error
-mixin_type_parameters_errors_test/*: Skip
+mixin_type_parameters_errors_test/01: Fail # Issue 12886
+mixin_type_parameters_errors_test/02: Fail # Issue 12886
+mixin_type_parameters_errors_test/05: Fail # Issue 12886
 
 # Mixins fail on the VM.
 mixin_mixin_test: Fail # Issue 9683
@@ -325,16 +297,19 @@
 compile_time_constant_arguments_test/03: Fail # Issue 5519
 compile_time_constant_arguments_test/05: Fail # Issue 5519
 compile_time_constant_arguments_test/06: Fail # Issue 5519
-const_constructor_syntax_test/04: Fail # Issue 5519
-const_syntax_test/01: Fail # Issue 5519
-const_syntax_test/02: Fail # Issue 5519
-const_syntax_test/03: Fail # Issue 5519
-const_syntax_test/04: Fail # Issue 5519
-const_syntax_test/05: Fail # Issue 5519
-const_syntax_test/06: Fail # Issue 5519
-const_syntax_test/07: Fail # Issue 5519
-const_syntax_test/08: Fail # Issue 5519
-const_syntax_test/10: Fail # Issue 5519
+const_constructor_syntax_test/04: Fail # Issue 12901
+const_syntax_test/01: Fail # Issue 12933
+const_syntax_test/02: Fail # Issue 12933
+const_syntax_test/03: Fail # Issue 12933
+const_syntax_test/04: Fail # Issue 12933
+const_syntax_test/05: Fail # Issue 12933
+const_syntax_test/06: Fail # Issue 12933
+const_syntax_test/07: Fail # Issue 12933
+const_syntax_test/08: Fail # Issue 12933
+const_syntax_test/10: Fail # Issue 12933
+constructor9_test/01: Fail # Issue 12935
+constructor_return_test/01: Fail # Issue 12938
+constructor_return_test/02: Fail # Issue 12938
 constructor_named_arguments_test/01: Fail # Issue 5519
 final_syntax_test/01: Fail # Issue 5519
 final_syntax_test/02: Fail # Issue 5519
@@ -345,21 +320,23 @@
 named_parameters_aggregated_test/03: Fail # Issue 12813
 not_enough_positional_arguments_test/01: Fail # Issue 12839
 not_enough_positional_arguments_test/02: Fail # Issue 12839
-not_enough_positional_arguments_test/04: Fail # Issue 12839
 not_enough_positional_arguments_test/05: Fail # Issue 12839
 
 metadata_test: Fail # Issue 12762
 const_var_test: Pass, Fail # Issue 12794
 map_literal3_test: Fail # Issue 12794
-class_cycle_negative_test: Fail, OK # Bad test: assumes eager loading.
-interface_cycle_negative_test: Fail, OK # Bad test: assumes eager loading.
 # Common problems with dart2js.  In illegal family, invalid
 # declarations are simply not parsed.  In pseudo kw dart2js
 # chokes on things like typedef(x) => "typedef $x" and alike.
-abstract_syntax_test/01: Fail
 pseudo_kw_test: Fail
-# external keyword is not yet supported by dart2js/dart2dart.
-external_test/*: Skip
+external_test/11: Fail # Issue 12888
+external_test/12: Fail # Issue 12888
+external_test/13: Fail # Issue 12888
+external_test/21: Fail # Issue 12888
+external_test/22: Fail # Issue 12888
+external_test/23: Fail # Issue 12888
+external_test/30: Fail # Issue 12888
+external_test/31: Fail # Issue 12888
 lazy_static3_test: Fail # Issue 12593
 # dart2js frontend doesn't even analyse problematic classes.
 duplicate_implements_test/01: Fail
@@ -368,16 +345,7 @@
 duplicate_implements_test/04: Fail
 method_override4_test: Fail # Issue 12810
 method_override5_test: Fail # Issue 12810
-operator1_negative_test: Fail
 static_final_field_negative_test: Fail
-static_top_level_test/00: Fail
-static_top_level_test/01: Fail
-static_top_level_test/02: Fail
-static_top_level_test/03: Fail
-static_top_level_test/04: Fail
-static_top_level_test/05: Fail
-static_top_level_test/06: Fail
-static_top_level_test/07: Fail
 # Bug in dart2js parser: it happily parses 1is int; variable declaration.
 number_identifier_negative_test: Fail
 # Common with language_dart2js.
@@ -392,6 +360,7 @@
 function_type_alias5_test/02: Fail # Issue 12755
 function_type_alias7_test/00: Fail # Issue 12802
 parameter_initializer6_negative_test: Fail # Issue 3502
+
 # DartVM problem.
 constructor5_test: Fail
 constructor6_test: Fail
@@ -404,12 +373,6 @@
 new_expression_type_args_test/00: Fail # Wrongly reports compile-time error.
 new_expression_type_args_test/01: Fail # Wrongly reports compile-time error.
 
-get_set_syntax_test/00: Fail # Issue 12806
-get_set_syntax_test/01: Fail # Issue 12806
-get_set_syntax_test/02: Fail # Issue 12806
-get_set_syntax_test/03: Fail # Issue 12806
-get_set_syntax_test/04: Fail # Issue 12806
-
 # Only checked mode reports an error on type assignment
 # problems in compile time constants.
 compile_time_constant_checked_test/02: Fail, OK
@@ -426,7 +389,6 @@
 compile_time_constant_checked3_test/05: Fail, OK
 compile_time_constant_checked3_test/06: Fail, OK
 
-positional_parameters_type_test: Fail # Triage this.
 final_is_not_const_test/01: Fail # Issue 12692
 
 [ $compiler == dart2dart && $minified ]
@@ -441,3 +403,9 @@
 prefix22_test: Pass
 invocation_mirror_test: Fail, OK # Issue 12706 (hardcoded names).
 super_call4_test: Fail, OK # hardcoded names.
+
+[ $minified ]
+stack_trace_test: Fail, OK # Stack trace not preserved in minified code.
+
+[ $runtime == ie9 ]
+stack_trace_test: Fail, OK # Stack traces not available in IE9.
diff --git a/tests/language/mixin_prefix_lib.dart b/tests/language/mixin_prefix_lib.dart
index 9c1295f..8536e28 100644
--- a/tests/language/mixin_prefix_lib.dart
+++ b/tests/language/mixin_prefix_lib.dart
@@ -4,8 +4,8 @@
 
 library mixin_prefix_lib;
 
-import 'dart:json' as json;
+import "dart:convert";
 
 class MixinClass {
-  String bar() => json.stringify({'a':1});
+  String bar() => JSON.encode({'a':1});
 }
diff --git a/tests/language/named_parameters_type_test.dart b/tests/language/named_parameters_type_test.dart
index 1eb7a7f..5f84489 100644
--- a/tests/language/named_parameters_type_test.dart
+++ b/tests/language/named_parameters_type_test.dart
@@ -1,54 +1,23 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--enable_type_checks
+// VMOptions=--checked
 //
 // Dart test program for testing optional named parameters in type tests.
 
-import "package:expect/expect.dart";
-
-class NamedParametersTypeTest {
-  static int testMain() {
-    int result = 0;
-    Function anyFunction;
-    void acceptFunNumOptBool(void funNumOptBool(num n, {bool b})) { };
-    void funNum(num n) { };
-    void funNumBool(num n, bool b) { };
-    void funNumOptBool(num n, {bool b: true}) { };
-    void funNumOptBoolX(num n, {bool x: true}) { };
-    anyFunction = funNum;  // No error.
-    anyFunction = funNumBool;  // No error.
-    anyFunction = funNumOptBool;  // No error.
-    anyFunction = funNumOptBoolX;  // No error.
-    acceptFunNumOptBool(funNumOptBool);  // No error.
-    try {
-      acceptFunNumOptBool(funNum);  // No static type warning.
-    } on TypeError catch (error) {
-      result += 1;
-      var msg = error.toString();
-      Expect.isTrue(msg.contains("(num, {b: bool}) => void"));  // dstType
-      Expect.isTrue(msg.contains("(num) => void"));  // srcType
-    }
-    try {
-      acceptFunNumOptBool(funNumBool);  /// static type warning
-    } on TypeError catch (error) {
-      result += 10;
-      var msg = error.toString();
-      Expect.isTrue(msg.contains("(num, {b: bool}) => void"));  // dstType
-      Expect.isTrue(msg.contains("(num, bool) => void"));  // srcType
-    }
-    try {
-      acceptFunNumOptBool(funNumOptBoolX);  /// static type warning
-    } on TypeError catch (error) {
-      result += 100;
-      var msg = error.toString();
-      Expect.isTrue(msg.contains("(num, {b: bool}) => void"));  // dstType
-      Expect.isTrue(msg.contains("(num, {x: bool}) => void"));  // srcType
-    }
-    return result;
-  }
-}
-
 main() {
-  Expect.equals(111, NamedParametersTypeTest.testMain());
+  Function anyFunction;
+  void acceptFunNumOptBool(void funNumOptBool(num n, {bool b})) { };
+  void funNum(num n) { };
+  void funNumBool(num n, bool b) { };
+  void funNumOptBool(num n, {bool b: true}) { };
+  void funNumOptBoolX(num n, {bool x: true}) { };
+  anyFunction = funNum;
+  anyFunction = funNumBool;
+  anyFunction = funNumOptBool;
+  anyFunction = funNumOptBoolX;
+  acceptFunNumOptBool(funNumOptBool);
+  acceptFunNumOptBool(funNum);  /// 01: runtime error
+  acceptFunNumOptBool(funNumBool);  /// 02: static type warning, runtime error
+  acceptFunNumOptBool(funNumOptBoolX);  /// 03: static type warning, runtime error
 }
diff --git a/tests/language/positional_parameters_type_test.dart b/tests/language/positional_parameters_type_test.dart
index 6c3c77d..7d14403 100644
--- a/tests/language/positional_parameters_type_test.dart
+++ b/tests/language/positional_parameters_type_test.dart
@@ -1,57 +1,23 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--enable_type_checks
+// VMOptions=--checked
 //
 // Dart test program for testing optional positional parameters in type tests.
 
-import "package:expect/expect.dart";
-
-class NamedParametersTypeTest {
-  static int testMain() {
-    int result = 0;
-    Function anyFunction;
-    void acceptFunNumOptBool(void funNumOptBool(num n, [bool b])) { };
-    void funNum(num n) { };
-    void funNumBool(num n, bool b) { };
-    void funNumOptBool(num n, [bool b = true]) { };
-    void funNumOptBoolX(num n, [bool x = true]) { };
-    anyFunction = funNum;  // No error.
-    anyFunction = funNumBool;  // No error.
-    anyFunction = funNumOptBool;  // No error.
-    anyFunction = funNumOptBoolX;  // No error.
-    acceptFunNumOptBool(funNumOptBool);  // No error.
-    try {
-      acceptFunNumOptBool(funNum);  // No static type warning.
-    } on TypeError catch (error) {
-      result += 1;
-      var msg = error.toString();
-      Expect.isTrue(msg.contains("'(num, [bool]) => void'"));  // dstType
-      Expect.isTrue(msg.contains("'(num) => void'"));  // srcType
-      Expect.isTrue(msg.contains("'funNumOptBool'"));  // dstName
-      Expect.isTrue(error.stackTrace.toString().contains(
-          "positional_parameters_type_test.dart:14:35"));
-    }
-    try {
-      acceptFunNumOptBool(funNumBool);  /// static type warning
-    } on TypeError catch (error) {
-      result += 10;
-      var msg = error.toString();
-      Expect.isTrue(msg.contains("'(num, [bool]) => void'"));  // dstType
-      Expect.isTrue(msg.contains("'(num, bool) => void'"));  // srcType
-      Expect.isTrue(msg.contains("'funNumOptBool'"));  // dstName
-      Expect.isTrue(error.stackTrace.toString().contains(
-          "positional_parameters_type_test.dart:14:35"));
-    }
-    try {
-      acceptFunNumOptBool(funNumOptBoolX);  // No static type warning.
-    } on TypeError catch (error) {
-      result += 100;
-    }
-    return result;
-  }
-}
-
 main() {
-  Expect.equals(11, NamedParametersTypeTest.testMain());
+  Function anyFunction;
+  void acceptFunNumOptBool(void funNumOptBool(num n, [bool b])) { };
+  void funNum(num n) { };
+  void funNumBool(num n, bool b) { };
+  void funNumOptBool(num n, [bool b = true]) { };
+  void funNumOptBoolX(num n, [bool x = true]) { };
+  anyFunction = funNum;
+  anyFunction = funNumBool;
+  anyFunction = funNumOptBool;
+  anyFunction = funNumOptBoolX;
+  acceptFunNumOptBool(funNumOptBool);
+  acceptFunNumOptBool(funNumOptBoolX);
+  acceptFunNumOptBool(funNum);  /// 01: runtime error
+  acceptFunNumOptBool(funNumBool);  /// 02: static type warning, runtime error
 }
diff --git a/tests/language/redirecting_factory_malbounded_test.dart b/tests/language/redirecting_factory_malbounded_test.dart
index 4c2ad37..6b754d8 100644
--- a/tests/language/redirecting_factory_malbounded_test.dart
+++ b/tests/language/redirecting_factory_malbounded_test.dart
@@ -6,7 +6,7 @@
 
   factory Foo() = Bar;
 
-  Foo.create() : super.create() { }  // Super call required due to issue 5838.
+  Foo.create() : super.create() { }
 }
 
 class Bar<T
diff --git a/tests/language/stack_trace_test.dart b/tests/language/stack_trace_test.dart
index e2fd827..5b728a9 100644
--- a/tests/language/stack_trace_test.dart
+++ b/tests/language/stack_trace_test.dart
@@ -83,6 +83,57 @@
   }
 }
 
+
+// Test that the full stack trace is generated for rethrow.
+class RethrowStacktraceTest {
+  var config = 0;
+
+  issue12940() {
+    throw "Progy";
+  }
+
+  b() {
+    issue12940();
+  }
+
+  c() {
+    if (config == 0) {
+      try {
+        b();
+      } catch (e) {
+        rethrow;
+      }
+    } else {
+      try {
+        b();
+      } catch (e, s) {
+        rethrow;
+      }
+    }
+  }
+
+  d() {
+    c();
+  }
+
+  testBoth() {
+    for (config = 0; config < 2; config++) {
+      try {
+        d();
+      } catch (e, s) {
+        Expect.isTrue(s.toString().contains("issue12940"));
+      }
+    }
+  }
+
+  static testMain() {
+    var test = new RethrowStacktraceTest();
+    test.testBoth();
+  }
+}
+
+
 main() {
   StackTraceTest.testMain();
+  RethrowStacktraceTest.testMain();
 }
diff --git a/tests/language/vm/reflect_core_vm_test.dart b/tests/language/vm/reflect_core_vm_test.dart
index d6e52f1..2474b21 100644
--- a/tests/language/vm/reflect_core_vm_test.dart
+++ b/tests/language/vm/reflect_core_vm_test.dart
@@ -10,11 +10,6 @@
 main() {
   var s = "string";
   var im = reflect(s);
-  try {
-    im.invoke(const Symbol("_setAt"), [0, 65]);
-    Expect.isTrue(false);  // Unreachable.
-  } catch (e) {
-    Expect.equals(true, e is NoSuchMethodError);
-  }
+  Expect.throws(() => im.invoke(const Symbol("_setAt"), [0, 65]), (e) => e is NoSuchMethodError);
 }
 
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index 20a7804..227e5c6 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -3,6 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2analyzer ]
+lib/async/async: fail
 lib/core/core: fail
 lib/typed_data/typed_data: fail
 lib/io/io: fail
diff --git a/tests/lib/analyzer/analyze_tests.status b/tests/lib/analyzer/analyze_tests.status
index a398c55..58217a9 100644
--- a/tests/lib/analyzer/analyze_tests.status
+++ b/tests/lib/analyzer/analyze_tests.status
@@ -9,7 +9,7 @@
 standalone/io/status_file_parser_test: Skip # http/dartbug.com/12449
 
 [ $compiler == dartanalyzer ]
-javascript_int_overflow_literal_test/01: fail, ok
+standalone/javascript_int_overflow_literal_test/01: fail, ok
 
 # https://code.google.com/p/dart/issues/detail?id=11665
 standalone/io/directory_invalid_arguments_test: fail
@@ -36,12 +36,11 @@
 
 
 [ $compiler == dart2analyzer ]
-javascript_int_overflow_literal_test/01: fail, ok
+standalone/javascript_int_overflow_literal_test/01: fail, ok
 
 # https://code.google.com/p/dart/issues/detail?id=11665
 standalone/io/directory_invalid_arguments_test: fail
 standalone/io/file_constructor_test: fail
-standalone/io/file_fuzz_test: fail
 standalone/io/http_cookie_date_test: fail
 standalone/io/http_headers_test: fail
 standalone/io/http_parser_test: fail
@@ -60,4 +59,4 @@
 standalone/typed_data_test: fail
 
 # https://code.google.com/p/dart/issues/detail?id=11647
-standalone/package/package_isolate_test: fail
+standalone/package/package_isolate_test: fail
\ No newline at end of file
diff --git a/tests/lib/async/catch_errors10_test.dart b/tests/lib/async/catch_errors10_test.dart
index b554dbd..f2cfdee 100644
--- a/tests/lib/async/catch_errors10_test.dart
+++ b/tests/lib/async/catch_errors10_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   bool futureWasExecuted = false;
   // Test that `catchErrors` waits for a future that has been delayed by
   // `Timer.run`.
@@ -26,6 +24,6 @@
     },
     onDone: () {
       Expect.isTrue(futureWasExecuted);
-      port.close();
+      asyncEnd();
     });
 }
diff --git a/tests/lib/async/catch_errors11_test.dart b/tests/lib/async/catch_errors11_test.dart
index 53755261..dff9b83 100644
--- a/tests/lib/async/catch_errors11_test.dart
+++ b/tests/lib/async/catch_errors11_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   // Test that `catchErrors` catches errors that are delayed by `Timer.run`.
   catchErrors(() {
@@ -28,7 +26,7 @@
                          "timer error",
                          ],
                          events);
-      port.close();
+      asyncEnd();
     });
   events.add("main exit");
 }
diff --git a/tests/lib/async/catch_errors12_test.dart b/tests/lib/async/catch_errors12_test.dart
index deb7cb4..af4acbc 100644
--- a/tests/lib/async/catch_errors12_test.dart
+++ b/tests/lib/async/catch_errors12_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   // Tests that errors that have been delayed by several milliseconds with
   // Timers are still caught by `catchErrors`.
@@ -35,7 +33,7 @@
             499,
           ],
           events);
-      port.close();
+      asyncEnd();
     });
   events.add("main exit");
 }
diff --git a/tests/lib/async/catch_errors13_test.dart b/tests/lib/async/catch_errors13_test.dart
index 7c6752a..1e3a8db 100644
--- a/tests/lib/async/catch_errors13_test.dart
+++ b/tests/lib/async/catch_errors13_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   // Work around bug that makes runAsync use Timers. By invoking `runAsync` here
   // we make sure that asynchronous non-timer events are executed before any
@@ -54,7 +52,7 @@
                          "inner done throw"
                          ],
                          events);
-      port.close();
+      asyncEnd();
     });
   events.add("main exit");
 }
diff --git a/tests/lib/async/catch_errors14_test.dart b/tests/lib/async/catch_errors14_test.dart
index ebf34a1..bccc464 100644
--- a/tests/lib/async/catch_errors14_test.dart
+++ b/tests/lib/async/catch_errors14_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   // Test that periodic Timers are handled correctly by `catchErrors`.
   catchErrors(() {
@@ -33,7 +31,7 @@
                          "error 6",
                          ],
                          events);
-      port.close();
+      asyncEnd();
     });
   events.add("main exit");
 }
diff --git a/tests/lib/async/catch_errors15_test.dart b/tests/lib/async/catch_errors15_test.dart
index 2cea6fe..e76a070 100644
--- a/tests/lib/async/catch_errors15_test.dart
+++ b/tests/lib/async/catch_errors15_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   // Test that the outer `catchErrors` waits for the nested `catchErrors` stream
   // to be done.
@@ -46,7 +44,7 @@
                          "inner done",
                          ],
                          events);
-      port.close();
+      asyncEnd();
     });
   events.add("main exit");
 }
diff --git a/tests/lib/async/catch_errors16_test.dart b/tests/lib/async/catch_errors16_test.dart
index cb3621d..e2af768 100644
--- a/tests/lib/async/catch_errors16_test.dart
+++ b/tests/lib/async/catch_errors16_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   StreamController controller = new StreamController();
   Stream stream = controller.stream;
@@ -29,7 +27,7 @@
                                 "stream error 2",
                                 ],
                                 events);
-              port.close();
+              asyncEnd();
             });
   controller.add(1);
   controller.addError(2);
diff --git a/tests/lib/async/catch_errors17_test.dart b/tests/lib/async/catch_errors17_test.dart
index bf19b09..8cb45c3 100644
--- a/tests/lib/async/catch_errors17_test.dart
+++ b/tests/lib/async/catch_errors17_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   StreamController controller;
   // Test that errors do not cross zone boundaries.
@@ -40,6 +38,6 @@
                                  "inner done",
                                 ],
                                 events);
-              port.close();
+              asyncEnd();
             });
 }
diff --git a/tests/lib/async/catch_errors18_test.dart b/tests/lib/async/catch_errors18_test.dart
index 33e60ab..5d04a57 100644
--- a/tests/lib/async/catch_errors18_test.dart
+++ b/tests/lib/async/catch_errors18_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   Stream stream = new Stream.periodic(const Duration(milliseconds: 20),
                                       (x) => x);
@@ -28,6 +26,6 @@
   }).listen((x) { events.add("outer: $x"); },
             onDone: () {
               Expect.listEquals([0, 1, 2, 3, 4, "cancel"], events);
-              port.close();
+              asyncEnd();
             });
 }
diff --git a/tests/lib/async/catch_errors19_test.dart b/tests/lib/async/catch_errors19_test.dart
index dec100a..1bf5581 100644
--- a/tests/lib/async/catch_errors19_test.dart
+++ b/tests/lib/async/catch_errors19_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   Stream stream = new Stream.periodic(const Duration(milliseconds: 20),
                                       (x) => x);
@@ -28,6 +26,6 @@
   }).listen((x) { events.add("outer: $x"); },
             onDone: () {
               Expect.listEquals([0, 1, 2, 3, 4, 499], events);
-              port.close();
+              asyncEnd();
             });
 }
diff --git a/tests/lib/async/catch_errors20_test.dart b/tests/lib/async/catch_errors20_test.dart
index b0f0673..ffcf7c8 100644
--- a/tests/lib/async/catch_errors20_test.dart
+++ b/tests/lib/async/catch_errors20_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   // Test that nested stream (from `catchErrors`) that is delayed by a future
   // is waited for.
@@ -31,6 +29,6 @@
                                  "done",
                                 ],
                                 events);
-              port.close();
+              asyncEnd();
             });
 }
diff --git a/tests/lib/async/catch_errors21_test.dart b/tests/lib/async/catch_errors21_test.dart
index 28dec7f..932a80b 100644
--- a/tests/lib/async/catch_errors21_test.dart
+++ b/tests/lib/async/catch_errors21_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   var controller = new StreamController();
   // Test that stream errors, as a result of bad user-code (`map`) are correctly
@@ -34,7 +32,7 @@
                                  "done",
                                 ],
                                 events);
-              port.close();
+              asyncEnd();
             });
   [1, 2, 3, 4].forEach(controller.add);
   controller.close();
diff --git a/tests/lib/async/catch_errors22_test.dart b/tests/lib/async/catch_errors22_test.dart
index c47b3a3..2d92e8c 100644
--- a/tests/lib/async/catch_errors22_test.dart
+++ b/tests/lib/async/catch_errors22_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   bool onDoneWasCalled = false;
   var controller = new StreamController();
@@ -36,6 +34,6 @@
                        "caught: 4",
                       ],
                       events);
-    port.close();
+    asyncEnd();
   });
 }
diff --git a/tests/lib/async/catch_errors23_test.dart b/tests/lib/async/catch_errors23_test.dart
index 2d2ff72..d2dddab3 100644
--- a/tests/lib/async/catch_errors23_test.dart
+++ b/tests/lib/async/catch_errors23_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   StreamController controller;
   Stream stream;
@@ -46,6 +44,6 @@
                                 "inner done",
                                 ],
                                 events);
-              port.close();
+              asyncEnd();
             });
 }
diff --git a/tests/lib/async/catch_errors24_test.dart b/tests/lib/async/catch_errors24_test.dart
index 4a5508f..c9d6e4b 100644
--- a/tests/lib/async/catch_errors24_test.dart
+++ b/tests/lib/async/catch_errors24_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   StreamController controller;
   Stream stream;
@@ -50,6 +48,6 @@
                                  "inner done",
                                 ],
                                 events);
-              port.close();
+              asyncEnd();
             });
 }
diff --git a/tests/lib/async/catch_errors25_test.dart b/tests/lib/async/catch_errors25_test.dart
index 162a4a3..2360e9a 100644
--- a/tests/lib/async/catch_errors25_test.dart
+++ b/tests/lib/async/catch_errors25_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   StreamController controller;
   // Test multiple subscribers of an asBroadcastStream inside the same
@@ -22,6 +20,6 @@
   }).listen((x) { events.add("outer: $x"); },
             onDone: () {
               Expect.listEquals([1, 1, 2, 2], events);
-              port.close();
+              asyncEnd();
             });
 }
diff --git a/tests/lib/async/catch_errors26_test.dart b/tests/lib/async/catch_errors26_test.dart
index d14e1dd..8ac5431 100644
--- a/tests/lib/async/catch_errors26_test.dart
+++ b/tests/lib/async/catch_errors26_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   StreamController controller;
   Stream stream;
@@ -47,6 +45,6 @@
                                  "inner done",
                                 ],
                                 events);
-              port.close();
+              asyncEnd();
             });
 }
diff --git a/tests/lib/async/catch_errors27_test.dart b/tests/lib/async/catch_errors27_test.dart
index a73c51d..23f8b99 100644
--- a/tests/lib/async/catch_errors27_test.dart
+++ b/tests/lib/async/catch_errors27_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   StreamController controller;
   Stream stream;
@@ -52,6 +50,6 @@
                                  "inner done",
                                 ],
                                 events);
-              port.close();
+              asyncEnd();
             });
 }
diff --git a/tests/lib/async/catch_errors28_test.dart b/tests/lib/async/catch_errors28_test.dart
index 09a208f..1f13df4 100644
--- a/tests/lib/async/catch_errors28_test.dart
+++ b/tests/lib/async/catch_errors28_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   // Test that periodic Timers are handled correctly by `catchErrors`.
   catchErrors(() {
@@ -29,7 +27,7 @@
                          1, 2, 3, 4, 5, 6,
                          ],
                          events);
-      port.close();
+      asyncEnd();
     });
   events.add("main exit");
 }
diff --git a/tests/lib/async/catch_errors2_test.dart b/tests/lib/async/catch_errors2_test.dart
index 18fefaf..4c0d77c 100644
--- a/tests/lib/async/catch_errors2_test.dart
+++ b/tests/lib/async/catch_errors2_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   bool futureWasExecuted = false;
   // Make sure that `catchErrors` only closes the error stream when the inner
   // futures are done.
@@ -24,6 +22,6 @@
     },
     onDone: () {
       Expect.isTrue(futureWasExecuted);
-      port.close();
+      asyncEnd();
     });
 }
diff --git a/tests/lib/async/catch_errors3_test.dart b/tests/lib/async/catch_errors3_test.dart
index 2edcfb2..ee55620 100644
--- a/tests/lib/async/catch_errors3_test.dart
+++ b/tests/lib/async/catch_errors3_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   bool futureWasExecuted = false;
   bool future2WasExecuted = false;
 
@@ -32,6 +30,6 @@
     onDone: () {
       Expect.isTrue(futureWasExecuted);
       Expect.isTrue(future2WasExecuted);
-      port.close();
+      asyncEnd();
     });
 }
diff --git a/tests/lib/async/catch_errors4_test.dart b/tests/lib/async/catch_errors4_test.dart
index 5c1900b..3814ddf 100644
--- a/tests/lib/async/catch_errors4_test.dart
+++ b/tests/lib/async/catch_errors4_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   // Test that synchronous errors inside a `catchErrors` are caught.
   catchErrors(() {
@@ -25,7 +23,7 @@
                          "catch error",
                          ],
                          events);
-      port.close();
+      asyncEnd();
     });
   events.add("main exit");
 }
diff --git a/tests/lib/async/catch_errors5_test.dart b/tests/lib/async/catch_errors5_test.dart
index 1d98f11..1bb8bba 100644
--- a/tests/lib/async/catch_errors5_test.dart
+++ b/tests/lib/async/catch_errors5_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   // Test that synchronous *and* asynchronous errors are caught by
   // `catchErrors`.
@@ -28,7 +26,7 @@
                          "future error",
                          ],
                          events);
-      port.close();
+      asyncEnd();
     });
   events.add("main exit");
 }
diff --git a/tests/lib/async/catch_errors6_test.dart b/tests/lib/async/catch_errors6_test.dart
index f9b5261..58c4f74 100644
--- a/tests/lib/async/catch_errors6_test.dart
+++ b/tests/lib/async/catch_errors6_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var completer = new Completer();
   var errorHandlerOrDoneHasBeenExecuted = false;
   // Test that `catchErrors` doesn't shut down if a future is never completed.
@@ -26,6 +24,6 @@
     });
   Timer.run(() {
     Expect.isFalse(errorHandlerOrDoneHasBeenExecuted);
-    port.close();
+    asyncEnd();
   });
 }
diff --git a/tests/lib/async/catch_errors7_test.dart b/tests/lib/async/catch_errors7_test.dart
index 1d6310d..b241a2c 100644
--- a/tests/lib/async/catch_errors7_test.dart
+++ b/tests/lib/async/catch_errors7_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   // Test that asynchronous errors are caught.
   catchErrors(() {
@@ -32,7 +30,7 @@
            499,
           ],
           events);
-      port.close();
+      asyncEnd();
     });
   events.add("main exit");
 }
diff --git a/tests/lib/async/catch_errors8_test.dart b/tests/lib/async/catch_errors8_test.dart
index f4ce992..7519fc6 100644
--- a/tests/lib/async/catch_errors8_test.dart
+++ b/tests/lib/async/catch_errors8_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   // Test nested `catchErrors`.
   // The nested `catchErrors` throws all kinds of different errors (synchronous
@@ -51,7 +49,7 @@
                          "inner done throw"
                          ],
                          events);
-      port.close();
+      asyncEnd();
     });
   events.add("main exit");
 }
diff --git a/tests/lib/async/catch_errors9_test.dart b/tests/lib/async/catch_errors9_test.dart
index 5912bf1..f16bcfb 100644
--- a/tests/lib/async/catch_errors9_test.dart
+++ b/tests/lib/async/catch_errors9_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   bool futureWasExecuted = false;
   // Test that `catchErrors` waits for `Timer.run` before closing its error
   // stream.
@@ -24,6 +22,6 @@
     },
     onDone: () {
       Expect.isTrue(futureWasExecuted);
-      port.close();
+      asyncEnd();
     });
 }
diff --git a/tests/lib/async/catch_errors_test.dart b/tests/lib/async/catch_errors_test.dart
index c981966..f4e0eef 100644
--- a/tests/lib/async/catch_errors_test.dart
+++ b/tests/lib/async/catch_errors_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   // Make sure `catchErrors` shuts down the error stream when the synchronous
   // operation is done and there isn't any asynchronous pending callback.
   catchErrors(() {
@@ -19,6 +17,6 @@
       Expect.fail("Unexpected callback");
     },
     onDone: () {
-      port.close();
+      asyncEnd();
     });
 }
diff --git a/tests/lib/async/future_delayed_error_test.dart b/tests/lib/async/future_delayed_error_test.dart
index be16cf0..b22da98 100644
--- a/tests/lib/async/future_delayed_error_test.dart
+++ b/tests/lib/async/future_delayed_error_test.dart
@@ -4,18 +4,16 @@
 
 library future_delayed_error_test;
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 
 testImmediateError() {
-  // An open ReceivePort keeps the VM running. If the error-handler below is not
-  // executed then the test will fail with a timeout.
-  var port = new ReceivePort();
+  asyncStart();
   var future = new Future.error("error");
   future.catchError((error) {
-    port.close();
     Expect.equals(error, "error");
+    asyncEnd();
   });
 }
 
@@ -26,10 +24,10 @@
 }
 
 testDelayedError() {
-  var port = new ReceivePort();
+  asyncStart();
   completedFuture.catchError((error) {
-    port.close();
     Expect.equals(error, "foobar");
+    asyncEnd();
   });
 }
 
diff --git a/tests/lib/async/future_test.dart b/tests/lib/async/future_test.dart
index 0074d81..2c81f05 100644
--- a/tests/lib/async/future_test.dart
+++ b/tests/lib/async/future_test.dart
@@ -4,18 +4,18 @@
 
 library future_test;
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 
 const Duration MS = const Duration(milliseconds: 1);
 
 void testValue() {
   final future = new Future<String>.value("42");
-  var port = new ReceivePort();
+  asyncStart();
   future.then((x) {
     Expect.equals("42", x);
-    port.close();
+    asyncEnd();
   });
 }
 
@@ -78,11 +78,11 @@
 
   int after;
 
-  var port = new ReceivePort();
+  asyncStart();
   future.then((int v) { after = v; })
     .then((_) {
       Expect.equals(3, after);
-      port.close();
+      asyncEnd();
     });
 
   completer.complete(3);
@@ -97,11 +97,11 @@
   completer.complete(3);
   Expect.isNull(after);
 
-  var port = new ReceivePort();
+  asyncStart();
   future.then((int v) { after = v; })
     .then((_) {
       Expect.equals(3, after);
-      port.close();
+      asyncEnd();
     });
 }
 
@@ -118,12 +118,12 @@
   futures.add(future.then((int v) { after1 = v; }));
   futures.add(future.then((int v) { after2 = v; }));
 
-  var port = new ReceivePort();
+  asyncStart();
   Future.wait(futures).then((_) {
     Expect.equals(3, before);
     Expect.equals(3, after1);
     Expect.equals(3, after2);
-    port.close();
+    asyncEnd();
   });
 }
 
@@ -134,12 +134,12 @@
   final future = completer.future;
   final ex = new Exception();
 
-  var port = new ReceivePort();
+  asyncStart();
   future
       .then((v) { throw "Value not expected"; })
       .catchError((error) {
         Expect.equals(error, ex);
-        port.close();
+        asyncEnd();
       }, test: (e) => e == ex);
   completer.completeError(ex);
 }
@@ -156,10 +156,10 @@
   completer.completeError(ex);
   Expect.isTrue(completer.isCompleted);
 
-  var port = new ReceivePort();
+  asyncStart();
   done.then((_) {
     Expect.equals(ex, ex2);
-    port.close();
+    asyncEnd();
   });
 }
 
@@ -189,10 +189,10 @@
       .catchError((e) { reached = true; });
   completer.completeError(ex);
 
-  var port = new ReceivePort();
+  asyncStart();
   done.then((_) {
     Expect.isTrue(reached);
-    port.close();
+    asyncEnd();
   });
 }
 
@@ -216,7 +216,7 @@
 void testFutureAsStreamCompleteAfter() {
   var completer = new Completer();
   bool gotValue = false;
-  var port = new ReceivePort();
+  asyncStart();
   completer.future.asStream().listen(
       (data) {
         Expect.isFalse(gotValue);
@@ -225,7 +225,7 @@
       },
       onDone: () {
         Expect.isTrue(gotValue);
-        port.close();
+        asyncEnd();
       });
   completer.complete("value");
 }
@@ -233,7 +233,7 @@
 void testFutureAsStreamCompleteBefore() {
   var completer = new Completer();
   bool gotValue = false;
-  var port = new ReceivePort();
+  asyncStart();
   completer.complete("value");
   completer.future.asStream().listen(
       (data) {
@@ -243,13 +243,13 @@
       },
       onDone: () {
         Expect.isTrue(gotValue);
-        port.close();
+        asyncEnd();
       });
 }
 
 void testFutureAsStreamCompleteImmediate() {
   bool gotValue = false;
-  var port = new ReceivePort();
+  asyncStart();
   new Future.value("value").asStream().listen(
       (data) {
         Expect.isFalse(gotValue);
@@ -258,14 +258,14 @@
       },
       onDone: () {
         Expect.isTrue(gotValue);
-        port.close();
+        asyncEnd();
       });
 }
 
 void testFutureAsStreamCompleteErrorAfter() {
   var completer = new Completer();
   bool gotError = false;
-  var port = new ReceivePort();
+  asyncStart();
   completer.future.asStream().listen(
       (data) {
         Expect.fail("Unexpected data");
@@ -277,7 +277,7 @@
       },
       onDone: () {
         Expect.isTrue(gotError);
-        port.close();
+        asyncEnd();
       });
   completer.completeError("error");
 }
@@ -285,7 +285,7 @@
 void testFutureAsStreamWrapper() {
   var completer = new Completer();
   bool gotValue = false;
-  var port = new ReceivePort();
+  asyncStart();
   completer.complete("value");
   completer.future
       .catchError((_) { throw "not possible"; })  // Returns a future wrapper.
@@ -297,15 +297,15 @@
         },
         onDone: () {
           Expect.isTrue(gotValue);
-          port.close();
+          asyncEnd();
         });
 }
 
 void testFutureWhenCompleteValue() {
-  var port = new ReceivePort();
+  asyncStart();
   int counter = 2;
   countDown() {
-    if (--counter == 0) port.close();
+    if (--counter == 0) asyncEnd();
   }
   var completer = new Completer();
   Future future = completer.future;
@@ -318,10 +318,10 @@
 }
 
 void testFutureWhenCompleteError() {
-  var port = new ReceivePort();
+  asyncStart();
   int counter = 2;
   countDown() {
-    if (--counter == 0) port.close();
+    if (--counter == 0) asyncEnd();
   }
   var completer = new Completer();
   Future future = completer.future;
@@ -334,10 +334,10 @@
 }
 
 void testFutureWhenCompleteValueNewError() {
-  var port = new ReceivePort();
+  asyncStart();
   int counter = 2;
   countDown() {
-    if (--counter == 0) port.close();
+    if (--counter == 0) asyncEnd();
   }
   var completer = new Completer();
   Future future = completer.future;
@@ -353,10 +353,10 @@
 }
 
 void testFutureWhenCompleteErrorNewError() {
-  var port = new ReceivePort();
+  asyncStart();
   int counter = 2;
   countDown() {
-    if (--counter == 0) port.close();
+    if (--counter == 0) asyncEnd();
   }
   var completer = new Completer();
   Future future = completer.future;
@@ -372,10 +372,10 @@
 }
 
 void testFutureWhenCompletePreValue() {
-  var port = new ReceivePort();
+  asyncStart();
   int counter = 2;
   countDown() {
-    if (--counter == 0) port.close();
+    if (--counter == 0) asyncEnd();
   }
   var completer = new Completer();
   Future future = completer.future;
@@ -391,11 +391,11 @@
 
 void testFutureWhenValueFutureValue() {
 
-  var port = new ReceivePort();
+  asyncStart();
   int counter = 3;
   countDown(int expect) {
     Expect.equals(expect, counter);
-    if (--counter == 0) port.close();
+    if (--counter == 0) asyncEnd();
   }
   var completer = new Completer();
   completer.future.whenComplete(() {
@@ -415,11 +415,11 @@
 }
 
 void testFutureWhenValueFutureError() {
-  var port = new ReceivePort();
+  asyncStart();
   int counter = 3;
   countDown(int expect) {
     Expect.equals(expect, counter);
-    if (--counter == 0) port.close();
+    if (--counter == 0) asyncEnd();
   }
   var completer = new Completer();
   completer.future.whenComplete(() {
@@ -441,11 +441,11 @@
 }
 
 void testFutureWhenErrorFutureValue() {
-  var port = new ReceivePort();
+  asyncStart();
   int counter = 3;
   countDown(int expect) {
     Expect.equals(expect, counter);
-    if (--counter == 0) port.close();
+    if (--counter == 0) asyncEnd();
   }
   var completer = new Completer();
   completer.future.whenComplete(() {
@@ -467,11 +467,11 @@
 }
 
 void testFutureWhenErrorFutureError() {
-  var port = new ReceivePort();
+  asyncStart();
   int counter = 3;
   countDown(int expect) {
     Expect.equals(expect, counter);
-    if (--counter == 0) port.close();
+    if (--counter == 0) asyncEnd();
   }
   var completer = new Completer();
   completer.future.whenComplete(() {
@@ -497,12 +497,12 @@
   final future = completer.future;
   int error = 42;
 
-  var port = new ReceivePort();
+  asyncStart();
   future.then((v) {
     throw error;
   }).catchError((e) {
     Expect.identical(error, e);
-    port.close();
+    asyncEnd();
   });
   completer.complete(0);
 }
@@ -512,12 +512,12 @@
   final future = completer.future;
   int error = 42;
 
-  var port = new ReceivePort();
+  asyncStart();
   future.catchError((e) {
     throw error;
   }).catchError((e) {
     Expect.identical(error, e);
-    port.close();
+    asyncEnd();
   });
   completer.completeError(0);
 }
@@ -527,13 +527,13 @@
   final future = completer.future;
   var error;
 
-  var port = new ReceivePort();
+  asyncStart();
   future.catchError((e) {
     error = e;
     throw e;
   }).catchError((e) {
     Expect.identical(error, e);
-    port.close();
+    asyncEnd();
   });
   completer.completeError(0);
 }
@@ -543,12 +543,12 @@
   final future = completer.future;
   var error = 42;
 
-  var port = new ReceivePort();
+  asyncStart();
   future.whenComplete(() {
     throw error;
   }).catchError((e) {
     Expect.identical(error, e);
-    port.close();
+    asyncEnd();
   });
   completer.complete(0);
 }
@@ -558,10 +558,10 @@
   final future = completer.future;
   var error = 42;
 
-  var port = new ReceivePort();
+  asyncStart();
   future.catchError((e) {
     Expect.identical(error, e);
-    port.close();
+    asyncEnd();
   });
 
   completer.completeError(error);
@@ -570,12 +570,12 @@
 void testChainedFutureValue() {
   final completer = new Completer();
   final future = completer.future;
-  var port = new ReceivePort();
+  asyncStart();
 
   future.then((v) => new Future.value(v * 2))
         .then((v) {
           Expect.equals(42, v);
-          port.close();
+          asyncEnd();
         });
   completer.complete(21);
 }
@@ -583,42 +583,42 @@
 void testChainedFutureValueDelay() {
   final completer = new Completer();
   final future = completer.future;
-  var port = new ReceivePort();
+  asyncStart();
 
   future.then((v) => new Future.delayed(const Duration(milliseconds: 10),
                                         () => v * 2))
         .then((v) {
           Expect.equals(42, v);
-          port.close();
+          asyncEnd();
         });
   completer.complete(21);
 }
 
 void testChainedFutureValue2Delay() {
-  var port = new ReceivePort();
+  asyncStart();
 
   new Future.delayed(const Duration(milliseconds: 10))
     .then((v) {
       Expect.isNull(v);
-      port.close();
+      asyncEnd();
     });
 }
 
 void testChainedFutureError() {
   final completer = new Completer();
   final future = completer.future;
-  var port = new ReceivePort();
+  asyncStart();
 
   future.then((v) => new Future.error("Fehler"))
         .then((v) { Expect.fail("unreachable!"); }, onError: (error) {
           Expect.equals("Fehler", error);
-          port.close();
+          asyncEnd();
         });
   completer.complete(21);
 }
 
 void testChainedFutureCycle() {
-  var port = new ReceivePort();  // Keep alive until port is closed.
+  asyncStart();
   var completer = new Completer();
   var future, future2;
   future  = completer.future.then((_) => future2);
@@ -627,7 +627,7 @@
   int ctr = 2;
   void receiveError(e) {
     Expect.isTrue(e is StateError);
-    if (--ctr == 0) port.close();
+    if (--ctr == 0) asyncEnd();
   }
   future.catchError(receiveError);
   future.catchError(receiveError);
diff --git a/tests/lib/async/futures_test.dart b/tests/lib/async/futures_test.dart
index 446d93b..936c5187 100644
--- a/tests/lib/async/futures_test.dart
+++ b/tests/lib/async/futures_test.dart
@@ -3,9 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library futures_test;
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 
 Future testWaitEmpty() {
   List<Future> futures = new List<Future>();
@@ -114,11 +114,9 @@
   futures.add(testForEach());
   futures.add(testForEachWithException());
 
-  // Use a receive port for blocking the test.
-  // Note that if the test fails, the program will not end.
-  ReceivePort port = new ReceivePort();
+  asyncStart();
   Future.wait(futures).then((List list) {
     Expect.equals(9, list.length);
-    port.close();
+    asyncEnd();
   });
 }
diff --git a/tests/lib/async/intercept_run_async3_test.dart b/tests/lib/async/intercept_run_async3_test.dart
index 0dea800..bee8d8e 100644
--- a/tests/lib/async/intercept_run_async3_test.dart
+++ b/tests/lib/async/intercept_run_async3_test.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 
 var events = [];
 
@@ -23,9 +23,7 @@
 }
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
 
   // Test that runAsync inside the runAsync-handler goes to the parent zone.
   var result = runZonedExperimental(body, onRunAsync: handler);
@@ -34,6 +32,6 @@
     Expect.listEquals(
         ["body entry", "handler", "handler done", "after", "run async body"],
         events);
-    port.close();
+    asyncEnd();
   });
 }
diff --git a/tests/lib/async/intercept_run_async4_test.dart b/tests/lib/async/intercept_run_async4_test.dart
index c935bdb..30c4a27 100644
--- a/tests/lib/async/intercept_run_async4_test.dart
+++ b/tests/lib/async/intercept_run_async4_test.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 
 var events = [];
 
@@ -26,9 +26,7 @@
 }
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
 
   // Test that body of a runAsync goes to the zone it came from.
   var result = runZonedExperimental(body, onRunAsync: handler);
@@ -43,7 +41,7 @@
            "handler", "handler done",
            "run nested body"],
           events);
-      port.close();
+      asyncEnd();
     });
   });
 }
diff --git a/tests/lib/async/intercept_run_async5_test.dart b/tests/lib/async/intercept_run_async5_test.dart
index acf17d0..8c1882f 100644
--- a/tests/lib/async/intercept_run_async5_test.dart
+++ b/tests/lib/async/intercept_run_async5_test.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 
 var events = [];
 
@@ -32,9 +32,7 @@
 }
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
 
   // Test that nested runZonedExperimental go to the next outer zone.
   var result = runZonedExperimental(
@@ -50,6 +48,6 @@
          "handler2", "handler", "handler done", "handler2 done",
          "run nested body"],
         events);
-    port.close();
+    asyncEnd();
  });
 }
diff --git a/tests/lib/async/intercept_run_async6_test.dart b/tests/lib/async/intercept_run_async6_test.dart
index 8b49edf..82cfcd0 100644
--- a/tests/lib/async/intercept_run_async6_test.dart
+++ b/tests/lib/async/intercept_run_async6_test.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 
 class A {
   add(x) => print(x);
@@ -35,9 +35,7 @@
 }
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
 
   // Test that runZonedExperimental works when async, error and done are used.
   var result = runZonedExperimental(
@@ -55,6 +53,6 @@
          "error: foo",
          "done"],
         events);
-    port.close();
+    asyncEnd();
  });
 }
diff --git a/tests/lib/async/run_async4_test.dart b/tests/lib/async/run_async4_test.dart
index c4a1fc1..26db390 100644
--- a/tests/lib/async/run_async4_test.dart
+++ b/tests/lib/async/run_async4_test.dart
@@ -4,6 +4,7 @@
 
 library run_async_test;
 
+import 'package:async_helper/async_helper.dart';
 import 'dart:async';
 import 'dart:isolate';
 
@@ -28,10 +29,15 @@
 }
 
 main() {
+  asyncStart();
   var port = new ReceivePort();
   var timer;
   SendPort otherIsolate = spawnFunction(runTest, globalErrorHandler);
   otherIsolate.send(port.toSendPort());
-  port.receive((msg, replyPort) { port.close(); timer.cancel(); });
+  port.receive((msg, replyPort) {
+    port.close();
+    timer.cancel();
+    asyncEnd();
+  });
   timer = new Timer(const Duration(seconds: 2), () { throw "failed"; });
 }
diff --git a/tests/lib/async/run_zoned2_test.dart b/tests/lib/async/run_zoned2_test.dart
index 39e28a0..fa9110f 100644
--- a/tests/lib/async/run_zoned2_test.dart
+++ b/tests/lib/async/run_zoned2_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   // Ensure that `runZoned` is done when a synchronous call finishes.
   runZonedExperimental(() => 499,
-                       onDone: port.close);
+                       onDone: asyncEnd);
 }
diff --git a/tests/lib/async/run_zoned3_test.dart b/tests/lib/async/run_zoned3_test.dart
index f880208..4545155 100644
--- a/tests/lib/async/run_zoned3_test.dart
+++ b/tests/lib/async/run_zoned3_test.dart
@@ -2,14 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   // Ensure that `runZoned` is done when a synchronous call throws.
   bool sawException = false;
   try {
@@ -17,7 +15,7 @@
                          onDone: () {
                            // onDone is executed synchronously.
                            Expect.isFalse(sawException);
-                           port.close();
+                           asyncEnd();
                          });
   } catch (e) {
     sawException = true;
diff --git a/tests/lib/async/run_zoned5_test.dart b/tests/lib/async/run_zoned5_test.dart
index bfe7c8b..6106a06 100644
--- a/tests/lib/async/run_zoned5_test.dart
+++ b/tests/lib/async/run_zoned5_test.dart
@@ -2,18 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   // Ensure that `runZoned`'s onError handles synchronous errors.
   runZonedExperimental(() { throw 0; },
                        onError: (e) {
                          Expect.equals(0, e);
-                         port.close();
+                         asyncEnd();
                        });
 }
diff --git a/tests/lib/async/run_zoned6_test.dart b/tests/lib/async/run_zoned6_test.dart
index 2de6ca9..9ede7a7 100644
--- a/tests/lib/async/run_zoned6_test.dart
+++ b/tests/lib/async/run_zoned6_test.dart
@@ -4,24 +4,23 @@
 
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   // Ensure that `runZoned`'s onError handles synchronous errors but delegates
   // to the top-level when the handler returns false.
   try {
     runZonedExperimental(() { throw 0; },
                         onError: (e) {
                           Expect.equals(0, e);
-                          port.close();
+                          if (false) /// 01: runtime error
+                            asyncEnd();
                           throw e;  /// 01: runtime error
                         });
   } catch (e) {
     // We should never see an error here.
-    if (true)  /// 01: continued
+    if (false)  /// 01: continued
       rethrow;
   }
 }
diff --git a/tests/lib/async/run_zoned7_test.dart b/tests/lib/async/run_zoned7_test.dart
index 3bd3dbb..e6f4067 100644
--- a/tests/lib/async/run_zoned7_test.dart
+++ b/tests/lib/async/run_zoned7_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   // Test runZoned with periodic Timers.
   runZonedExperimental(() {
@@ -26,7 +24,7 @@
                          1, 2, 3, 4, 5, 6,
                          ],
                          events);
-      port.close();
+      asyncEnd();
     });
   events.add("main exit");
 }
diff --git a/tests/lib/async/run_zoned8_test.dart b/tests/lib/async/run_zoned8_test.dart
index c8ce77d..6c0c89f 100644
--- a/tests/lib/async/run_zoned8_test.dart
+++ b/tests/lib/async/run_zoned8_test.dart
@@ -2,15 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 import 'catch_errors.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   var events = [];
   // Test runZoned with periodic Timers.
   runZonedExperimental(() {
@@ -30,7 +28,7 @@
                            1, "error: 1", 2, "error: 2",
                            ],
                            events);
-         port.close();
+         asyncEnd();
        });
   events.add("main exit");
 }
diff --git a/tests/lib/async/run_zoned9_test.dart b/tests/lib/async/run_zoned9_test.dart
index aeaee5d..ab0f5ab1 100644
--- a/tests/lib/async/run_zoned9_test.dart
+++ b/tests/lib/async/run_zoned9_test.dart
@@ -4,12 +4,10 @@
 
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
 
 main() {
-  // We keep a ReceivePort open until all tests are done. This way the VM will
-  // hang if the callbacks are not invoked and the test will time out.
-  var port = new ReceivePort();
+  asyncStart();
   // Ensure that `runZoned`'s onError handles synchronous errors but delegates
   // to the next runZonedExperimental when the handler returns false.
   bool sawInnerHandler = false;
@@ -24,12 +22,14 @@
     }, onError: (e) {
       Expect.equals(0, e);
       Expect.isTrue(sawInnerHandler);
-      port.close();
+      // If we are waiting for an error, don't asyncEnd, but let it time out.
+      if (false) /// 01: runtime error
+        asyncEnd();
       throw e;  /// 01: runtime error
     });
   } catch (e) {
     // We should never see an error here.
-    if (true)  /// 01: continued
+    if (false)  /// 01: continued
       rethrow;
   }
 }
diff --git a/tests/lib/async/slow_consumer2_test.dart b/tests/lib/async/slow_consumer2_test.dart
index 0c56f4a..f631a77 100644
--- a/tests/lib/async/slow_consumer2_test.dart
+++ b/tests/lib/async/slow_consumer2_test.dart
@@ -6,9 +6,9 @@
 
 library slow_consumer2_test;
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 
 const int KB = 1024;
 const int MB = KB * KB;
@@ -105,7 +105,7 @@
 }
 
 main() {
-  var port = new ReceivePort();
+  asyncStart();
   // The data provider can deliver 800MB/s of data. It sends 100MB of data to
   // the slower consumer who can only read 200MB/s. The data is sent in 1MB
   // chunks. The consumer has a buffer of 5MB. That is, it can accept a few
@@ -118,7 +118,7 @@
   new DataProvider(800 * MB, 100 * MB, 1 * MB).stream
     .pipe(new SlowConsumer(200 * MB, 5 * MB))
     .then((count) {
-      port.close();
       Expect.equals(100 * MB, count);
+      asyncEnd();
     });
 }
diff --git a/tests/lib/async/slow_consumer3_test.dart b/tests/lib/async/slow_consumer3_test.dart
index 5bb3f99..be12e12 100644
--- a/tests/lib/async/slow_consumer3_test.dart
+++ b/tests/lib/async/slow_consumer3_test.dart
@@ -6,9 +6,9 @@
 
 library slow_consumer3_test;
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 
 const int KB = 1024;
 const int MB = KB * KB;
@@ -71,7 +71,7 @@
 }
 
 main() {
-  var port = new ReceivePort();
+  asyncStart();
   // The data provider can deliver 800MBs of data as fast as it is
   // requested. The data is sent in 0.5MB chunks. The consumer has a buffer of
   // 3MB. That is, it can accept a few packages without pausing its input.
@@ -88,7 +88,7 @@
   dataGenerator(100 * MB, 512 * KB)
     .pipe(new SlowConsumer(200 * MB, 3 * MB))
     .then((count) {
-      port.close();
       Expect.equals(100 * MB, count);
+      asyncEnd();
     });
 }
diff --git a/tests/lib/async/slow_consumer_test.dart b/tests/lib/async/slow_consumer_test.dart
index f4f6ef5..8fd6d8f 100644
--- a/tests/lib/async/slow_consumer_test.dart
+++ b/tests/lib/async/slow_consumer_test.dart
@@ -6,9 +6,9 @@
 
 library slow_consumer_test;
 
+import 'package:async_helper/async_helper.dart';
 import "package:expect/expect.dart";
 import 'dart:async';
-import 'dart:isolate';
 
 const int KB = 1024;
 const int MB = KB * KB;
@@ -109,7 +109,7 @@
 }
 
 main() {
-  var port = new ReceivePort();
+  asyncStart();
   // The data provider can deliver 800MB/s of data. It sends 100MB of data to
   // the slower consumer who can only read 200MB/s. The data is sent in 1MB
   // chunks.
@@ -121,7 +121,7 @@
   new DataProvider(800 * MB, 100 * MB, 1 * MB).stream
     .pipe(new SlowConsumer(200 * MB))
     .then((count) {
-      port.close();
       Expect.equals(100 * MB, count);
+      asyncEnd();
     });
 }
diff --git a/tests/lib/async/stream_controller_async_test.dart b/tests/lib/async/stream_controller_async_test.dart
index 2bfb4f0..a130b4c 100644
--- a/tests/lib/async/stream_controller_async_test.dart
+++ b/tests/lib/async/stream_controller_async_test.dart
@@ -639,11 +639,12 @@
     var stream = asBroadcast ? c.stream.asBroadcastStream() : c.stream;
     var actual = new Events();
     var sub;
+    var pauseIsDone = false;
     sub = stream.listen(
         (v) {
           if (v == 3) {
             sub.pause(new Future.delayed(const Duration(milliseconds: 15),
-                                         () => null));
+                                         () { pauseIsDone = true; }));
           }
           actual.add(v);
         },
@@ -663,7 +664,15 @@
             // the done event to the asBroadcastStream controller, which is
             // before the final listener gets the event.
             // Wait for the pause to end before testing the events.
-            return new Future.delayed(const Duration(milliseconds: 50), () {
+            dynamic executeWhenPauseIsDone(Function f) {
+              if (!pauseIsDone) {
+                return new Future.delayed(const Duration(milliseconds: 50), () {
+                  return executeWhenPauseIsDone(f);
+                });
+              }
+              return f();
+            }
+            return executeWhenPauseIsDone(() {
               Expect.listEquals(expected.events, actual.events);
               done();
             });
diff --git a/tests/lib/convert/encoding_test.dart b/tests/lib/convert/encoding_test.dart
index cbdf72d..4c78a85 100644
--- a/tests/lib/convert/encoding_test.dart
+++ b/tests/lib/convert/encoding_test.dart
@@ -6,7 +6,7 @@
 import 'dart:async';
 import 'dart:convert';
 import 'unicode_tests.dart';
-import '../../async_helper.dart';
+import "package:async_helper/async_helper.dart";
 
 void runTest(List<int> bytes, expected) {
   var controller = new StreamController();
diff --git a/tests/lib/convert/streamed_conversion_json_decode1_test.dart b/tests/lib/convert/streamed_conversion_json_decode1_test.dart
index 67e8383..8f58cbc 100644
--- a/tests/lib/convert/streamed_conversion_json_decode1_test.dart
+++ b/tests/lib/convert/streamed_conversion_json_decode1_test.dart
@@ -5,7 +5,7 @@
 import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:convert';
-import '../../async_helper.dart';
+import "package:async_helper/async_helper.dart";
 
 final TESTS = [
     [ 5, '5' ],
diff --git a/tests/lib/convert/streamed_conversion_json_encode1_test.dart b/tests/lib/convert/streamed_conversion_json_encode1_test.dart
index 1a31ea6..c251215 100644
--- a/tests/lib/convert/streamed_conversion_json_encode1_test.dart
+++ b/tests/lib/convert/streamed_conversion_json_encode1_test.dart
@@ -5,7 +5,7 @@
 import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:convert';
-import '../../async_helper.dart';
+import "package:async_helper/async_helper.dart";
 
 final TESTS = [
     [ 5, '5' ],
diff --git a/tests/lib/convert/streamed_conversion_json_utf8_decode_test.dart b/tests/lib/convert/streamed_conversion_json_utf8_decode_test.dart
index d40a204..7516a1d 100644
--- a/tests/lib/convert/streamed_conversion_json_utf8_decode_test.dart
+++ b/tests/lib/convert/streamed_conversion_json_utf8_decode_test.dart
@@ -6,29 +6,29 @@
 import 'dart:async';
 import 'dart:convert';
 import 'json_unicode_tests.dart';
-import '../../async_helper.dart';
+import "package:async_helper/async_helper.dart";
 
 final JSON_UTF8 = JSON.fuse(UTF8);
 
-bool isJsonEqual(o1, o2) {
-  if (o1 == o2) return true;
+void expectJsonEquals(o1, o2, [path = "result"]) {
+  if (o1 == o2) return;
   if (o1 is List && o2 is List) {
-    if (o1.length != o2.length) return false;
+    Expect.equals(o1.length, o2.length, "$path.length");
     for (int i = 0; i < o1.length; i++) {
-      if (!isJsonEqual(o1[i], o2[i])) return false;
+      expectJsonEquals(o1[i], o2[i], "$path[$i]");
     }
-    return true;
+    return;
   }
   if (o1 is Map && o2 is Map) {
-    if (o1.length != o2.length) return false;
+    Expect.equals(o1.length, o2.length, "$path.length");
     for (var key in o1.keys) {
-      Expect.isTrue(key is String);
-      if (!o2.containsKey(key)) return false;
-      if (!isJsonEqual(o1[key], o2[key])) return false;
+      Expect.isTrue(key is String, "$path:key = $key");
+      Expect.isTrue(o2.containsKey(key), "$path[$key] missing in $o2");
+      expectJsonEquals(o1[key], o2[key], "$path[$key]");
     }
-    return true;
+    return;
   }
-  return false;
+  Expect.equals(o1, o2);
 }
 
 Stream<Object> createStream(List<List<int>> chunks) {
@@ -61,7 +61,7 @@
 void checkIsJsonEqual(expected, stream) {
   asyncStart();
   stream.single.then((o) {
-    Expect.isTrue(isJsonEqual(expected, o));
+    expectJsonEquals(expected, o);
     asyncEnd();
   });
 }
diff --git a/tests/lib/convert/streamed_conversion_json_utf8_encode_test.dart b/tests/lib/convert/streamed_conversion_json_utf8_encode_test.dart
index ca3f2dd..a8fe554 100644
--- a/tests/lib/convert/streamed_conversion_json_utf8_encode_test.dart
+++ b/tests/lib/convert/streamed_conversion_json_utf8_encode_test.dart
@@ -6,7 +6,7 @@
 import 'dart:async';
 import 'dart:convert';
 import 'json_unicode_tests.dart';
-import '../../async_helper.dart';
+import "package:async_helper/async_helper.dart";
 
 final JSON_UTF8 = JSON.fuse(UTF8);
 
diff --git a/tests/lib/convert/streamed_conversion_utf8_decode_test.dart b/tests/lib/convert/streamed_conversion_utf8_decode_test.dart
index e29d384..2e025f4 100644
--- a/tests/lib/convert/streamed_conversion_utf8_decode_test.dart
+++ b/tests/lib/convert/streamed_conversion_utf8_decode_test.dart
@@ -6,7 +6,7 @@
 import 'dart:async';
 import 'dart:convert';
 import 'unicode_tests.dart';
-import '../../async_helper.dart';
+import "package:async_helper/async_helper.dart";
 
 Stream<String> decode(List<int> bytes, int chunkSize) {
   var controller;
diff --git a/tests/lib/convert/streamed_conversion_utf8_encode_test.dart b/tests/lib/convert/streamed_conversion_utf8_encode_test.dart
index a5be9bc..aec3618 100644
--- a/tests/lib/convert/streamed_conversion_utf8_encode_test.dart
+++ b/tests/lib/convert/streamed_conversion_utf8_encode_test.dart
@@ -6,7 +6,7 @@
 import 'dart:async';
 import 'dart:convert';
 import 'unicode_tests.dart';
-import '../../async_helper.dart';
+import "package:async_helper/async_helper.dart";
 
 Stream<List<int>> encode(String string, int chunkSize) {
   var controller;
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 54ff120..c93b83e 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -13,6 +13,7 @@
 mirrors/invoke_test: Fail # Issue 11954
 mirrors/class_mirror_type_variables_test: Fail # Issue 12087
 mirrors/invoke_private_test: Fail # Issue 12164
+mirrors/equality_test: Fail # Issue 12333, 12919
 mirrors/function_type_mirror_test: Fail # Issue 12166
 mirrors/generics_test: Fail # Issue 12333
 mirrors/hierarchy_invariants_test: Fail # Issue 11863
@@ -22,9 +23,9 @@
 mirrors/method_mirror_returntype_test : Fail # Issue 11928
 mirrors/method_mirror_source_test : Fail # Issue 6490
 mirrors/mirrors_test: Fail # TODO(ahe): I'm working on fixing this.
+mirrors/mixin_test: Fail # Issue 12464
 mirrors/null_test : Fail # Issue 12129
 mirrors/parameter_test: Fail # Issue 6490
-mirrors/library_metadata_test: Fail # Issue 10905
 mirrors/library_uri_io_test: Skip # Not intended for dart2js as it uses dart:io.
 mirrors/reflected_type_test: Fail # Issue 12607
 mirrors/typedef_metadata_test: Fail # Issue 12785
@@ -34,6 +35,8 @@
 async/run_async6_test: Fail # global error handling is not supported. http://dartbug.com/5958
 async/stream_controller_async_test: Fail, Pass # http://dartbug.com/11953
 
+[ $runtime == safari ]
+mirrors/return_type_test: Pass, Timeout # Issue 12858
 
 [ $csp ]
 mirrors/*: Skip # Issue 6490
@@ -74,6 +77,7 @@
 
 [ $compiler == dart2dart ]
 mirrors/*: Skip # http://dartbug.com/11511
+library_metadata2_test/01: Skip # http://dartbug.com/11511
 async/run_async6_test: Fail             # Issue 10957 - may be related to issue 10910
 
 [ $compiler == dart2dart && $minified ]
@@ -81,9 +85,9 @@
 
 [ $runtime == ff ]
 # FF setTimeout can fire early: https://bugzilla.mozilla.org/show_bug.cgi?id=291386
-multiple_timer_test: Pass, Fail
-timer_isolate_test: Pass, Fail
-timer_test: Pass, Fail
+async/multiple_timer_test: Pass, Fail
+async/timer_isolate_test: Pass, Fail
+async/timer_test: Pass, Fail
 convert/chunked_conversion_utf88_test: Pass, Timeout  # Issue 12029
 convert/streamed_conversion_utf8_encode_test: Pass, Timeout  # Issue 12029
 convert/streamed_conversion_utf8_decode_test: Pass, Slow  # Issue 12029
@@ -92,10 +96,9 @@
 # IE9 doesn't support typed arrays.
 typed_data/*: Fail # Issue 11971
 convert/chunked_conversion_utf88_test: Pass, Slow, Timeout  # Issue 12029
-convert/streamed_conversion_utf8_encode_test: Pass, Timeout  # Issue 12029
 convert/streamed_conversion_json_utf8_decode_test: Pass, Timeout # Issue 12029
-async/deferred/deferred_api_test: Pass, Timeout # Issue 12029
-async/run_zoned6_test/01: fail # http://dartbug.com/12817
+async/deferred/deferred_api_test: Pass, Timeout # http://dartbug.com/12635
+convert/streamed_conversion_utf8_decode_test: Pass, Timeout # http://dartbug.com/12768
 
 
 [ $runtime == opera ]
@@ -113,7 +116,7 @@
 
 [ $runtime == vm || ($compiler == none && $runtime == drt) ]
 async/run_async3_test: Fail # _enqueueImmediate runs after Timer. http://dartbug.com/9001.
-mirrors/mixin_test: Fail # TODO(ahe): This test is slightly broken. http://dartbug.com/12464
+mirrors/mixin_dart2js_test: Skip # TODO(ahe): This test is slightly broken. http://dartbug.com/12464
 mirrors/hierarchy_test: Fail # TODO(ahe): This test is slightly broken. http://dartbug.com/12464
 
 [ $compiler == none && $runtime == drt ]
@@ -136,5 +139,13 @@
 convert/chunked_conversion_utf88_test: Pass, Slow # Issue 12644.
 
 [ $compiler == none && $runtime == drt ]
-run_zoned6_test/01: fail # Issue 12756.
-run_zoned9_test/01: fail # Issue 12756.
+async/run_zoned6_test/01: fail # Issue 12756.
+async/run_zoned9_test/01: fail # Issue 12756.
+
+[ $compiler == dartanalyzer ]
+mirrors/library_metadata2_test/01: Fail # http://dartbug.com/12950
+library_metadata2_test/01: Fail # http://dartbug.com/12950
+
+[ $compiler == dart2analyzer ]
+mirrors/library_metadata2_test/01: Fail # http://dartbug.com/12950
+library_metadata2_test/01: Fail # http://dartbug.com/12950
diff --git a/tests/lib/mirrors/equality_test.dart b/tests/lib/mirrors/equality_test.dart
new file mode 100644
index 0000000..2399032
--- /dev/null
+++ b/tests/lib/mirrors/equality_test.dart
@@ -0,0 +1,87 @@
+// 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 test.class_equality_test;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class A<T> {}
+class B extends A<int> {}
+
+checkEquality(List<Map> equivalenceClasses) {
+  for (var equivalenceClass in equivalenceClasses) {
+    equivalenceClass.forEach((name, member) {
+      equivalenceClass.forEach((otherName, otherMember) {
+        // Reflexivity, symmetry and transitivity.
+        Expect.equals(member, 
+                      otherMember,
+                      "$name == $otherName");
+        Expect.equals(member.hashCode,
+                      otherMember.hashCode,
+                      "$name.hashCode == $otherName.hashCode");
+      });
+      for (var otherEquivalenceClass in equivalenceClasses) {
+        if (otherEquivalenceClass == equivalenceClass) continue;
+        otherEquivalenceClass.forEach((otherName, otherMember) {
+          Expect.notEquals(member,
+                           otherMember,
+                           "$name != $otherName");  // Exclusion.
+          // Hash codes may or may not be equal.
+        });
+      }
+    });
+  }
+}
+
+void subroutine() {
+}
+
+main() {
+  LibraryMirror thisLibrary =
+      currentMirrorSystem()
+      .findLibrary(const Symbol('test.class_equality_test'))
+      .single;
+
+  Object o1 = new Object();
+  Object o2 = new Object();
+
+  checkEquality([
+    {'reflect(o1)' : reflect(o1),
+     'reflect(o1), again' : reflect(o1)},
+
+    {'reflect(o2)' : reflect(o2),
+     'reflect(o2), again' : reflect(o2)},
+
+    {'reflect(3+4)' : reflect(3+4),
+     'reflect(6+1)' : reflect(6+1)},
+
+    {'currentMirrorSystem().voidType' : currentMirrorSystem().voidType,
+     'thisLibrary.functions[#subroutine].returnType' :
+          thisLibrary.functions[const Symbol('subroutine')].returnType},
+
+    {'currentMirrorSystem().dynamicType' : currentMirrorSystem().dynamicType,
+     'thisLibrary.functions[#main].returnType' :
+          thisLibrary.functions[const Symbol('main')].returnType},
+
+    {'reflectClass(A)' : reflectClass(A),
+     'thisLibrary.classes[#A]' : thisLibrary.classes[const Symbol('A')],
+     'reflect(new A<int>()).type.originalDeclaration' :
+          reflect(new A<int>()).type.originalDeclaration},
+
+    {'reflectClass(B).superclass' : reflectClass(B).superclass,
+     'reflect(new A<int>()).type' : reflect(new A<int>()).type},
+
+    {'reflectClass(B)' : reflectClass(B),
+     'thisLibrary.classes[#B]' : thisLibrary.classes[const Symbol('B')],
+     'reflect(new B()).type' : reflect(new B()).type},
+
+    {'thisLibrary' : thisLibrary,
+     'reflectClass(A).owner' : reflectClass(A).owner,
+     'reflectClass(B).owner' : reflectClass(B).owner,
+     'reflect(new A()).type.owner' : reflect(new A()).type.owner,
+     'reflect(new A()).type.owner' : reflect(new A()).type.owner},
+  ]);
+}
diff --git a/tests/lib/mirrors/invoke_private_test.dart b/tests/lib/mirrors/invoke_private_test.dart
index cac9f1e..0e69bc6 100644
--- a/tests/lib/mirrors/invoke_private_test.dart
+++ b/tests/lib/mirrors/invoke_private_test.dart
@@ -7,7 +7,7 @@
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
-import '../../async_helper.dart';
+import "package:async_helper/async_helper.dart";
 
 class C {
   var _field;
diff --git a/tests/lib/mirrors/invoke_test.dart b/tests/lib/mirrors/invoke_test.dart
index e306ca2..3ba6732 100644
--- a/tests/lib/mirrors/invoke_test.dart
+++ b/tests/lib/mirrors/invoke_test.dart
@@ -7,7 +7,7 @@
 import 'dart:mirrors';
 
 import 'package:expect/expect.dart';
-import '../../async_helper.dart';
+import "package:async_helper/async_helper.dart";
 
 class C {
   var field;
diff --git a/tests/lib/mirrors/libraries_test.dart b/tests/lib/mirrors/libraries_test.dart
index 70a5e58..6639083 100644
--- a/tests/lib/mirrors/libraries_test.dart
+++ b/tests/lib/mirrors/libraries_test.dart
@@ -18,12 +18,9 @@
   LibraryMirror mirrorsLibrary = libraries[Uri.parse('dart:mirrors')];
   Expect.isNotNull(mirrorsLibrary, 'mirrorsLibrary is null');
 
-  print(mirrorsLibrary.classes);
   ClassMirror cls = mirrorsLibrary.classes[const Symbol('LibraryMirror')];
   Expect.isNotNull(cls, 'cls is null');
 
   Expect.equals(const Symbol('dart.mirrors.LibraryMirror'), cls.qualifiedName);
-  // TODO(ahe): Enable when VM implements equality of class mirrors:
-  // Expect.equals(reflectClass(LibraryMirror), cls);
-  print(mirrorsLibrary);
+  Expect.equals(reflectClass(LibraryMirror), cls);
 }
diff --git a/tests/lib/mirrors/library_metadata2_lib1.dart b/tests/lib/mirrors/library_metadata2_lib1.dart
new file mode 100644
index 0000000..75149b3
--- /dev/null
+++ b/tests/lib/mirrors/library_metadata2_lib1.dart
@@ -0,0 +1,10 @@
+// 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.
+
+@MyConst()
+library lib1;
+
+class MyConst {
+  const MyConst();
+}
diff --git a/tests/lib/mirrors/library_metadata2_lib2.dart b/tests/lib/mirrors/library_metadata2_lib2.dart
new file mode 100644
index 0000000..b8a447f
--- /dev/null
+++ b/tests/lib/mirrors/library_metadata2_lib2.dart
@@ -0,0 +1,6 @@
+// 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.
+
+@MyConst()
+library lib2;
diff --git a/tests/lib/mirrors/library_metadata2_test.dart b/tests/lib/mirrors/library_metadata2_test.dart
new file mode 100644
index 0000000..4604f7e
--- /dev/null
+++ b/tests/lib/mirrors/library_metadata2_test.dart
@@ -0,0 +1,15 @@
+// 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.
+
+import 'dart:mirrors';
+
+import 'library_metadata2_lib1.dart';
+
+import 'library_metadata2_lib2.dart'; /// 01: compile-time error
+
+void main() {
+  for (var library in currentMirrorSystem().libraries.values) {
+    print(library.metadata);
+  }
+}
diff --git a/tests/lib/mirrors/mixin_dart2js_test.dart b/tests/lib/mirrors/mixin_dart2js_test.dart
new file mode 100644
index 0000000..eb70034
--- /dev/null
+++ b/tests/lib/mirrors/mixin_dart2js_test.dart
@@ -0,0 +1,306 @@
+// 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.
+
+// TODO(ahe): This test is sligthly broken but provides temporary test coverage
+// for dart2js. See http://dartbug.com/12464.
+
+library test.mixin_test;
+
+@MirrorsUsed(targets: 'test.mixin_test, test.model, Object', override: '*')
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+import 'model.dart';
+import 'stringify.dart';
+
+class Mixin {
+  int i;
+  m() {}
+}
+
+class Mixin2 {
+  int i2;
+  m2() {}
+}
+
+typedef MixinApplication = C with Mixin;
+typedef MixinApplicationA = C with Mixin, Mixin2;
+
+typedef UnusedMixinApplication = C with Mixin;
+
+class Subclass extends C with Mixin {
+  f() {}
+}
+
+class Subclass2 extends MixinApplication {
+  g() {}
+}
+
+class SubclassA extends C with Mixin, Mixin2 {
+  fa() {}
+}
+
+class Subclass2A extends MixinApplicationA {
+  ga() {}
+}
+
+checkClass(Type type, List<String> expectedSuperclasses) {
+  int i = 0;
+  for (var cls = reflectClass(type); cls != null; cls = cls.superclass) {
+    expect(expectedSuperclasses[i++], cls);
+  }
+  Expect.equals(i, expectedSuperclasses.length, '$type');
+}
+
+expectSame(ClassMirror a, ClassMirror b) {
+  Expect.equals(a, b);
+  expect(stringify(a), b);
+  expect(stringify(b), a);
+}
+
+testMixin() {
+  checkClass(Mixin, [
+      'Class(s(Mixin) in s(test.mixin_test), top-level)',
+      'Class(s(Object) in s(dart.core), top-level)',
+  ]);
+
+  expect(
+      '{i: Variable(s(i) in s(Mixin)),'
+      ' m: Method(s(m) in s(Mixin))}',
+      reflectClass(Mixin).members);
+
+  expect('{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+         reflectClass(Mixin).constructors);
+}
+
+testMixin2() {
+  checkClass(Mixin2, [
+      'Class(s(Mixin2) in s(test.mixin_test), top-level)',
+      'Class(s(Object) in s(dart.core), top-level)',
+  ]);
+
+  expect(
+      '{i2: Variable(s(i2) in s(Mixin2)),'
+      ' m2: Method(s(m2) in s(Mixin2))}',
+      reflectClass(Mixin2).members);
+
+  expect('{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor)}',
+         reflectClass(Mixin2).constructors);
+}
+
+testMixinApplication() {
+  checkClass(MixinApplication, [
+      'Class(s(MixinApplication) in s(test.mixin_test), top-level)',
+      'Class(s(C) in s(test.model), top-level)',
+      'Class(s(B) in s(test.model), top-level)',
+      'Class(s(A) in s(test.model), top-level)',
+      'Class(s(Object) in s(dart.core), top-level)',
+  ]);
+
+  expect(
+      '{i: Variable(s(i) in s(MixinApplication)),'
+      ' m: Method(s(m) in s(MixinApplication))}',
+      reflectClass(MixinApplication).members);
+
+  expect('{MixinApplication: Method(s(MixinApplication) in s(MixinApplication),'
+         ' constructor)}',
+         reflectClass(MixinApplication).constructors);
+
+  expectSame(reflectClass(C), reflectClass(MixinApplication).superclass);
+}
+
+testMixinApplicationA() {
+  checkClass(MixinApplicationA, [
+      'Class(s(MixinApplicationA) in s(test.mixin_test), top-level)',
+      'Class(s(test.mixin_test.Mixin(test.model.C)), top-level)',
+      'Class(s(C) in s(test.model), top-level)',
+      'Class(s(B) in s(test.model), top-level)',
+      'Class(s(A) in s(test.model), top-level)',
+      'Class(s(Object) in s(dart.core), top-level)',
+  ]);
+
+  expect(
+      // TODO(ahe): The owner should be the mixin.
+      '{i2: Variable(s(i2) in s(MixinApplicationA)),'
+      ' m2: Method(s(m2) in s(MixinApplicationA))}',
+      reflectClass(MixinApplicationA).members);
+
+  expect(
+      '{MixinApplicationA: Method(s(MixinApplicationA) in s(MixinApplicationA),'
+      ' constructor)}',
+      reflectClass(MixinApplicationA).constructors);
+
+  expect(
+      '{i: Variable(s(i) in s(Mixin)),'
+      ' m: Method(s(m) in s(Mixin))}',
+      reflectClass(MixinApplicationA).superclass.members);
+
+  expect(
+      // TODO(ahe): The owner should be the mixin application.
+      '{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+      reflectClass(MixinApplicationA).superclass.constructors);
+
+  expectSame(
+      reflectClass(C),
+      reflectClass(MixinApplicationA).superclass.superclass);
+}
+
+testUnusedMixinApplication() {
+  checkClass(UnusedMixinApplication, [
+      'Class(s(UnusedMixinApplication) in s(test.mixin_test), top-level)',
+      'Class(s(C) in s(test.model), top-level)',
+      'Class(s(B) in s(test.model), top-level)',
+      'Class(s(A) in s(test.model), top-level)',
+      'Class(s(Object) in s(dart.core), top-level)',
+  ]);
+
+  expect(
+      '{i: Variable(s(i) in s(UnusedMixinApplication)),'
+      ' m: Method(s(m) in s(UnusedMixinApplication))}',
+      reflectClass(UnusedMixinApplication).members);
+
+  expect(
+      '{UnusedMixinApplication: Method(s(UnusedMixinApplication)'
+      ' in s(UnusedMixinApplication), constructor)}',
+      reflectClass(UnusedMixinApplication).constructors);
+
+  expectSame(reflectClass(C), reflectClass(UnusedMixinApplication).superclass);
+}
+
+testSubclass() {
+  checkClass(Subclass, [
+      'Class(s(Subclass) in s(test.mixin_test), top-level)',
+      'Class(s(test.mixin_test.Mixin(test.model.C)), top-level)',
+      'Class(s(C) in s(test.model), top-level)',
+      'Class(s(B) in s(test.model), top-level)',
+      'Class(s(A) in s(test.model), top-level)',
+      'Class(s(Object) in s(dart.core), top-level)',
+  ]);
+
+  expect(
+      '{f: Method(s(f) in s(Subclass))}',
+      reflectClass(Subclass).members);
+
+  expect(
+      '{Subclass: Method(s(Subclass) in s(Subclass), constructor)}',
+      reflectClass(Subclass).constructors);
+
+  expect(
+      '{i: Variable(s(i) in s(Mixin)),'
+      ' m: Method(s(m) in s(Mixin))}',
+      reflectClass(Subclass).superclass.members);
+
+  expect(
+       // TODO(ahe): The owner should be the mixin application.
+      '{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+      reflectClass(Subclass).superclass.constructors);
+
+  expectSame(
+      reflectClass(C),
+      reflectClass(Subclass).superclass.superclass);
+}
+
+testSubclass2() {
+  checkClass(Subclass2, [
+      'Class(s(Subclass2) in s(test.mixin_test), top-level)',
+      'Class(s(MixinApplication) in s(test.mixin_test), top-level)',
+      'Class(s(C) in s(test.model), top-level)',
+      'Class(s(B) in s(test.model), top-level)',
+      'Class(s(A) in s(test.model), top-level)',
+      'Class(s(Object) in s(dart.core), top-level)',
+  ]);
+
+  expect(
+      '{g: Method(s(g) in s(Subclass2))}',
+      reflectClass(Subclass2).members);
+
+  expect(
+      '{Subclass2: Method(s(Subclass2) in s(Subclass2), constructor)}',
+      reflectClass(Subclass2).constructors);
+
+  expectSame(
+      reflectClass(MixinApplication),
+      reflectClass(Subclass2).superclass);
+}
+
+testSubclassA() {
+  checkClass(SubclassA, [
+      'Class(s(SubclassA) in s(test.mixin_test), top-level)',
+      'Class(s(test.mixin_test.Mixin2(test.mixin_test.Mixin(test.model.C))),'
+      ' top-level)',
+      'Class(s(test.mixin_test.Mixin(test.model.C)), top-level)',
+      'Class(s(C) in s(test.model), top-level)',
+      'Class(s(B) in s(test.model), top-level)',
+      'Class(s(A) in s(test.model), top-level)',
+      'Class(s(Object) in s(dart.core), top-level)',
+  ]);
+
+  expect(
+      '{fa: Method(s(fa) in s(SubclassA))}',
+      reflectClass(SubclassA).members);
+
+  expect(
+      '{SubclassA: Method(s(SubclassA) in s(SubclassA), constructor)}',
+      reflectClass(SubclassA).constructors);
+
+  expect(
+      '{i2: Variable(s(i2) in s(Mixin2)),'
+      ' m2: Method(s(m2) in s(Mixin2))}',
+      reflectClass(SubclassA).superclass.members);
+
+  expect(
+       // TODO(ahe): The owner should be the mixin application.
+      '{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor)}',
+      reflectClass(SubclassA).superclass.constructors);
+
+  expect(
+      '{i: Variable(s(i) in s(Mixin)),'
+      ' m: Method(s(m) in s(Mixin))}',
+      reflectClass(SubclassA).superclass.superclass.members);
+
+  expect(
+       // TODO(ahe): The owner should be the mixin application.
+      '{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+      reflectClass(SubclassA).superclass.superclass.constructors);
+
+  expectSame(
+      reflectClass(C),
+      reflectClass(SubclassA).superclass.superclass.superclass);
+}
+
+testSubclass2A() {
+  checkClass(Subclass2A, [
+      'Class(s(Subclass2A) in s(test.mixin_test), top-level)',
+      'Class(s(MixinApplicationA) in s(test.mixin_test), top-level)',
+      'Class(s(test.mixin_test.Mixin(test.model.C)), top-level)',
+      'Class(s(C) in s(test.model), top-level)',
+      'Class(s(B) in s(test.model), top-level)',
+      'Class(s(A) in s(test.model), top-level)',
+      'Class(s(Object) in s(dart.core), top-level)',
+  ]);
+
+  expect(
+      '{ga: Method(s(ga) in s(Subclass2A))}',
+      reflectClass(Subclass2A).members);
+
+  expect(
+      '{Subclass2A: Method(s(Subclass2A) in s(Subclass2A), constructor)}',
+      reflectClass(Subclass2A).constructors);
+
+  expectSame(reflectClass(MixinApplicationA),
+             reflectClass(Subclass2A).superclass);
+}
+
+main() {
+  testMixin();
+  testMixin2();
+  testMixinApplication();
+  testMixinApplicationA();
+  testUnusedMixinApplication();
+  testSubclass();
+  testSubclass2();
+  testSubclassA();
+  testSubclass2A();
+}
diff --git a/tests/lib/mirrors/mixin_test.dart b/tests/lib/mirrors/mixin_test.dart
index eb70034..4ccb457 100644
--- a/tests/lib/mirrors/mixin_test.dart
+++ b/tests/lib/mirrors/mixin_test.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(ahe): This test is sligthly broken but provides temporary test coverage
-// for dart2js. See http://dartbug.com/12464.
-
 library test.mixin_test;
 
 @MirrorsUsed(targets: 'test.mixin_test, test.model, Object', override: '*')
@@ -65,14 +62,13 @@
       'Class(s(Mixin) in s(test.mixin_test), top-level)',
       'Class(s(Object) in s(dart.core), top-level)',
   ]);
-
   expect(
       '{i: Variable(s(i) in s(Mixin)),'
       ' m: Method(s(m) in s(Mixin))}',
       reflectClass(Mixin).members);
-
-  expect('{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
-         reflectClass(Mixin).constructors);
+  expect(
+      '{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+      reflectClass(Mixin).constructors);
 }
 
 testMixin2() {
@@ -80,14 +76,13 @@
       'Class(s(Mixin2) in s(test.mixin_test), top-level)',
       'Class(s(Object) in s(dart.core), top-level)',
   ]);
-
   expect(
       '{i2: Variable(s(i2) in s(Mixin2)),'
       ' m2: Method(s(m2) in s(Mixin2))}',
       reflectClass(Mixin2).members);
-
-  expect('{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor)}',
-         reflectClass(Mixin2).constructors);
+  expect(
+      '{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor)}',
+      reflectClass(Mixin2).constructors);
 }
 
 testMixinApplication() {
@@ -100,13 +95,13 @@
   ]);
 
   expect(
-      '{i: Variable(s(i) in s(MixinApplication)),'
-      ' m: Method(s(m) in s(MixinApplication))}',
+      '{i: Variable(s(i) in s(Mixin)),'
+      ' m: Method(s(m) in s(Mixin))}',
       reflectClass(MixinApplication).members);
-
-  expect('{MixinApplication: Method(s(MixinApplication) in s(MixinApplication),'
-         ' constructor)}',
-         reflectClass(MixinApplication).constructors);
+  expect(
+      '{MixinApplication: Method(s(MixinApplication) in s(MixinApplication),'
+      ' constructor)}',
+      reflectClass(MixinApplication).constructors);
 
   expectSame(reflectClass(C), reflectClass(MixinApplication).superclass);
 }
@@ -114,7 +109,8 @@
 testMixinApplicationA() {
   checkClass(MixinApplicationA, [
       'Class(s(MixinApplicationA) in s(test.mixin_test), top-level)',
-      'Class(s(test.mixin_test.Mixin(test.model.C)), top-level)',
+      'Class(s(test.model.C with test.mixin_test.Mixin) in s(test.mixin_test),'
+      ' top-level)',
       'Class(s(C) in s(test.model), top-level)',
       'Class(s(B) in s(test.model), top-level)',
       'Class(s(A) in s(test.model), top-level)',
@@ -122,11 +118,9 @@
   ]);
 
   expect(
-      // TODO(ahe): The owner should be the mixin.
-      '{i2: Variable(s(i2) in s(MixinApplicationA)),'
-      ' m2: Method(s(m2) in s(MixinApplicationA))}',
+      '{i2: Variable(s(i2) in s(Mixin2)),'
+      ' m2: Method(s(m2) in s(Mixin2))}',
       reflectClass(MixinApplicationA).members);
-
   expect(
       '{MixinApplicationA: Method(s(MixinApplicationA) in s(MixinApplicationA),'
       ' constructor)}',
@@ -136,10 +130,10 @@
       '{i: Variable(s(i) in s(Mixin)),'
       ' m: Method(s(m) in s(Mixin))}',
       reflectClass(MixinApplicationA).superclass.members);
-
   expect(
-      // TODO(ahe): The owner should be the mixin application.
-      '{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+      '{test.model.C with test.mixin_test.Mixin:'
+      ' Method(s(test.model.C with test.mixin_test.Mixin)'
+      ' in s(test.model.C with test.mixin_test.Mixin), constructor)}',
       reflectClass(MixinApplicationA).superclass.constructors);
 
   expectSame(
@@ -157,10 +151,9 @@
   ]);
 
   expect(
-      '{i: Variable(s(i) in s(UnusedMixinApplication)),'
-      ' m: Method(s(m) in s(UnusedMixinApplication))}',
+      '{i: Variable(s(i) in s(Mixin)),'
+      ' m: Method(s(m) in s(Mixin))}',
       reflectClass(UnusedMixinApplication).members);
-
   expect(
       '{UnusedMixinApplication: Method(s(UnusedMixinApplication)'
       ' in s(UnusedMixinApplication), constructor)}',
@@ -172,7 +165,8 @@
 testSubclass() {
   checkClass(Subclass, [
       'Class(s(Subclass) in s(test.mixin_test), top-level)',
-      'Class(s(test.mixin_test.Mixin(test.model.C)), top-level)',
+      'Class(s(test.model.C with test.mixin_test.Mixin) in s(test.mixin_test),'
+      ' top-level)',
       'Class(s(C) in s(test.model), top-level)',
       'Class(s(B) in s(test.model), top-level)',
       'Class(s(A) in s(test.model), top-level)',
@@ -182,7 +176,6 @@
   expect(
       '{f: Method(s(f) in s(Subclass))}',
       reflectClass(Subclass).members);
-
   expect(
       '{Subclass: Method(s(Subclass) in s(Subclass), constructor)}',
       reflectClass(Subclass).constructors);
@@ -191,10 +184,10 @@
       '{i: Variable(s(i) in s(Mixin)),'
       ' m: Method(s(m) in s(Mixin))}',
       reflectClass(Subclass).superclass.members);
-
   expect(
-       // TODO(ahe): The owner should be the mixin application.
-      '{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+      '{test.model.C with test.mixin_test.Mixin:'
+      ' Method(s(test.model.C with test.mixin_test.Mixin)'
+      ' in s(test.model.C with test.mixin_test.Mixin), constructor)}',
       reflectClass(Subclass).superclass.constructors);
 
   expectSame(
@@ -215,7 +208,6 @@
   expect(
       '{g: Method(s(g) in s(Subclass2))}',
       reflectClass(Subclass2).members);
-
   expect(
       '{Subclass2: Method(s(Subclass2) in s(Subclass2), constructor)}',
       reflectClass(Subclass2).constructors);
@@ -228,9 +220,10 @@
 testSubclassA() {
   checkClass(SubclassA, [
       'Class(s(SubclassA) in s(test.mixin_test), top-level)',
-      'Class(s(test.mixin_test.Mixin2(test.mixin_test.Mixin(test.model.C))),'
+      'Class(s(test.model.C with test.mixin_test.Mixin, test.mixin_test.Mixin2)'
+      ' in s(test.mixin_test), top-level)',
+      'Class(s(test.model.C with test.mixin_test.Mixin) in s(test.mixin_test),'
       ' top-level)',
-      'Class(s(test.mixin_test.Mixin(test.model.C)), top-level)',
       'Class(s(C) in s(test.model), top-level)',
       'Class(s(B) in s(test.model), top-level)',
       'Class(s(A) in s(test.model), top-level)',
@@ -240,7 +233,6 @@
   expect(
       '{fa: Method(s(fa) in s(SubclassA))}',
       reflectClass(SubclassA).members);
-
   expect(
       '{SubclassA: Method(s(SubclassA) in s(SubclassA), constructor)}',
       reflectClass(SubclassA).constructors);
@@ -249,20 +241,21 @@
       '{i2: Variable(s(i2) in s(Mixin2)),'
       ' m2: Method(s(m2) in s(Mixin2))}',
       reflectClass(SubclassA).superclass.members);
-
   expect(
-       // TODO(ahe): The owner should be the mixin application.
-      '{Mixin2: Method(s(Mixin2) in s(Mixin2), constructor)}',
+      '{test.model.C with test.mixin_test.Mixin, test.mixin_test.Mixin2:'
+      ' Method(s(test.model.C with test.mixin_test.Mixin,'
+      ' test.mixin_test.Mixin2) in s(test.model.C with test.mixin_test.Mixin,'
+      ' test.mixin_test.Mixin2), constructor)}',
       reflectClass(SubclassA).superclass.constructors);
 
   expect(
       '{i: Variable(s(i) in s(Mixin)),'
       ' m: Method(s(m) in s(Mixin))}',
       reflectClass(SubclassA).superclass.superclass.members);
-
   expect(
-       // TODO(ahe): The owner should be the mixin application.
-      '{Mixin: Method(s(Mixin) in s(Mixin), constructor)}',
+      '{test.model.C with test.mixin_test.Mixin:'
+      ' Method(s(test.model.C with test.mixin_test.Mixin)'
+      ' in s(test.model.C with test.mixin_test.Mixin), constructor)}',
       reflectClass(SubclassA).superclass.superclass.constructors);
 
   expectSame(
@@ -274,7 +267,8 @@
   checkClass(Subclass2A, [
       'Class(s(Subclass2A) in s(test.mixin_test), top-level)',
       'Class(s(MixinApplicationA) in s(test.mixin_test), top-level)',
-      'Class(s(test.mixin_test.Mixin(test.model.C)), top-level)',
+      'Class(s(test.model.C with test.mixin_test.Mixin) in s(test.mixin_test),'
+      ' top-level)',
       'Class(s(C) in s(test.model), top-level)',
       'Class(s(B) in s(test.model), top-level)',
       'Class(s(A) in s(test.model), top-level)',
@@ -284,7 +278,6 @@
   expect(
       '{ga: Method(s(ga) in s(Subclass2A))}',
       reflectClass(Subclass2A).members);
-
   expect(
       '{Subclass2A: Method(s(Subclass2A) in s(Subclass2A), constructor)}',
       reflectClass(Subclass2A).constructors);
diff --git a/tests/light_unittest.dart b/tests/light_unittest.dart
index 02ed433..9128ef7 100644
--- a/tests/light_unittest.dart
+++ b/tests/light_unittest.dart
@@ -8,7 +8,7 @@
 
 import 'dart:async';
 
-import 'async_helper.dart';
+import 'package:async_helper/async_helper.dart';
 import '../pkg/expect/lib/expect.dart';
 
 test(name, f) {
@@ -59,7 +59,10 @@
 expectAsync1(then) {
   asyncStart();
   return (x) {
+    // 'then(x)' may call 'asyncStart()', so we first need to execute it, before
+    // we can call 'asyncEnd()'.
+    var result = then(x);
     asyncEnd();
-    return then(x);
+    return result;
   };
 }
diff --git a/tests/standalone/debugger/debug_lib.dart b/tests/standalone/debugger/debug_lib.dart
index 66030d9..a5f19ab 100644
--- a/tests/standalone/debugger/debug_lib.dart
+++ b/tests/standalone/debugger/debug_lib.dart
@@ -10,7 +10,6 @@
 import "dart:convert";
 import "dart:io";
 import "dart:math";
-import "dart:json" as JSON;
 
 // Whether or not to print the debugger wire messages on the console.
 var verboseWire = false;
@@ -63,7 +62,7 @@
   // buffer, or 0 if there is only a partial message in the buffer.
   // The object value must start with '{' and continues to the
   // matching '}'. No attempt is made to otherwise validate the contents
-  // as JSON. If it is invalid, a later JSON.parse() will fail.
+  // as JSON. If it is invalid, a later JSON.decode() will fail.
   int objectLength() {
     int skipWhitespace(int index) {
       while (index < buffer.length) {
@@ -500,7 +499,7 @@
         cleanup();
         return;
       }
-      var msgObj = JSON.parse(msg);
+      var msgObj = JSON.decode(msg);
       handleMessage(msgObj);
       if (errorsDetected) {
         error("Error while handling script entry");
@@ -525,7 +524,7 @@
     if (msg["params"] != null && msg["params"]["isolateId"] != null) {
       msg["params"]["isolateId"] = isolateId;
     }
-    String jsonMsg = JSON.stringify(msg);
+    String jsonMsg = JSON.encode(msg);
     if (verboseWire) print("SEND: $jsonMsg");
     socket.write(jsonMsg);
   }
diff --git a/tests/standalone/io/http_response_deadline_test.dart b/tests/standalone/io/http_response_deadline_test.dart
index ee14d0e..5f53793 100644
--- a/tests/standalone/io/http_response_deadline_test.dart
+++ b/tests/standalone/io/http_response_deadline_test.dart
@@ -14,7 +14,7 @@
 void testSimpleDeadline(int connections) {
   HttpServer.bind('localhost', 0).then((server) {
     server.listen((request) {
-      request.response.deadline = const Duration(seconds: 10);
+      request.response.deadline = const Duration(seconds: 1000);
       request.response.write("stuff");
       request.response.close();
     });
diff --git a/tests/standalone/io/web_socket_ping_test.dart b/tests/standalone/io/web_socket_ping_test.dart
index 29fec92..3825701 100644
--- a/tests/standalone/io/web_socket_ping_test.dart
+++ b/tests/standalone/io/web_socket_ping_test.dart
@@ -7,33 +7,49 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
+library dart.io;
+
 import "package:expect/expect.dart";
 import "dart:async";
 import "dart:io";
+import "dart:math";
 
+part "../../../sdk/lib/io/crypto.dart";
+
+
+const String webSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
 
 void testPing(int totalConnections) {
   HttpServer.bind('localhost', 0).then((server) {
-    server.transform(new WebSocketTransformer()).listen((webSocket) {
-      webSocket.pingInterval = const Duration(milliseconds: 500);
-      webSocket.drain();
+    int closed = 0;
+    server.listen((request) {
+      var response = request.response;
+      response.statusCode = HttpStatus.SWITCHING_PROTOCOLS;
+      response.headers.set(HttpHeaders.CONNECTION, "upgrade");
+      response.headers.set(HttpHeaders.UPGRADE, "websocket");
+      String key = request.headers.value("Sec-WebSocket-Key");
+      _SHA1 sha1 = new _SHA1();
+      sha1.add("$key$webSocketGUID".codeUnits);
+      String accept = _CryptoUtils.bytesToBase64(sha1.close());
+      response.headers.add("Sec-WebSocket-Accept", accept);
+      response.headers.contentLength = 0;
+      response.detachSocket().then((socket) {
+        socket.drain().then((_) {
+          socket.close();
+          closed++;
+          if (closed == totalConnections) {
+            server.close();
+          }
+        });
+      });
     });
 
-    var futures = [];
     for (int i = 0; i < totalConnections; i++) {
-      futures.add(
-          WebSocket.connect('ws://localhost:${server.port}').then((webSocket) {
-        webSocket.pingInterval = const Duration(milliseconds: 500);
+      WebSocket.connect('ws://localhost:${server.port}').then((webSocket) {
+        webSocket.pingInterval = const Duration(milliseconds: 100);
         webSocket.drain();
-        new Timer(const Duration(seconds: 2), () {
-          // Should not be closed yet.
-          Expect.equals(null, webSocket.closeCode);
-          webSocket.close();
-        });
-        return webSocket.done;
-      }));
+      });
     }
-    Future.wait(futures).then((_) => server.close());
   });
 }
 
diff --git a/tests/standalone/io/web_socket_pipe_test.dart b/tests/standalone/io/web_socket_pipe_test.dart
new file mode 100644
index 0000000..e182a40
--- /dev/null
+++ b/tests/standalone/io/web_socket_pipe_test.dart
@@ -0,0 +1,69 @@
+// 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.
+//
+// VMOptions=
+// VMOptions=--short_socket_read
+// VMOptions=--short_socket_write
+// VMOptions=--short_socket_read --short_socket_write
+
+import "package:expect/expect.dart";
+import "dart:async";
+import "dart:io";
+
+class IdentityTransformer extends StreamEventTransformer {
+  void handleData(data, sink) => sink.add(data);
+}
+
+class ReverseStringTransformer extends StreamEventTransformer {
+  void handleData(String data, sink) {
+    var sb = new StringBuffer();
+    for (int i = data.length - 1; i >= 0; i--) sb.write(data[i]);
+    sink.add(sb.toString());
+  }
+}
+
+testPipe({int messages, bool transform}) {
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    server.listen((request) {
+      WebSocketTransformer.upgrade(request).then((websocket) {
+        (transform ? websocket.transform(new ReverseStringTransformer())
+                   : websocket)
+            .pipe(websocket)
+            .then((_) => server.close());
+      });
+    });
+    WebSocket.connect("ws://127.0.0.1:${server.port}/").then((client) {
+      var count = 0;
+      next() {
+        if (count < messages) {
+          client.add("Hello");
+        } else {
+          client.close();
+        }
+      }
+
+      next();
+      client.listen(
+          (data) {
+            count++;
+            if (transform) {
+              Expect.equals("olleH", data);
+            } else {
+              Expect.equals("Hello", data);
+            }
+            next();
+          },
+          onDone: () => print("Client received close"));
+    });
+  });
+}
+
+void main() {
+  testPipe(messages: 0, transform: false);
+  testPipe(messages: 0, transform: true);
+  testPipe(messages: 1, transform: false);
+  testPipe(messages: 1, transform: true);
+  testPipe(messages: 10, transform: false);
+  testPipe(messages: 10, transform: true);
+}
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 19ce35c..7251e17 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -47,6 +47,9 @@
 io/directory_non_ascii_test: Pass, Fail
 io/process_non_ascii_test: Pass, Fail
 
+[ $runtime == vm && $system == windows ]
+io/http_server_early_client_close_test: Crash, Pass # Issue 12982
+
 [ $compiler == none && $runtime == drt ]
 typed_data_isolate_test: Skip # This test uses dart:io
 io/*: Skip # Don't run tests using dart:io in the browser
@@ -134,6 +137,7 @@
 [ $compiler == dart2js && $runtime == none ]
 io/options_test: Fail
 medium_integer_test: Pass # The test only fails at runtime, not at compilation.
+oom_error_stacktrace_test: Pass # The test only fails at runtime.
 
 [ $compiler == dart2js && $browser ]
 *: Skip
@@ -151,7 +155,6 @@
 [ $arch == simarm ]
 out_of_memory_test: Skip # passes on Mac, crashes on Linux
 oom_error_stacktrace_test: Skip # Fails on Linux
-io/web_socket_ping_test: Skip # TODO(ajohnsen): Timeout issue
 io/test_runner_test: Pass, Fail # Issue 12413
 
 [ $arch == simmips || $arch == mips ]
@@ -160,7 +163,6 @@
 io/http_server_response_test: Pass, Slow
 out_of_memory_test: Skip # passes on Mac, crashes on Linux
 oom_error_stacktrace_test: Skip # Fails on Linux
-io/web_socket_ping_test: Skip # TODO(ajohnsen): Timeout issue
 
 [ $arch == mips ]
 io/test_extension_test: Fail
diff --git a/tests/standalone/vmservice/test_helper.dart b/tests/standalone/vmservice/test_helper.dart
index 1eb81aed..325ecb1 100644
--- a/tests/standalone/vmservice/test_helper.dart
+++ b/tests/standalone/vmservice/test_helper.dart
@@ -7,7 +7,6 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as JSON;
 import 'package:expect/expect.dart';
 
 abstract class VmServiceRequestHelper {
@@ -45,7 +44,7 @@
     print('** Response: $replyAsString');
     var reply;
     try {
-      reply = JSON.parse(replyAsString);
+      reply = JSON.decode(replyAsString);
     } catch (e) {
       onRequestFailed(e);
       return;
diff --git a/tests/utils/recursive_import_test.dart b/tests/utils/recursive_import_test.dart
index db0eff3..b0a042d 100644
--- a/tests/utils/recursive_import_test.dart
+++ b/tests/utils/recursive_import_test.dart
@@ -54,6 +54,10 @@
   concat(x) => null;
   toString() => null;
 }
+class JSNull {
+}
+class JSBool {
+}
 """;
 
 const String RECURSIVE_MAIN = """
diff --git a/tools/VERSION b/tools/VERSION
index b00c238..cc8eb02 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 7
-BUILD 0
+BUILD 1
 PATCH 0
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index 3f9d9c3..4cc6ac6 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -119,7 +119,7 @@
   supported_platforms = {
     'linux': ['ff', 'chromeOnAndroid', 'chrome'],
     'mac': ['safari'],
-    'windows': ['ie9']
+    'windows': ['ie9', 'ie10']
   }
   # Platforms that we run on the fyi waterfall only.
   fyi_supported_platforms = {
diff --git a/tools/bots/editor.py b/tools/bots/editor.py
index ffe7311..c4a45bb 100755
--- a/tools/bots/editor.py
+++ b/tools/bots/editor.py
@@ -122,6 +122,11 @@
               '-mrelease', '--arch=%s' % arch, 'editor', 'create_sdk']
       RunProcess(args)
 
+  # before we run the editor, suppress any 'restore windows' dialogs
+  if sys.platform == 'darwin':
+    bot.RunProcess(['defaults', 'write', 'org.eclipse.eclipse.savedState',
+                    'NSQuitAlwaysKeepsWindows', '-bool', 'false'])
+
   for arch in test_architectures:
     editor_executable = GetEditorExecutable('Release', arch)
     with bot.BuildStep('Test Editor %s' % arch):
diff --git a/tools/coverage.dart b/tools/coverage.dart
index 678fe57..34018c5 100644
--- a/tools/coverage.dart
+++ b/tools/coverage.dart
@@ -15,7 +15,6 @@
 
 import "dart:convert";
 import "dart:io";
-import "dart:json" as JSON;
 
 
 // Whether or not to print debug target process on the console.
@@ -311,7 +310,7 @@
         cleanup();
         return;
       }
-      var msgObj = JSON.parse(msg);
+      var msgObj = JSON.decode(msg);
       handleMessage(msgObj);
       if (errorsDetected) {
         error("Error while handling message from coverage target");
@@ -343,7 +342,7 @@
   void sendMessage(Map<String,dynamic> msg) {
     assert(msg["id"] != null);
     msg["id"] = nextMessageId++;
-    String jsonMsg = JSON.stringify(msg);
+    String jsonMsg = JSON.encode(msg);
     if (verboseWire) print("SEND: $jsonMsg");
     socket.write(jsonMsg);
   }
@@ -481,7 +480,7 @@
   // buffer, or 0 if there is only a partial message in the buffer.
   // The object value must start with '{' and continues to the
   // matching '}'. No attempt is made to otherwise validate the contents
-  // as JSON. If it is invalid, a later JSON.parse() will fail.
+  // as JSON. If it is invalid, a later JSON.decode() will fail.
   int objectLength() {
     int skipWhitespace(int index) {
       while (index < buffer.length) {
diff --git a/tools/ddbg.dart b/tools/ddbg.dart
index 29a86f4..9b164ab 100644
--- a/tools/ddbg.dart
+++ b/tools/ddbg.dart
@@ -7,7 +7,6 @@
 
 import "dart:convert";
 import "dart:io";
-import "dart:json" as json;
 import "dart:async";
 
 
@@ -40,6 +39,7 @@
   po <id> Print object info for given id
   eval obj <id> <expr> Evaluate expr on object id
   eval cls <id> <expr> Evaluate expr on class id
+  eval lib <id> <expr> Evaluate expr in toplevel of library id
   pl <id> <idx> [<len>] Print list element/slice
   pc <id> Print class info for given id
   ll  List loaded libraries
@@ -69,9 +69,9 @@
   int id = cmd["id"];
   outstandingCommands[id] = completer;
   if (verbose) {
-    print("sending: '${json.stringify(cmd)}'");
+    print("sending: '${JSON.encode(cmd)}'");
   }
-  vmSock.write(json.stringify(cmd));
+  vmSock.write(JSON.encode(cmd));
   return completer.future;
 }
 
@@ -139,6 +139,8 @@
       target = "objectId";
     } else if (target == "cls") {
       target = "classId";
+    } else if (target == "lib") {
+      target = "libraryId";
     } else {
       huh();
       return;
@@ -462,7 +464,7 @@
 
 
 void processVmMessage(String jsonString) {
-  var msg = json.parse(jsonString);
+  var msg = JSON.decode(jsonString);
   if (msg == null) {
     return;
   }
diff --git a/tools/dom/docs/docs.json b/tools/dom/docs/docs.json
index ef81ce5..b2df0d0 100644
--- a/tools/dom/docs/docs.json
+++ b/tools/dom/docs/docs.json
@@ -326,45 +326,6 @@
           "   * for a list of common response headers.",
           "   */"
         ],
-        "onabort": [
-          "/**",
-          "   * Event listeners to be notified when request has been aborted,",
-          "   * generally due to calling `httpRequest.abort()`.",
-          "   */"
-        ],
-        "onerror": [
-          "/**",
-          "   * Event listeners to be notified when a request has failed, such as when a",
-          "   * cross-domain error occurred or the file wasn't found on the server.",
-          "   */"
-        ],
-        "onload": [
-          "/**",
-          "   * Event listeners to be notified once the request has completed",
-          "   * *successfully*.",
-          "   */"
-        ],
-        "onloadend": [
-          "/**",
-          "   * Event listeners to be notified once the request has completed (on",
-          "   * either success or failure).",
-          "   */"
-        ],
-        "onloadstart": [
-          "/**",
-          "   * Event listeners to be notified when the request starts, once",
-          "   * `httpRequest.send()` has been called.",
-          "   */"
-        ],
-        "onprogress": [
-          "/**",
-          "   * Event listeners to be notified when data for the request",
-          "   * is being sent or loaded.",
-          "   *",
-          "   * Progress events are fired every 50ms or for every byte transmitted,",
-          "   * whichever is less frequent.",
-          "   */"
-        ],
         "onreadystatechange": [
           "/**",
           "   * Event listeners to be notified every time the [HttpRequest]",
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 57ac1bf..3bafc1d 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -64,6 +64,34 @@
     },
     "support_level": "experimental"
   },
+  "ApplicationCache": {
+    "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#application-cache-api",
+    "dart_action": "unstable",
+    "members": {
+      "CHECKING": {},
+      "DOWNLOADING": {},
+      "IDLE": {},
+      "OBSOLETE": {},
+      "UNCACHED": {},
+      "UPDATEREADY": {},
+      "abort": {},
+      "addEventListener": {},
+      "dispatchEvent": {},
+      "oncached": {},
+      "onchecking": {},
+      "ondownloading": {},
+      "onerror": {},
+      "onnoupdate": {},
+      "onobsolete": {},
+      "onprogress": {},
+      "onupdateready": {},
+      "removeEventListener": {},
+      "status": {},
+      "swapCache": {},
+      "update": {}
+    },
+    "support_level": "stable"
+  },
   "ArrayBuffer": {
     "comment": "http://www.khronos.org/registry/typedarray/specs/latest/",
     "members": {
@@ -85,7 +113,13 @@
     "comment": "http://www.w3.org/TR/dom/#interface-attr",
     "members": {
       "isId": {},
+      "localName": {
+        "support_level": "untriaged"
+      },
       "name": {},
+      "namespaceURI": {
+        "support_level": "untriaged"
+      },
       "ownerElement": {
         "dart_action": "suppress",
         "support_level": "deprecated"
@@ -383,6 +417,40 @@
     },
     "support_level": "stable"
   },
+  "CSSKeyframeRule": {
+    "members": {
+      "keyText": {
+        "support_level": "untriaged"
+      },
+      "style": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "CSSKeyframesRule": {
+    "members": {
+      "__getter__": {
+        "support_level": "untriaged"
+      },
+      "cssRules": {
+        "support_level": "untriaged"
+      },
+      "deleteRule": {
+        "support_level": "untriaged"
+      },
+      "findRule": {
+        "support_level": "untriaged"
+      },
+      "insertRule": {
+        "support_level": "untriaged"
+      },
+      "name": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CSSMediaRule": {
     "comment": "http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule",
     "members": {
@@ -456,6 +524,12 @@
         "support_level": "experimental"
       },
       "IMPORT_RULE": {},
+      "KEYFRAMES_RULE": {
+        "support_level": "untriaged"
+      },
+      "KEYFRAME_RULE": {
+        "support_level": "untriaged"
+      },
       "MEDIA_RULE": {},
       "PAGE_RULE": {},
       "STYLE_RULE": {},
@@ -905,6 +979,9 @@
   },
   "Console": {
     "members": {
+      "assert": {
+        "support_level": "untriaged"
+      },
       "assertCondition": {
         "support_level": "experimental"
       },
@@ -956,6 +1033,74 @@
     },
     "support_level": "stable"
   },
+  "ConsoleBase": {
+    "members": {
+      "assertCondition": {
+        "support_level": "untriaged"
+      },
+      "clear": {
+        "support_level": "untriaged"
+      },
+      "count": {
+        "support_level": "untriaged"
+      },
+      "debug": {
+        "support_level": "untriaged"
+      },
+      "dir": {
+        "support_level": "untriaged"
+      },
+      "dirxml": {
+        "support_level": "untriaged"
+      },
+      "error": {
+        "support_level": "untriaged"
+      },
+      "group": {
+        "support_level": "untriaged"
+      },
+      "groupCollapsed": {
+        "support_level": "untriaged"
+      },
+      "groupEnd": {
+        "support_level": "untriaged"
+      },
+      "info": {
+        "support_level": "untriaged"
+      },
+      "log": {
+        "support_level": "untriaged"
+      },
+      "markTimeline": {
+        "support_level": "untriaged"
+      },
+      "profile": {
+        "support_level": "untriaged"
+      },
+      "profileEnd": {
+        "support_level": "untriaged"
+      },
+      "table": {
+        "support_level": "untriaged"
+      },
+      "time": {
+        "support_level": "untriaged"
+      },
+      "timeEnd": {
+        "support_level": "untriaged"
+      },
+      "timeStamp": {
+        "support_level": "untriaged"
+      },
+      "trace": {
+        "support_level": "untriaged"
+      },
+      "warn": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "ConvolverNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#ConvolverNode",
     "members": {
@@ -1035,32 +1180,51 @@
     "support_level": "stable"
   },
   "DOMApplicationCache": {
-    "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#application-cache-api",
-    "dart_action": "unstable",
     "members": {
-      "CHECKING": {},
-      "DOWNLOADING": {},
-      "IDLE": {},
-      "OBSOLETE": {},
-      "UNCACHED": {},
-      "UPDATEREADY": {},
-      "abort": {},
-      "addEventListener": {},
-      "dispatchEvent": {},
-      "oncached": {},
-      "onchecking": {},
-      "ondownloading": {},
-      "onerror": {},
-      "onnoupdate": {},
-      "onobsolete": {},
-      "onprogress": {},
-      "onupdateready": {},
-      "removeEventListener": {},
-      "status": {},
-      "swapCache": {},
-      "update": {}
+      "CHECKING": {
+        "support_level": "untriaged"
+      },
+      "DOWNLOADING": {
+        "support_level": "untriaged"
+      },
+      "IDLE": {
+        "support_level": "untriaged"
+      },
+      "OBSOLETE": {
+        "support_level": "untriaged"
+      },
+      "UNCACHED": {
+        "support_level": "untriaged"
+      },
+      "UPDATEREADY": {
+        "support_level": "untriaged"
+      },
+      "abort": {
+        "support_level": "untriaged"
+      },
+      "addEventListener": {
+        "support_level": "untriaged"
+      },
+      "dispatchEvent": {
+        "support_level": "untriaged"
+      },
+      "onerror": {
+        "support_level": "untriaged"
+      },
+      "removeEventListener": {
+        "support_level": "untriaged"
+      },
+      "status": {
+        "support_level": "untriaged"
+      },
+      "swapCache": {
+        "support_level": "untriaged"
+      },
+      "update": {
+        "support_level": "untriaged"
+      }
     },
-    "support_level": "stable"
+    "support_level": "untriaged"
   },
   "DOMError": {
     "comment": "http://www.w3.org/TR/dom/#interface-domerror",
@@ -1276,12 +1440,18 @@
   "DataTransferItemList": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-datatransferitemlist-interface",
     "members": {
+      "__getter__": {
+        "support_level": "untriaged"
+      },
       "add": {},
       "addData": {},
       "addFile": {},
       "clear": {},
       "item": {},
-      "length": {}
+      "length": {},
+      "remove": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -1950,6 +2120,12 @@
         "support_level": "nonstandard"
       },
       "lastElementChild": {},
+      "localName": {
+        "support_level": "untriaged"
+      },
+      "namespaceURI": {
+        "support_level": "untriaged"
+      },
       "nextElementSibling": {},
       "offsetHeight": {},
       "offsetLeft": {},
@@ -4692,6 +4868,17 @@
     },
     "support_level": "stable"
   },
+  "HmacKeyParams": {
+    "members": {
+      "hash": {
+        "support_level": "untriaged"
+      },
+      "length": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "HmacParams": {
     "members": {
       "hash": {
@@ -5703,6 +5890,31 @@
     },
     "support_level": "stable"
   },
+  "NavigatorID": {
+    "members": {
+      "appName": {
+        "support_level": "untriaged"
+      },
+      "appVersion": {
+        "support_level": "untriaged"
+      },
+      "platform": {
+        "support_level": "untriaged"
+      },
+      "userAgent": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "NavigatorOnLine": {
+    "members": {
+      "onLine": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "NavigatorUserMediaError": {
     "comment": "http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-NavigatorUserMediaError",
     "members": {
@@ -11781,6 +11993,15 @@
       "DOM_DELTA_PAGE": {},
       "DOM_DELTA_PIXEL": {},
       "deltaMode": {},
+      "deltaX": {
+        "support_level": "untriaged"
+      },
+      "deltaY": {
+        "support_level": "untriaged"
+      },
+      "deltaZ": {
+        "support_level": "untriaged"
+      },
       "initWebKitWheelEvent": {
         "support_level": "experimental"
       },
@@ -12178,6 +12399,10 @@
     },
     "support_level": "stable"
   },
+  "WorkerConsole": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "WorkerContext": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#WorkerGlobalScope-partial",
     "dart_action": "experimental",
@@ -12291,6 +12516,9 @@
       "close": {
         "support_level": "untriaged"
       },
+      "console": {
+        "support_level": "untriaged"
+      },
       "crypto": {
         "support_level": "untriaged"
       },
@@ -12471,6 +12699,38 @@
     },
     "support_level": "stable"
   },
+  "XMLHttpRequestEventTarget": {
+    "members": {
+      "addEventListener": {
+        "support_level": "untriaged"
+      },
+      "dispatchEvent": {
+        "support_level": "untriaged"
+      },
+      "onabort": {
+        "support_level": "untriaged"
+      },
+      "onerror": {
+        "support_level": "untriaged"
+      },
+      "onload": {
+        "support_level": "untriaged"
+      },
+      "onloadend": {
+        "support_level": "untriaged"
+      },
+      "onloadstart": {
+        "support_level": "untriaged"
+      },
+      "onprogress": {
+        "support_level": "untriaged"
+      },
+      "removeEventListener": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "XMLHttpRequestException": {
     "comment": "http://www.w3.org/TR/2007/WD-XMLHttpRequest-20070227/#exceptions",
     "dart_action": "experimental",
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index a132f15..a38ee94 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -72,7 +72,7 @@
 };
 
 [Supplemental]
-interface Console {
+interface ConsoleBase {
   [Suppressed] void assert(boolean condition);
   [CallWith=ScriptArguments|ScriptState] void assertCondition(boolean condition);
 };
@@ -183,14 +183,11 @@
 };
 [Supplemental]
 interface IDBIndex {
-    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest openCursor([ForceOptional] optional IDBKeyRange? range, [ForceOptional] optional DOMString direction);
-    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest openCursor(any key, [ForceOptional] optional DOMString direction);
-    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest openKeyCursor([ForceOptional] optional IDBKeyRange? range, [ForceOptional] optional DOMString  direction);
-    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest openKeyCursor(any key,
-    [ForceOptional] optional DOMString direction);
+    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest openCursor([Default=Undefined] optional any key, [Default=NullString] optional DOMString direction);
 
-    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest count([ForceOptional] optional IDBKeyRange? range);
-    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest count(any key);
+    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest openKeyCursor([Default=Undefined] optional any key, [Default=NullString] optional DOMString direction);
+
+    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest count([Default=Undefined] optional any key);
 };
 
 [Supplemental]
@@ -205,13 +202,13 @@
   [DartName=upperBound_] static IDBKeyRange upperBound(any bound, [ForceOptional] optional boolean open);
   [DartName=bound_] static IDBKeyRange bound(any lower, any upper, [ForceOptional] optional boolean lowerOpen, [ForceOptional] optional boolean upperOpen);
 };
+
 [Supplemental]
 interface IDBObjectStore {
     [CallWith=ScriptState, RaisesException] IDBRequest put(any value, [ForceOptional] optional any key);
     [CallWith=ScriptState, RaisesException] IDBRequest add(any value, [ForceOptional] optional any key);
-    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest openCursor([ForceOptional] optional IDBKeyRange? range, [ForceOptional] optional DOMString direction);
+    # [CallWith=ScriptExecutionContext, ImplementedAs=deleteFunction, RaisesException] IDBRequest delete(any key);
     [CallWith=ScriptExecutionContext, RaisesException] IDBRequest openCursor(any key, [ForceOptional] optional DOMString direction);
-    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest count([ForceOptional] optional IDBKeyRange? range);
     [CallWith=ScriptExecutionContext, RaisesException] IDBRequest count(any key);
 };
 
@@ -301,7 +298,6 @@
    [Custom] void send(FormData data);
 };
 
-
 [Suppressed]
 interface AbstractView {};
 
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index 40b9713..8b6063c 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -384,7 +384,7 @@
   'Crypto': _webkit_experimental_annotations,
   'Database': _web_sql_annotations,
   'DatabaseSync': _web_sql_annotations,
-  'DOMApplicationCache': [
+  'ApplicationCache': [
     "@SupportedBrowser(SupportedBrowser.CHROME)",
     "@SupportedBrowser(SupportedBrowser.FIREFOX)",
     "@SupportedBrowser(SupportedBrowser.IE, '10')",
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 5889566..06f4df6 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -21,6 +21,8 @@
     'EventHandler',
     'MediaQueryListListener',
     'MutationCallback',
+    'NavigatorID',
+    'NavigatorOnLine',
     'ParentNode',
     'SVGExternalResourcesRequired',
     'SVGFilterPrimitiveStandardAttributes',
@@ -98,7 +100,7 @@
         #                    IE                   Firefox
         'CSSStyleDeclaration,MSStyleCSSProperties,CSS2Properties',
 
-    'DOMApplicationCache':
+    'ApplicationCache':
         'ApplicationCache,DOMApplicationCache,OfflineResourceList',
 
     'HTMLTableCellElement':
@@ -109,7 +111,7 @@
     'IDBOpenDBRequest':
         'IDBOpenDBRequest,IDBVersionChangeRequest',
 
-    'MouseEvent': 'MouseEvent,DragEvent',
+    'MouseEvent': 'MouseEvent,DragEvent,PointerEvent,MSPointerEvent',
 
     'MutationObserver': 'MutationObserver,WebKitMutationObserver',
 
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 73c5d92..acfccc1 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -651,13 +651,22 @@
         })
     self._members_emitter.Emit(template, E=element_name)
 
-  def SecureOutputType(self, type_name, is_dart_type=False):
+  def SecureOutputType(self, type_name, is_dart_type=False,
+      can_narrow_type=False):
     """ Converts the type name to the secure type name for return types.
+    Arguments:
+      can_narrow_type - True if the output type can be narrowed further than
+        what would be accepted for input, used to narrow num APIs down to double
+        or int.
     """
     if is_dart_type:
       dart_name = type_name
     else:
-      dart_name = self._DartType(type_name)
+      type_info = self._TypeInfo(type_name)
+      dart_name = type_info.dart_type()
+      if can_narrow_type and dart_name == 'num':
+        dart_name = type_info.native_type()
+
     # We only need to secure Window.  Only local History and Location are
     # returned in generated code.
     assert(dart_name != 'HistoryBase' and dart_name != 'LocationBase')
@@ -671,3 +680,6 @@
 
   def _DartType(self, type_name):
     return self._type_registry.DartType(type_name)
+
+  def _TypeInfo(self, type_name):
+    return self._type_registry.TypeInfo(type_name)
diff --git a/tools/dom/scripts/htmleventgenerator.py b/tools/dom/scripts/htmleventgenerator.py
index 4f38941..89602e0 100644
--- a/tools/dom/scripts/htmleventgenerator.py
+++ b/tools/dom/scripts/htmleventgenerator.py
@@ -115,13 +115,13 @@
   '*.webkitfullscreenerror': ('fullscreenError', 'Event'),
   'AbstractWorker.error': ('error', 'ErrorEvent'),
   'AudioContext.complete': ('complete', 'Event'),
-  'DOMApplicationCache.cached': ('cached', 'Event'),
-  'DOMApplicationCache.checking': ('checking', 'Event'),
-  'DOMApplicationCache.downloading': ('downloading', 'Event'),
-  'DOMApplicationCache.noupdate': ('noUpdate', 'Event'),
-  'DOMApplicationCache.obsolete': ('obsolete', 'Event'),
-  'DOMApplicationCache.progress': ('progress', 'ProgressEvent'),
-  'DOMApplicationCache.updateready': ('updateReady', 'Event'),
+  'ApplicationCache.cached': ('cached', 'Event'),
+  'ApplicationCache.checking': ('checking', 'Event'),
+  'ApplicationCache.downloading': ('downloading', 'Event'),
+  'ApplicationCache.noupdate': ('noUpdate', 'Event'),
+  'ApplicationCache.obsolete': ('obsolete', 'Event'),
+  'ApplicationCache.progress': ('progress', 'ProgressEvent'),
+  'ApplicationCache.updateready': ('updateReady', 'Event'),
   'Document.readystatechange': ('readyStateChange', 'Event'),
   'Document.securitypolicyviolation': ('securityPolicyViolation', 'SecurityPolicyViolationEvent'),
   'Document.selectionchange': ('selectionChange', 'Event'),
@@ -215,19 +215,13 @@
   'Window.pagehide': ('pageHide', 'Event'),
   'Window.pageshow': ('pageShow', 'Event'),
   'Window.progress': ('progress', 'Event'),
-  'XMLHttpRequest.abort': ('abort', 'ProgressEvent'),
-  'XMLHttpRequest.error': ('error', 'ProgressEvent'),
-  'XMLHttpRequest.load': ('load', 'ProgressEvent'),
-  'XMLHttpRequest.loadend': ('loadEnd', 'ProgressEvent'),
-  'XMLHttpRequest.loadstart': ('loadStart', 'ProgressEvent'),
-  'XMLHttpRequest.progress': ('progress', 'ProgressEvent'),
+  'XMLHttpRequestEventTarget.abort': ('abort', 'ProgressEvent'),
+  'XMLHttpRequestEventTarget.error': ('error', 'ProgressEvent'),
+  'XMLHttpRequestEventTarget.load': ('load', 'ProgressEvent'),
+  'XMLHttpRequestEventTarget.loadend': ('loadEnd', 'ProgressEvent'),
+  'XMLHttpRequestEventTarget.loadstart': ('loadStart', 'ProgressEvent'),
+  'XMLHttpRequestEventTarget.progress': ('progress', 'ProgressEvent'),
   'XMLHttpRequest.readystatechange': ('readyStateChange', 'ProgressEvent'),
-  'XMLHttpRequestUpload.abort': ('abort', 'ProgressEvent'),
-  'XMLHttpRequestUpload.error': ('error', 'ProgressEvent'),
-  'XMLHttpRequestUpload.load': ('load', 'ProgressEvent'),
-  'XMLHttpRequestUpload.loadend': ('loadEnd', 'ProgressEvent'),
-  'XMLHttpRequestUpload.loadstart': ('loadStart', 'ProgressEvent'),
-  'XMLHttpRequestUpload.progress': ('progress', 'ProgressEvent'),
 })
 
 # These classes require an explicit declaration for the "on" method even though
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 6834f8e0..c989f5e 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -28,7 +28,6 @@
     'Clipboard': 'DataTransfer',
     'Database': 'SqlDatabase', # Avoid conflict with Index DB's Database.
     'DatabaseSync': 'SqlDatabaseSync',
-    'DOMApplicationCache': 'ApplicationCache',
     'DOMFileSystem': 'FileSystem',
     'WebKitPoint': '_DomPoint',
     'Entity': '_Entity', # Not sure if we want to expose this yet, may conflict with other libs.
@@ -159,14 +158,8 @@
 dom_private_html_members = monitored.Set('htmlrenamer.private_html_members', [
   'Document.createElement',
   'Document.createElementNS',
-  'Document.createRange',
-  'Element.getAttribute',
-  'Element.getAttributeNS',
-  'Element.setAttribute',
-  'Element.setAttributeNS',
   'EventTarget.addEventListener',
   'EventTarget.removeEventListener',
-  'Node.childNodes',
 ])
 
 # Members from the standard dom that should not be exposed publicly in dart:html
@@ -218,9 +211,13 @@
   'Element.children',
   'Element.childElementCount',
   'Element.firstElementChild',
+  'Element.getAttribute',
+  'Element.getAttributeNS',
   'Element.getElementsByTagName',
   'Element.scrollIntoView',
   'Element.scrollIntoViewIfNeeded',
+  'Element.setAttribute',
+  'Element.setAttributeNS',
   'Element.removeAttribute',
   'Element.removeAttributeNS',
   'Element.hasAttribute',
@@ -279,6 +276,7 @@
   'MutationEvent.initMutationEvent',
   'MutationObserver.observe',
   'Node.attributes',
+  'Node.childNodes',
   'Node.localName',
   'Node.namespaceURI',
   'Node.removeChild',
@@ -318,8 +316,8 @@
   'UIEvent.pageY',
   'WebGLRenderingContext.texImage2D',
   'WheelEvent.initWebKitWheelEvent',
-  'WheelEvent.wheelDeltaX',
-  'WheelEvent.wheelDeltaY',
+  'WheelEvent.deltaX',
+  'WheelEvent.deltaY',
   'Window.createImageBitmap',
   'Window.getComputedStyle',
   'Window.moveTo',
@@ -395,6 +393,8 @@
   'ImageBitmapFactories.createImageBitmap(ImageData data, long sx, long sy, long sw, long sh)' : 'createImageBitmap9',
   'ImageBitmapFactories.createImageBitmap(ImageBitmap bitmap)' : 'createImageBitmap10',
   'ImageBitmapFactories.createImageBitmap(ImageBitmap bitmap, long sx, long sy, long sw, long sh)' : 'createImageBitmap11',
+  'ImageBitmapFactories.createImageBitmap(Blob blob)' : 'createImageBitmap12',
+  'ImageBitmapFactories.createImageBitmap(Blob blob, long sx, long sy, long sw, long sh)' : 'createImageBitmap13',
   'RTCDataChannel.send(ArrayBuffer data)': 'sendByteBuffer',
   'RTCDataChannel.send(ArrayBufferView data)': 'sendTypedData',
   'RTCDataChannel.send(Blob data)': 'sendBlob',
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 5133ef6..2503ff9 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -397,7 +397,7 @@
     'Crypto':
         "JS('bool', '!!(window.crypto && window.crypto.getRandomValues)')",
     'Database': "JS('bool', '!!(window.openDatabase)')",
-    'DOMApplicationCache': "JS('bool', '!!(window.applicationCache)')",
+    'ApplicationCache': "JS('bool', '!!(window.applicationCache)')",
     'DOMFileSystem': "JS('bool', '!!(window.webkitRequestFileSystem)')",
     'FormData': "JS('bool', '!!(window.FormData)')",
     'HashChangeEvent': "Device.isEventTypeSupported('HashChangeEvent')",
@@ -651,7 +651,7 @@
 
   def AdditionalImplementedInterfaces(self):
     implements = super(Dart2JSBackend, self).AdditionalImplementedInterfaces()
-    if self._interface_type_info.list_item_type():
+    if self._interface_type_info.list_item_type() and self.HasIndexedGetter():
       implements.append('JavaScriptIndexingBehavior')
     return implements
 
@@ -718,6 +718,15 @@
       self._current_secondary_parent = interface
       self._members_emitter.Emit('\n  // From $WHERE\n', WHERE=interface.id)
 
+  def HasIndexedGetter(self):
+    ext_attrs = self._interface.ext_attrs
+    has_indexed_getter = 'CustomIndexedGetter' in ext_attrs
+    for operation in self._interface.operations:
+      if operation.id == 'item' and 'getter' in operation.specials:
+        has_indexed_getter = True
+        break
+    return has_indexed_getter
+
   def AddIndexer(self, element_type):
     """Adds all the methods required to complete implementation of List."""
     # We would like to simply inherit the implementation of everything except
@@ -738,12 +747,7 @@
     #   class YImpl extends ListBase<T> { copies of transitive XImpl methods; }
     #
 
-    ext_attrs = self._interface.ext_attrs
-    has_indexed_getter = 'CustomIndexedGetter' in ext_attrs
-    for operation in self._interface.operations:
-      if operation.id == 'item' and 'getter' in operation.specials:
-        has_indexed_getter = True
-        break
+    has_indexed_getter = self.HasIndexedGetter()
 
     if has_indexed_getter:
       indexed_getter = ('JS("%s", "#[#]", this, index)' %
@@ -763,7 +767,7 @@
           '    return $INDEXED_GETTER;\n'
           '  }',
           INDEXED_GETTER=indexed_getter,
-          TYPE=self.SecureOutputType(element_type))
+          TYPE=self.SecureOutputType(element_type, False, True))
 
     if 'CustomIndexedSetter' in self._interface.ext_attrs:
       self._members_emitter.Emit(
@@ -808,7 +812,7 @@
               '  // final $TYPE $NAME;\n',
               SUPER=super_attribute_interface,
               NAME=html_name,
-              TYPE=self.SecureOutputType(attribute.type.id))
+              TYPE=self.SecureOutputType(attribute.type.id, False, read_only))
           return
       self._members_emitter.Emit('\n  // Shadowing definition.')
       self._AddAttributeUsingProperties(attribute, html_name, read_only)
@@ -821,7 +825,7 @@
       self._AddAttributeUsingProperties(attribute, html_name, read_only)
       return
 
-    output_type = self.SecureOutputType(attribute.type.id)
+    output_type = self.SecureOutputType(attribute.type.id, False, read_only)
     input_type = self._NarrowInputType(attribute.type.id)
     metadata = self._Metadata(attribute.type.id, attribute.id, output_type)
     rename = self._RenamingAnnotation(attribute.id, html_name)
@@ -954,7 +958,7 @@
         METADATA=self._Metadata(info.type_name, info.declared_name,
             self.SecureOutputType(info.type_name)),
         MODIFIERS='static ' if info.IsStatic() else '',
-        TYPE=self.SecureOutputType(info.type_name),
+        TYPE=self.SecureOutputType(info.type_name, False, True),
         NAME=html_name,
         PARAMS=info.ParametersDeclaration(self._NarrowInputType))
 
@@ -1059,7 +1063,7 @@
     self._members_emitter.Emit(
         '\n'
         '  $TYPE $NAME($PARAMS);\n',
-        TYPE=self.SecureOutputType(info.type_name),
+        TYPE=self.SecureOutputType(info.type_name, False, True),
         NAME=info.name,
         PARAMS=info.ParametersDeclaration(self._NarrowInputType))
 
@@ -1157,9 +1161,6 @@
 
     return FindInParent(self._interface) if attr else (None, None)
 
-  def _DartType(self, type_name):
-    return self._type_registry.DartType(type_name)
-
 # ------------------------------------------------------------------------------
 
 class DartLibraryEmitter():
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 8280e8c..d36e0cd 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -37,6 +37,7 @@
   ('DOMWindow', 'btoa'): 'DOMWindowBase64',
   ('DOMWindow', 'clearTimeout'): 'DOMWindowTimers',
   ('DOMWindow', 'clearInterval'): 'DOMWindowTimers',
+  ('DOMWindow', 'createImageBitmap'): 'ImageBitmapFactories',
   ('HTMLInputElement', 'webkitEntries'): 'HTMLInputElementFileSystem',
   ('Navigator', 'doNotTrack'): 'NavigatorDoNotTrack',
   ('Navigator', 'geolocation'): 'NavigatorGeolocation',
@@ -48,6 +49,11 @@
   ('Navigator', 'webkitGetGamepads'): 'NavigatorGamepad',
   ('Navigator', 'requestMIDIAccess'): 'NavigatorWebMIDI',
   ('Navigator', 'vibrate'): 'NavigatorVibration',
+  ('Navigator', 'appName'): 'NavigatorID',
+  ('Navigator', 'appVersion'): 'NavigatorID',
+  ('Navigator', 'platform'): 'NavigatorID',
+  ('Navigator', 'userAgent'): 'NavigatorID',
+  ('Navigator', 'onLine'): 'NavigatorOnLine',
   ('WorkerGlobalScope', 'crypto'): 'WorkerGlobalScopeCrypto',
   ('WorkerGlobalScope', 'indexedDB'): 'WorkerGlobalScopeIndexedDatabase',
   ('WorkerGlobalScope', 'webkitNotifications'): 'WorkerGlobalScopeNotifications',
@@ -64,6 +70,10 @@
   ('WorkerGlobalScope', 'clearInterval'): 'DOMWindowTimers',
   }
 
+_cpp_import_map = {
+  'ImageBitmapFactories' : 'modules/imagebitmap/ImageBitmapFactories'
+}
+
 _cpp_overloaded_callback_map = {
   ('DOMURL', 'createObjectUrlFromSourceCallback'): 'URLMediaSource',
   ('DOMURL', 'createObjectUrlFromStreamCallback'): 'URLMediaStream',
@@ -81,7 +91,11 @@
     for (type, member) in _cpp_callback_map.keys():
       if type not in _cpp_partial_map:
         _cpp_partial_map[type] = set([])
-      _cpp_partial_map[type].add(_cpp_callback_map[(type, member)])
+
+      name_with_path = _cpp_callback_map[(type, member)]
+      if name_with_path in _cpp_import_map:
+        name_with_path = _cpp_import_map[name_with_path]
+      _cpp_partial_map[type].add(name_with_path)
 
     for (type, member) in _cpp_overloaded_callback_map.keys():
       if type not in _cpp_partial_map:
@@ -435,18 +449,18 @@
         TO_DART=to_dart_emitter.Fragments())
 
   def EmitAttribute(self, attribute, html_name, read_only):
-    self._AddGetter(attribute, html_name)
+    self._AddGetter(attribute, html_name, read_only)
     if not read_only:
       self._AddSetter(attribute, html_name)
 
-  def _AddGetter(self, attr, html_name):
+  def _AddGetter(self, attr, html_name, read_only):
     # Temporary hack to force dart:scalarlist clamped array for ImageData.data.
     # TODO(antonm): solve in principled way.
     if self._interface.id == 'ImageData' and html_name == 'data':
       html_name = '_data'
     type_info = self._TypeInfo(attr.type.id)
     dart_declaration = '%s get %s' % (
-        self.SecureOutputType(attr.type.id), html_name)
+        self.SecureOutputType(attr.type.id, False, read_only), html_name)
     is_custom = 'Custom' in attr.ext_attrs or 'CustomGetter' in attr.ext_attrs
     cpp_callback_name = self._GenerateNativeBinding(attr.id, 1,
         dart_declaration, 'Getter', is_custom)
@@ -616,7 +630,7 @@
 
     dart_declaration = '%s%s %s(%s)' % (
         'static ' if info.IsStatic() else '',
-        self.SecureOutputType(info.type_name),
+        self.SecureOutputType(info.type_name, False, True),
         html_name,
         info.ParametersDeclaration(self._DartType))
 
@@ -1081,13 +1095,6 @@
                   lambda s: 'is' + s.group(1).capitalize(),
                   name)
 
-  def _TypeInfo(self, type_name):
-    return self._type_registry.TypeInfo(type_name)
-
-  def _DartType(self, type_name):
-    return self._type_registry.DartType(type_name)
-
-
 class CPPLibraryEmitter():
   def __init__(self, emitters, cpp_sources_dir):
     self._emitters = emitters
diff --git a/tools/dom/src/AttributeMap.dart b/tools/dom/src/AttributeMap.dart
index de088a7..c926d8c 100644
--- a/tools/dom/src/AttributeMap.dart
+++ b/tools/dom/src/AttributeMap.dart
@@ -92,15 +92,15 @@
   }
 
   String operator [](String key) {
-    return _element.$dom_getAttribute(key);
+    return _element._getAttribute(key);
   }
 
   void operator []=(String key, String value) {
-    _element.$dom_setAttribute(key, value);
+    _element._setAttribute(key, value);
   }
 
   String remove(String key) {
-    String value = _element.$dom_getAttribute(key);
+    String value = _element._getAttribute(key);
     _element._removeAttribute(key);
     return value;
   }
@@ -129,11 +129,11 @@
   }
 
   String operator [](String key) {
-    return _element.$dom_getAttributeNS(_namespace, key);
+    return _element._getAttributeNS(_namespace, key);
   }
 
   void operator []=(String key, String value) {
-    _element.$dom_setAttributeNS(_namespace, key, value);
+    _element._setAttributeNS(_namespace, key, value);
   }
 
   String remove(String key) {
diff --git a/tools/dom/src/CrossFrameTypes.dart b/tools/dom/src/CrossFrameTypes.dart
index 7034d24..9353839 100644
--- a/tools/dom/src/CrossFrameTypes.dart
+++ b/tools/dom/src/CrossFrameTypes.dart
@@ -20,7 +20,7 @@
  * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
  * * [Window](http://www.w3.org/TR/Window/) from the W3C.
  */
-abstract class WindowBase {
+abstract class WindowBase implements EventTarget {
   // Fields.
 
   /**
diff --git a/tools/dom/src/Isolates.dart b/tools/dom/src/Isolates.dart
index b6b0fb8..3eb4003 100644
--- a/tools/dom/src/Isolates.dart
+++ b/tools/dom/src/Isolates.dart
@@ -100,7 +100,7 @@
     var source = '$target-result';
     var result = null;
     window.on[source].first.then((Event e) {
-      result = json.parse(_getPortSyncEventData(e));
+      result = JSON.decode(_getPortSyncEventData(e));
     });
     _dispatchEvent(target, [source, message]);
     return result;
@@ -184,7 +184,7 @@
     _callback = callback;
     if (_portSubscription == null) {
       _portSubscription = window.on[_listenerName].listen((Event e) {
-        var data = json.parse(_getPortSyncEventData(e));
+        var data = JSON.decode(_getPortSyncEventData(e));
         var replyTo = data[0];
         var message = _deserialize(data[1]);
         var result = _callback(message);
@@ -215,7 +215,7 @@
 
 void _dispatchEvent(String receiver, var message) {
   var event = new CustomEvent(receiver, canBubble: false, cancelable:false,
-    detail: json.stringify(message));
+    detail: JSON.encode(message));
   window.dispatchEvent(event);
 }
 
diff --git a/tools/dom/src/NodeValidatorBuilder.dart b/tools/dom/src/NodeValidatorBuilder.dart
index c5f0c80..41cab67 100644
--- a/tools/dom/src/NodeValidatorBuilder.dart
+++ b/tools/dom/src/NodeValidatorBuilder.dart
@@ -110,6 +110,21 @@
   }
 
   /**
+   * Allow inline styles on elements.
+   *
+   * If [tagName] is not specified then this allows inline styles on all
+   * elements. Otherwise tagName limits the styles to the specified elements.
+   */
+  void allowInlineStyles({String tagName}) {
+    if (tagName == null) {
+      tagName = '*';
+    } else {
+      tagName = tagName.toUpperCase();
+    }
+    add(new _SimpleNodeValidator(null, allowedAttributes: ['$tagName::style']));
+  }
+
+  /**
    * Allow common safe HTML5 elements and attributes.
    *
    * This list is based off of the Caja whitelists at:
diff --git a/tools/dom/src/Validators.dart b/tools/dom/src/Validators.dart
index 430658e..5154a9d 100644
--- a/tools/dom/src/Validators.dart
+++ b/tools/dom/src/Validators.dart
@@ -165,6 +165,8 @@
         Element element = node;
         var attrs = element.attributes;
         if (!validator.allowsElement(element)) {
+          window.console.warn(
+              'Removing disallowed element <${element.tagName}>');
           element.remove();
           break;
         }
@@ -172,6 +174,8 @@
         var isAttr = attrs['is'];
         if (isAttr != null) {
           if (!validator.allowsAttribute(element, 'is', isAttr)) {
+            window.console.warn('Removing disallowed type extension '
+                '<${element.tagName} is="$isAttr">');
             element.remove();
             break;
           }
@@ -184,6 +188,8 @@
           var name = keys[i];
           if (!validator.allowsAttribute(element, name.toLowerCase(),
               attrs[name])) {
+            window.console.warn('Removing disallowed attribute '
+                '<${element.tagName} $name="${attrs[name]}">');
             attrs.remove(name);
           }
         }
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index 5519ebc..67490a8 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -6,11 +6,30 @@
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:html library.
 
-/// The Dart HTML library.
-///
-/// For examples, see
-/// [Dart HTML5 Samples](https://github.com/dart-lang/dart-html5-samples)
-/// on Github.
+/**
+ * HTML elements and other resources for web-based applications that need to
+ * interact with the browser and the DOM (Document Object Model).
+ *
+ * This library includes DOM element types, CSS styling, local storage,
+ * media, speech, events, and more.
+ * To get started,
+ * check out the [Element] class, the base class for many of the HTML
+ * DOM types.
+ *
+ * ## Other resources
+ *
+ * * If you've never written a web app before, try our
+ * tutorials&mdash;[A Game of Darts](http://dartlang.org/docs/tutorials).
+ * 
+ * * To see some web-based Dart apps in action and to play with the code,
+ * download
+ * [Dart Editor](http://www.dartlang.org/#get-started)
+ * and run its built-in examples.
+ *
+ * * For even more examples, see
+ * [Dart HTML5 Samples](https://github.com/dart-lang/dart-html5-samples)
+ * on Github.
+ */
 library dart.dom.html;
 
 import 'dart:async';
@@ -19,7 +38,7 @@
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:isolate';
-import 'dart:json' as json;
+import "dart:convert";
 import 'dart:math';
 import 'dart:typed_data';
 // Not actually used, but imported since dart:html can generate these objects.
diff --git a/tools/dom/templates/html/dart2js/impl_Console.darttemplate b/tools/dom/templates/html/dart2js/impl_Console.darttemplate
index ceeb155..741c710 100644
--- a/tools/dom/templates/html/dart2js/impl_Console.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_Console.darttemplate
@@ -6,7 +6,9 @@
 
 $(ANNOTATIONS)$(CLASS_MODIFIERS)class Console {
 
-  static Console _safeConsole = new Console();
+  Console._safe() {}
+
+  static Console _safeConsole = new Console._safe();
 
   bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
 
diff --git a/tools/dom/templates/html/dart2js/svg_dart2js.darttemplate b/tools/dom/templates/html/dart2js/svg_dart2js.darttemplate
index 3b8b7eef..5fb394d 100644
--- a/tools/dom/templates/html/dart2js/svg_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/svg_dart2js.darttemplate
@@ -9,7 +9,7 @@
 import 'dart:_collection-dev' hide deprecated;
 import 'dart:html';
 import 'dart:html_common';
-import 'dart:_js_helper' show Creates, Returns, JavaScriptIndexingBehavior, JSName;
+import 'dart:_js_helper' show Creates, Returns, JSName;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor;
 
diff --git a/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate
index 105360e..9c79d0d 100644
--- a/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate
@@ -19,7 +19,7 @@
 import 'dart:_collection-dev' hide deprecated;
 import 'dart:html';
 import 'dart:html_common';
-import 'dart:_js_helper' show convertDartClosureToJS, Creates, JavaScriptIndexingBehavior, JSName;
+import 'dart:_js_helper' show convertDartClosureToJS, Creates, JSName;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor;
 
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index 8aeace0..cde3552 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -5,11 +5,30 @@
 // DO NOT EDIT
 // Auto-generated dart:html library.
 
-/// The Dart HTML library.
-///
-/// For examples, see
-/// [Dart HTML5 Samples](https://github.com/dart-lang/dart-html5-samples)
-/// on Github.
+/**
+ * HTML elements and other resources for web-based applications that need to
+ * interact with the browser and the DOM (Document Object Model).
+ *
+ * This library includes DOM element types, CSS styling, local storage,
+ * media, speech, events, and more.
+ * To get started,
+ * check out the [Element] class, the base class for many of the HTML
+ * DOM types.
+ *
+ * ## Other resources
+ *
+ * * If you've never written a web app before, try our
+ * tutorials&mdash;[A Game of Darts](http://dartlang.org/docs/tutorials).
+ * 
+ * * To see some web-based Dart apps in action and to play with the code,
+ * download
+ * [Dart Editor](http://www.dartlang.org/#get-started)
+ * and run its built-in examples.
+ *
+ * * For even more examples, see
+ * [Dart HTML5 Samples](https://github.com/dart-lang/dart-html5-samples)
+ * on Github.
+ */
 library dart.dom.html;
 
 import 'dart:async';
@@ -18,7 +37,7 @@
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:isolate';
-import 'dart:json' as json;
+import "dart:convert";
 import 'dart:math';
 // TODO(vsm): Remove this when we can do the proper checking in
 // native code for custom elements.
@@ -113,7 +132,7 @@
 _callPortSync(num id, var message) {
   if (!_callPortInitialized) {
     window.on['js-result'].listen((event) {
-      _callPortLastResult = json.parse(_getPortSyncEventData(event));
+      _callPortLastResult = JSON.decode(_getPortSyncEventData(event));
     });
     _callPortInitialized = true;
   }
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 74cc8f7..0bf8034 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -1238,7 +1238,7 @@
     }
     var fragment;
     if (Range.supportsCreateContextualFragment) {
-      var range = _parseDocument.$dom_createRange();
+      var range = _parseDocument.createRange();
       range.selectNodeContents(contextElement);
       fragment = range.createContextualFragment(html);
     } else {
diff --git a/tools/dom/templates/html/impl/impl_HTMLTableElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLTableElement.darttemplate
index 8548c59..c7c3212 100644
--- a/tools/dom/templates/html/impl/impl_HTMLTableElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLTableElement.darttemplate
@@ -37,6 +37,22 @@
 
   @JSName('createTBody')
   TableSectionElement _nativeCreateTBody() native;
+
+  DocumentFragment createFragment(String html,
+      {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+    if (Range.supportsCreateContextualFragment) {
+      return super.createFragment(
+          html, validator: validator, treeSanitizer: treeSanitizer);
+    }
+    // IE9 workaround which does not support innerHTML on Table elements.
+    var contextualHtml = '<table>$html</table>';
+    var table = new Element.html(contextualHtml, validator: validator,
+        treeSanitizer: treeSanitizer);
+    var fragment = new DocumentFragment();
+    fragment.nodes.addAll(table.nodes);
+
+    return fragment;
+  }
 $endif
 
 $!MEMBERS}
diff --git a/tools/dom/templates/html/impl/impl_HTMLTableRowElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLTableRowElement.darttemplate
index 7716e37..d2dbc9e 100644
--- a/tools/dom/templates/html/impl/impl_HTMLTableRowElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLTableRowElement.darttemplate
@@ -17,4 +17,21 @@
 
   TableCellElement insertCell(int index) => _insertCell(index);
 
+$if DART2JS
+  DocumentFragment createFragment(String html,
+      {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+    if (Range.supportsCreateContextualFragment) {
+      return super.createFragment(
+          html, validator: validator, treeSanitizer: treeSanitizer);
+    }
+    // IE9 workaround which does not support innerHTML on Table elements.
+    var fragment = new DocumentFragment();
+    var section = new TableElement().createFragment(
+        html, validator: validator, treeSanitizer: treeSanitizer).nodes.single;
+    var row = section.nodes.single;
+    fragment.nodes.addAll(row.nodes);
+    return fragment;
+  }
+$endif
+
 $!MEMBERS}
diff --git a/tools/dom/templates/html/impl/impl_HTMLTableSectionElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLTableSectionElement.darttemplate
index 5f47932..e15a540 100644
--- a/tools/dom/templates/html/impl/impl_HTMLTableSectionElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLTableSectionElement.darttemplate
@@ -17,4 +17,20 @@
 
   TableRowElement insertRow(int index) => _insertRow(index);
 
+$if DART2JS
+  DocumentFragment createFragment(String html,
+      {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
+    if (Range.supportsCreateContextualFragment) {
+      return super.createFragment(
+          html, validator: validator, treeSanitizer: treeSanitizer);
+    }
+    // IE9 workaround which does not support innerHTML on Table elements.
+    var fragment = new DocumentFragment();
+    var section = new TableElement().createFragment(
+        html, validator: validator, treeSanitizer: treeSanitizer).nodes.single;
+    fragment.nodes.addAll(section.nodes);
+    return fragment;
+  }
+$endif
+
 $!MEMBERS}
diff --git a/tools/dom/templates/html/impl/impl_IDBIndex.darttemplate b/tools/dom/templates/html/impl/impl_IDBIndex.darttemplate
index afba24e..44f866c 100644
--- a/tools/dom/templates/html/impl/impl_IDBIndex.darttemplate
+++ b/tools/dom/templates/html/impl/impl_IDBIndex.darttemplate
@@ -8,12 +8,7 @@
   @DomName('IDBIndex.count')
   Future<int> count([key_OR_range]) {
    try {
-      var request;
-      if (key_OR_range != null) {
-        request = _count(key_OR_range);
-      } else {
-        request = _count();
-      }
+      var request = _count(key_OR_range);
       return _completeRequest(request);
     } catch (e, stacktrace) {
       return new Future.error(e, stacktrace);
@@ -60,12 +55,7 @@
     } else {
       key_OR_range = range;
     }
-    var request;
-    if (direction == null) {
-      request = _openCursor(key_OR_range);
-    } else {
-      request = _openCursor(key_OR_range, direction);
-    }
+    var request = _openCursor(key_OR_range, direction);
     return ObjectStore._cursorStreamFromResult(request, autoAdvance);
   }
 
@@ -87,12 +77,7 @@
     } else {
       key_OR_range = range;
     }
-    var request;
-    if (direction == null) {
-      request = _openKeyCursor(key_OR_range);
-    } else {
-      request = _openKeyCursor(key_OR_range, direction);
-    }
+    var request = _openKeyCursor(key_OR_range, direction);
     return ObjectStore._cursorStreamFromResult(request, autoAdvance);
   }
 
diff --git a/tools/dom/templates/html/impl/impl_IDBObjectStore.darttemplate b/tools/dom/templates/html/impl/impl_IDBObjectStore.darttemplate
index bc55c61..6cf94ba 100644
--- a/tools/dom/templates/html/impl/impl_IDBObjectStore.darttemplate
+++ b/tools/dom/templates/html/impl/impl_IDBObjectStore.darttemplate
@@ -42,12 +42,7 @@
   @DomName('IDBObjectStore.count')
   Future<int> count([key_OR_range]) {
    try {
-      var request;
-      if (key_OR_range != null) {
-        request = _count(key_OR_range);
-      } else {
-        request = _count();
-      }
+      var request = _count(key_OR_range);
       return _completeRequest(request);
     } catch (e, stacktrace) {
       return new Future.error(e, stacktrace);
diff --git a/tools/dom/templates/html/impl/impl_Node.darttemplate b/tools/dom/templates/html/impl/impl_Node.darttemplate
index f48bb03..e544887 100644
--- a/tools/dom/templates/html/impl/impl_Node.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Node.darttemplate
@@ -145,7 +145,7 @@
     _this._replaceChild(value, this[index]);
   }
 
-  Iterator<Node> get iterator => _this.$dom_childNodes.iterator;
+  Iterator<Node> get iterator => _this._childNodes.iterator;
 
   // From List<Node>:
 
@@ -167,15 +167,15 @@
   // -- end List<Node> mixins.
 
   // TODO(jacobr): benchmark whether this is more efficient or whether caching
-  // a local copy of $dom_childNodes is more efficient.
-  int get length => _this.$dom_childNodes.length;
+  // a local copy of _childNodes is more efficient.
+  int get length => _this._childNodes.length;
 
   void set length(int value) {
     throw new UnsupportedError(
         "Cannot set length on immutable List.");
   }
 
-  Node operator[](int index) => _this.$dom_childNodes[index];
+  Node operator[](int index) => _this._childNodes[index];
 }
 
 /** Information about the instantiated template. */
diff --git a/tools/dom/templates/html/impl/impl_Range.darttemplate b/tools/dom/templates/html/impl/impl_Range.darttemplate
index 1f3013a..f152a33 100644
--- a/tools/dom/templates/html/impl/impl_Range.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Range.darttemplate
@@ -7,7 +7,7 @@
 part of $LIBRARYNAME;
 
 $(ANNOTATIONS)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
-  factory $CLASSNAME() => document.$dom_createRange();
+  factory $CLASSNAME() => document.createRange();
 
   factory $CLASSNAME.fromPoint(Point point) =>
       document._caretRangeFromPoint(point.x, point.y);
diff --git a/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate b/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
index a11cb22..9f0600b 100644
--- a/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
@@ -64,9 +64,12 @@
           screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
           metaKey, button, relatedTarget, axis);
     } else {
+      // Chrome does an auto-convert to pixels.
+      deltaY = deltaY ~/ 120;
 $else
-    // Dartium always needs these flipped because we're essentially always
-    // polyfilling (see similar dart2js code as well)
+    // Dartium always needs these flipped because we're using the legacy
+    // _initWebKitWheelEvent instead of the more modern WheelEvent constructor
+    // which isn't yet properly exposed by the Dartium bindings.
     deltaX = -deltaX;
     deltaY = -deltaY;
 $endif
@@ -74,8 +77,7 @@
       event._initMouseEvent(type, canBubble, cancelable, view, detail,
           screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
           metaKey, button, relatedTarget);
-      event._initWebKitWheelEvent(deltaX,
-          deltaY ~/ 120, // Chrome does an auto-convert to pixels.
+      event._initWebKitWheelEvent(deltaX, deltaY,
           view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
           metaKey);
 $if DART2JS
@@ -171,8 +173,6 @@
     return 0;
   }
 
-  num get _deltaY => JS('num', '#.deltaY', this);
-  num get _deltaX => JS('num', '#.deltaX', this);
   num get _wheelDelta => JS('num', '#.wheelDelta', this);
   num get _wheelDeltaX => JS('num', '#.wheelDeltaX', this);
   num get _detail => JS('num', '#.detail', this);
@@ -230,7 +230,7 @@
    * * [WheelEvent.deltaX](http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-WheelEvent-deltaX) from the W3C.
    */
   @DomName('WheelEvent.deltaX')
-  num get deltaX => -_wheelDeltaX;
+  num get deltaX => _deltaX;
 
   /**
    * The amount that is expected to scroll vertically, in units determined by
@@ -241,6 +241,6 @@
    * * [WheelEvent.deltaY](http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-WheelEvent-deltaY) from the W3C.
    */
   @DomName('WheelEvent.deltaY')
-  num get deltaY => -_wheelDeltaY;
+  num get deltaY => _deltaY;
 $endif
 }
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index a4e2195..b797f0b 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -32,7 +32,7 @@
     if (portStr == null) {
       return null;
     }
-    var port = json.parse(portStr);
+    var port = JSON.decode(portStr);
     return _deserialize(port);
   }
 
@@ -44,7 +44,7 @@
   void registerPort(String name, var port) {
     var serialized = _serialize(port);
     document.documentElement.attributes['dart-port:$name'] =
-        json.stringify(serialized);
+        JSON.encode(serialized);
   }
 
   /**
diff --git a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
index aa47fc8..7919df9 100644
--- a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
+++ b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
@@ -250,6 +250,13 @@
       completer.completeError(e);
     }, 1));
 
+    // IE9 RTM - XDomainRequest issued requests may abort if all event handlers
+    // not specified
+    // http://social.msdn.microsoft.com/Forums/ie/en-US/30ef3add-767c-4436-b8a9-f1ca19b4812e/ie9-rtm-xdomainrequest-issued-requests-may-abort-if-all-event-handlers-not-specified
+    JS('', '#.onprogress = {}', xhr);
+    JS('', '#.ontimeout = {}', xhr);
+    JS('', '#.timeout = Number.MAX_VALUE', xhr);
+
     if (sendData != null) {
       JS('', '#.send(#)', xhr, sendData);
     } else {
diff --git a/tools/gyp/configurations_msvs.gypi b/tools/gyp/configurations_msvs.gypi
index f2d067c..dd1d115 100644
--- a/tools/gyp/configurations_msvs.gypi
+++ b/tools/gyp/configurations_msvs.gypi
@@ -29,6 +29,10 @@
             ],
           },
         },
+        # C4351 warns MSVC follows the C++ specification regarding array
+        # initialization in member initializers.  Code that expects the
+        # specified behavior should silence this warning.
+        'msvs_disabled_warnings': [4351],
       },
 
       'Dart_Release': {
@@ -56,6 +60,10 @@
             ],
           },
         },
+        # C4351 warns MSVC follows the C++ specification regarding array
+        # initialization in member initializers.  Code that expects the
+        # specified behavior should silence this warning.
+        'msvs_disabled_warnings': [4351],
       },
     },
     'defines': [
diff --git a/tools/task_kill.py b/tools/task_kill.py
new file mode 100755
index 0000000..b77d789
--- /dev/null
+++ b/tools/task_kill.py
@@ -0,0 +1,172 @@
+#!/usr/bin/env python
+#
+# 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.
+#
+
+# A script to kill hanging processs. The tool will return non-zero if any
+# process was actually found.
+#
+
+import optparse
+import os
+import signal
+import shutil
+import string
+import subprocess
+import sys
+import utils
+
+os_name = utils.GuessOS()
+
+POSIX_INFO = 'ps -p %s -o args'
+
+EXECUTABLE_NAMES = {
+  'win32': { 'chrome': 'chrome.exe', 'dart': 'dart.exe',
+             'iexplore': 'iexplore.exe', 'firefox': 'firefox.exe'},
+  'linux': { 'chrome': 'chrome', 'dart': 'dart',
+             'firefox': 'firefox.exe'},
+  'macos': { 'chrome': 'Chrome', 'dart': 'dart',
+             'firefox': 'firefox', 'safari': 'Safari' }
+}
+
+INFO_COMMAND = {
+  'win32': 'wmic process where Processid=%s get CommandLine',
+  'macos': POSIX_INFO,
+  'linux': POSIX_INFO,
+}
+
+def GetOptions():
+  parser = optparse.OptionParser("usage: %prog [options]")
+  parser.add_option("--kill_dart", default=True,
+                    help="Kill all dart processes")
+  parser.add_option("--kill_browsers", default=False,
+                     help="Kill all browser processes")
+  (options, args) = parser.parse_args()
+  return options
+
+
+def GetPidsPosix(process_name):
+  # This is to have only one posix command, on linux we could just do:
+  # pidof process_name
+  cmd = 'ps -e -o pid=,comm='
+  # Sample output:
+  # 1 /sbin/launchd
+  # 80943 /Applications/Safari.app/Contents/MacOS/Safari
+  p = subprocess.Popen(cmd,
+                       stdout=subprocess.PIPE,
+                       stderr=subprocess.PIPE,
+                       shell=True)
+  output, stderr = p.communicate()
+  results = []
+  lines = output.splitlines()
+  for line in lines:
+    split = line.split()
+    # On mac this ps commands actually gives us the full path to non
+    # system binaries.
+    if len(split) >= 2 and " ".join(split[1:]).endswith(process_name):
+      results.append(split[0])
+  return results
+
+
+def GetPidsWindows(process_name):
+  cmd = 'tasklist /FI "IMAGENAME eq %s" /NH' % process_name
+  # Sample output:
+  # dart.exe    4356 Console            1      6,800 K
+  p = subprocess.Popen(cmd,
+                       stdout=subprocess.PIPE,
+                       stderr=subprocess.PIPE,
+                       shell=True)
+  output, stderr = p.communicate()
+  results = []
+  lines = output.splitlines()
+
+  for line in lines:
+    split = line.split()
+    if len(split) > 2 and split[0] == process_name:
+      results.append(split[1])
+  return results
+
+def GetPids(process_name):
+  if (os_name == "win32"):
+    return GetPidsWindows(process_name)
+  else:
+    return GetPidsPosix(process_name)
+
+def PrintPidInfo(pid):
+  # We asume that the list command will return lines in the format:
+  # EXECUTABLE_PATH ARGS
+  # There may be blank strings in the output
+  p = subprocess.Popen(INFO_COMMAND[os_name] % pid,
+                       stdout=subprocess.PIPE,
+                       stderr=subprocess.PIPE,
+                       shell=True)
+  output, stderr = p.communicate()
+  lines = output.splitlines()
+
+  # Pop the header
+  lines.pop(0)
+  for line in lines:
+    # wmic will output a bunch of empty strings, we ignore these
+    if len(line) >= 1:
+      print("Hanging process info:")
+      print("  PID: %s" % pid)
+      print("  Command line: %s" % line)
+
+
+def KillPosix(pid):
+  try:
+    os.kill(int(pid), signal.SIGKILL);
+  except:
+    # Ignore this, the process is already dead from killing another process.
+    pass
+
+def KillWindows(pid):
+  # os.kill is not available until python 2.7
+  cmd = "taskkill /F /PID %s" % pid
+  p = subprocess.Popen(cmd,
+                       stdout=subprocess.PIPE,
+                       stderr=subprocess.PIPE,
+                       shell=True)
+  p.communicate()
+
+def Kill(name):
+  if (name not in EXECUTABLE_NAMES[os_name]):
+    return 0
+  print("***************** Killing %s *****************" % name)
+  platform_name = EXECUTABLE_NAMES[os_name][name]
+  pids = GetPids(platform_name)
+  for pid in pids:
+    PrintPidInfo(pid);
+    if (os_name == "win32"):
+      KillWindows(pid)
+    else:
+      KillPosix(pid)
+    print("Killed pid: %s" % pid)
+  if (len(pids) == 0):
+    print("  No %s processes found." % name)
+  return len(pids)
+
+def KillBrowsers():
+  status = Kill('firefox')
+  status += Kill('chrome')
+  status += Kill('iexplore')
+  status += Kill('safari')
+  return status
+
+def KillDart():
+  status = Kill("dart")
+  return status
+
+def Main():
+  options = GetOptions()
+  status = 0
+  if (options.kill_dart):
+    status += KillDart();
+  if (options.kill_browsers):
+    status += KillBrowsers()
+  return status
+
+if __name__ == '__main__':
+  sys.exit(Main())
diff --git a/tools/test.dart b/tools/test.dart
index 24da3d2..f84a77c 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -50,7 +50,7 @@
 final TEST_SUITE_DIRECTORIES = [
     new Path('pkg'),
     new Path('runtime/tests/vm'),
-    new Path('samples/tests/samples'),
+    new Path('samples'),
     new Path('tests/benchmark_smoke'),
     new Path('tests/chrome'),
     new Path('tests/compiler/dart2js'),
@@ -154,10 +154,9 @@
       }
     }
 
-    // There should not be more than one InternetExplorerDriver instance
-    // running at a time. For details, see
-    // http://code.google.com/p/selenium/wiki/InternetExplorerDriver.
-    if (conf['runtime'].startsWith('ie') && !conf["use_browser_controller"]) {
+    // If people use selenium they will have issues if we use more than one
+    // ie browser at a time.
+    if (conf['runtime'].startsWith('ie') && !conf['use_browser_controller']) {
       maxBrowserProcesses = 1;
     } else if (conf['runtime'].startsWith('safari') &&
                conf['use_browser_controller']) {
@@ -262,34 +261,14 @@
   var completer = new Completer();
   var environment = Platform.environment;
   if (environment['DART_TESTING_DELETE_TEMPORARY_DIRECTORIES'] == '1') {
-    Directory getTempDir() {
-      // dir will be located in the system temporary directory.
-      var dir = new Directory('').createTempSync();
-      var path = new Path(dir.path).directoryPath;
-      dir.deleteSync();
-      return new Directory(path.toNativePath());
-    }
-
-    // These are the patterns of temporary directory names created by
-    // 'Directory.createTempSync()' on linux/macos and windows.
-    var regExp;
-    if (['macos', 'linux'].contains(Platform.operatingSystem)) {
-      regExp = new RegExp(r'^temp_dir1_......$');
-    } else {
-      regExp = new RegExp(r'tempdir-........-....-....-....-............$');
-    }
-
-    getTempDir().list().listen((directoryEntry) {
-      if (directoryEntry is Directory) {
-        if (regExp.hasMatch(new Path(directoryEntry.path).filename)) {
+    LeftOverTempDirPrinter.getLeftOverTemporaryDirectories().listen(
+        (Directory tempDirectory) {
           try {
-            directoryEntry.deleteSync(recursive: true);
+            tempDirectory.deleteSync(recursive: true);
           } catch (error) {
             DebugLogger.error(error);
           }
-        }
-      }
-    }, onDone: completer.complete);
+        }, onDone: completer.complete);
   } else {
     completer.complete();
   }
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 26569fb..a9992d9 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -535,6 +535,10 @@
   String url;
   int timeout;
   Stopwatch stopwatch;
+
+  // This might be null
+  Duration delayUntilTestStarted;
+
   // We store this here for easy access when tests time out (instead of
   // capturing this in a closure)
   Timer timeoutTimer;
@@ -589,6 +593,7 @@
     testingServer = new BrowserTestingServer(local_ip, useIframe);
     return testingServer.start().then((_) {
       testingServer.testDoneCallBack = handleResults;
+      testingServer.testStartedCallBack = handleStarted;
       testingServer.nextTestCallBack = getNextTest;
       return getBrowsers().then((browsers) {
         var futures = [];
@@ -674,6 +679,7 @@
       testCache[testId] = status.currentTest.url;
       Stopwatch watch = new Stopwatch()..start();
       status.currentTest.doneCallback(output,
+                                      status.currentTest.delayUntilTestStarted,
                                       status.currentTest.stopwatch.elapsed);
       watch.stop();
       status.lastTest = status.currentTest;
@@ -688,6 +694,18 @@
     }
   }
 
+  void handleStarted(String browserId, String output, int testId) {
+    var status = browserStatus[browserId];
+
+    if (status != null && !status.timeout && status.currentTest != null) {
+      status.currentTest.timeoutTimer.cancel();
+      status.currentTest.timeoutTimer =
+          createTimeoutTimer(status.currentTest, status);
+      status.currentTest.delayUntilTestStarted =
+          status.currentTest.stopwatch.elapsed;
+    }
+  }
+
   void handleTimeout(BrowserTestingStatus status) {
     // We simply kill the browser and starts up a new one!
     // We could be smarter here, but it does not seems like it is worth it.
@@ -731,6 +749,7 @@
     });
     status.currentTest.stopwatch.stop();
     status.currentTest.doneCallback("TIMEOUT",
+                                    status.currentTest.delayUntilTestStarted,
                                     status.currentTest.stopwatch.elapsed);
     status.currentTest = null;
   }
@@ -756,13 +775,17 @@
       }
       exit(1);
     }
-    Timer timer = new Timer(new Duration(seconds: test.timeout),
-                            () { handleTimeout(status); });
-    status.currentTest.timeoutTimer = timer;
+
+    status.currentTest.timeoutTimer = createTimeoutTimer(test, status);
     status.currentTest.stopwatch = new Stopwatch()..start();
     return test;
   }
 
+  Timer createTimeoutTimer(BrowserTest test, BrowserTestingStatus status) {
+    return new Timer(
+        new Duration(seconds: test.timeout), () { handleTimeout(status); });
+  }
+
   void queueTest(BrowserTest test) {
     testQueue.add(test);
   }
@@ -819,6 +842,7 @@
   static const String driverPath = "/driver";
   static const String nextTestPath = "/next_test";
   static const String reportPath = "/report";
+  static const String startedPath = "/started";
   static const String waitSignal = "WAIT";
   static const String terminateSignal = "TERMINATE";
 
@@ -829,6 +853,7 @@
   bool useIframe = false;
 
   Function testDoneCallBack;
+  Function testStartedCallBack;
   Function nextTestCallBack;
 
   BrowserTestingServer(this.local_ip, this.useIframe);
@@ -850,6 +875,13 @@
           // the closing of the streams.
           return;
         }
+        if (request.uri.path.startsWith(startedPath)) {
+          var browserId = request.uri.path.substring(startedPath.length + 1);
+          var testId =
+              int.parse(request.uri.queryParameters["id"].split("=")[1]);
+          handleStarted(request, browserId, testId);
+          return;
+        }
         var textResponse = "";
         if (request.uri.path.startsWith(driverPath)) {
           var browserId = request.uri.path.substring(driverPath.length + 1);
@@ -907,11 +939,26 @@
     StringBuffer buffer = new StringBuffer();
     request.transform(UTF8.decoder).listen((data) {
       buffer.write(data);
-      }, onDone: () {
-        String back = buffer.toString();
-        request.response.close();
-        testDoneCallBack(browserId, back, testId);
-      }, onError: (error) { print(error); });
+    }, onDone: () {
+      String back = buffer.toString();
+      request.response.close();
+      testDoneCallBack(browserId, back, testId);
+      // TODO(ricow): We should do something smart if we get an error here.
+    }, onError: (error) { DebugLogger.error("$error"); });
+  }
+
+  void handleStarted(HttpRequest request, String browserId, var testId) {
+    StringBuffer buffer = new StringBuffer();
+    // If an error occurs while receiving the data from the request stream,
+    // we don't handle it specially. We can safely ignore it, since the started
+    // events are not crucial.
+    request.transform(UTF8.decoder).listen((data) {
+      buffer.write(data);
+    }, onDone: () {
+      String back = buffer.toString();
+      request.response.close();
+      testStartedCallBack(browserId, back, testId);
+    }, onError: (error) { DebugLogger.error("$error"); });
   }
 
   String getNextTest(String browserId) {
@@ -983,13 +1030,26 @@
         }
       }
 
+      function contactBrowserController(method,
+                                        path,
+                                        callback,
+                                        msg,
+                                        isUrlEncoded) {
+        var client = new XMLHttpRequest();
+        client.onreadystatechange = callback;
+        client.open(method, path);
+        if (isUrlEncoded) {
+          client.setRequestHeader('Content-type',
+                                  'application/x-www-form-urlencoded');
+        }
+        client.send(msg);
+      }
+
       function getNextTask() {
         // Until we have the next task we set the current_id to a specific
         // negative value.
-        var client = new XMLHttpRequest();
-        client.onreadystatechange = newTaskHandler;
-        client.open('GET', '$nextTestPath/$browserId');
-        client.send();
+        contactBrowserController(
+            'GET', '$nextTestPath/$browserId', newTaskHandler, "", false); 
       }
 
       function run(url) {
@@ -1015,24 +1075,23 @@
       }
 
       function reportError(msg) {
-        var client = new XMLHttpRequest();
         function handleReady() {
           if (this.readyState == this.DONE && this.status != 200) {
             // We could not report, pop up to notify if running interactively.
             alert(this.status);
           }
         }
-        client.onreadystatechange = handleReady;
-        client.open('POST', '$errorReportingUrl?test=1');
-        client.setRequestHeader('Content-type',
-                                'application/x-www-form-urlencoded');
-        client.send(msg);
+        contactBrowserController(
+            'POST', '$errorReportingUrl?test=1', handleReady, msg, true); 
       }
 
       function reportMessage(msg) {
         if (msg == 'STARTING') {
           test_completed = false;
           current_id = next_id;
+          contactBrowserController(
+            'POST', '$startedPath/${browserId}?id=' + current_id,
+            function () {}, msg, true);
           return;
         }
 
@@ -1050,12 +1109,9 @@
             }
           }
         }
-        var client = new XMLHttpRequest();
-        client.onreadystatechange = handleReady;
-        client.open('POST', '$reportPath/${browserId}?id=' + current_id);
-        client.setRequestHeader('Content-type',
-                                'application/x-www-form-urlencoded');
-        client.send(msg);
+        contactBrowserController(
+            'POST', '$reportPath/${browserId}?id=' + current_id, handleReady,
+            msg, true);
       }
 
       function messageHandler(e) {
diff --git a/tools/testing/dart/multitest.dart b/tools/testing/dart/multitest.dart
index fc85e79..b942437 100644
--- a/tools/testing/dart/multitest.dart
+++ b/tools/testing/dart/multitest.dart
@@ -238,7 +238,9 @@
              hasRuntimeErrors,
              isNegativeIfChecked: isNegativeIfChecked,
              hasFatalTypeErrors: enableFatalTypeErrors,
-             multitestOutcome: outcome);
+             multitestOutcome: outcome,
+             multitestKey: key,
+             originTestPath: filePath);
     }
 
     return null;
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index fb1b11f..dc0f5ff 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -601,9 +601,8 @@
           suite = pattern.substring(0, slashLocation);
           pattern = pattern.substring(slashLocation + 1);
           pattern = pattern.replaceAll('*', '.*');
-          pattern = pattern.replaceAll('/', '.*');
         } else {
-          pattern = ".*";
+          pattern = ".?";
         }
         if (selectorMap.containsKey(suite)) {
           print("Error: '$suite/$pattern'.  Only one test selection"
diff --git a/tools/testing/dart/test_progress.dart b/tools/testing/dart/test_progress.dart
index 104f88c..abba2c9 100644
--- a/tools/testing/dart/test_progress.dart
+++ b/tools/testing/dart/test_progress.dart
@@ -4,6 +4,7 @@
 
 library test_progress;
 
+import "dart:async";
 import "dart:io";
 import "dart:io" as io;
 import "http_server.dart" as http_server;
@@ -327,30 +328,47 @@
 class LeftOverTempDirPrinter extends EventListener {
   final MIN_NUMBER_OF_TEMP_DIRS = 50;
 
-  Path _tempDir() {
+  static Directory _getTemporaryDirectory() {
     // Dir will be located in the system temporary directory.
     var dir = new Directory('').createTempSync();
     var path = new Path(dir.path).directoryPath;
     dir.deleteSync();
-    return path;
+    return new Directory(path.toNativePath());
+  }
+
+  static RegExp _getTemporaryDirectoryRegexp() {
+    // These are the patterns of temporary directory names created by
+    // 'Directory.createTempSync()' on linux/macos and windows.
+    if (['macos', 'linux'].contains(Platform.operatingSystem)) {
+      return new RegExp(r'^temp_dir1_......$');
+    } else {
+      return new RegExp(r'tempdir-........-....-....-....-............$');
+    }
+  }
+
+  static Stream<Directory> getLeftOverTemporaryDirectories() {
+    var regExp = _getTemporaryDirectoryRegexp();
+    return _getTemporaryDirectory().list().where(
+        (FileSystemEntity fse) {
+          if (fse is Directory) {
+            if (regExp.hasMatch(new Path(fse.path).filename)) {
+              return true;
+            }
+          }
+          return false;
+        });
   }
 
   void allDone() {
-    var count = 0;
-    var systemTempDir = _tempDir();
-    var lister = new Directory(systemTempDir.toNativePath()).list().listen(
-        (FileSystemEntity fse) {
-          if (fse is Directory) count++;
-        },
-        onError: (error) {
-          DebugLogger.warning("Could not list temp directories, got: $error");
-        },
-        onDone: () {
-          if (count > MIN_NUMBER_OF_TEMP_DIRS) {
-            DebugLogger.warning("There are ${count} directories "
-                                "in the system tempdir ('$systemTempDir')! "
-                                "Maybe left over directories?\n");
+    getLeftOverTemporaryDirectories().length.then((int count) {
+      if (count > MIN_NUMBER_OF_TEMP_DIRS) {
+        DebugLogger.warning("There are ${count} directories "
+                            "in the system tempdir "
+                            "('${_getTemporaryDirectory().path}')! "
+                            "Maybe left over directories?\n");
       }
+    }).catchError((error) {
+      DebugLogger.warning("Could not list temp directories, got: $error");
     });
   }
 }
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index d7bda75..8058f04 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -1823,12 +1823,24 @@
       BrowserTestCommand browserCommand, int timeout) {
     var completer = new Completer<CommandOutput>();
 
-    var callback = (var output, var duration) {
+    var callback = (output, delayUntilTestStarted, duration) {
+      bool timedOut = output == "TIMEOUT";
+      String stderr = "";
+      if (timedOut) {
+        if (delayUntilTestStarted != null) {
+          stderr = "This test timed out. The delay until the test was actually "
+                   "started was: $delayUntilTestStarted.";
+        } else {
+          stderr = "This test has not notified test.py that it started running."
+                   " This could be a bug in test.py! "
+                   "Please contact ricow/kustermann";
+        }
+      }
       var commandOutput = createCommandOutput(browserCommand,
                           0,
-                          output == "TIMEOUT",
+                          timedOut,
                           encodeUtf8(output),
-                          [],
+                          encodeUtf8(stderr),
                           duration,
                           false);
       completer.complete(commandOutput);
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index dc7289f..aeb782b 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -38,7 +38,9 @@
                         bool hasRuntimeError,
                         {bool isNegativeIfChecked,
                          bool hasFatalTypeErrors,
-                         Set<String> multitestOutcome});
+                         Set<String> multitestOutcome,
+                         String multitestKey,
+                         Path originTestPath});
 
 typedef void VoidFunction();
 
@@ -251,6 +253,77 @@
    * to be listed each time.
    */
   void forEachTest(TestCaseEvent onTest, Map testCache, [VoidFunction onDone]);
+
+
+  // This function is set by subclasses before enqueueing starts.
+  Function doTest;
+
+  // This function will be called for every TestCase of this test suite.
+  // It will
+  //  - handle sharding
+  //  - update SummaryReport
+  //  - handle SKIP/SKIP_BY_DESIGN markers
+  //  - test if the selector matches
+  // and will enqueue the test (if necessary).
+  void enqueueNewTestCase(TestCase testCase) {
+    var expectations = testCase.expectedOutcomes;
+
+    // Handle sharding based on the original test path (i.e. all multitests
+    // of a given original test belong to the same shard)
+    int shards = configuration['shards'];
+    if (shards > 1) {
+      int shard = configuration['shard'];
+      var testPath =
+          testCase.info.originTestPath.relativeTo(TestUtils.dartDir());
+      if ("$testPath".hashCode % shards != shard - 1) {
+        return;
+      }
+    }
+    // Test if the selector includes this test.
+    RegExp pattern = configuration['selectors'][suiteName];
+    if (!pattern.hasMatch(testCase.displayName)) {
+      return;
+    }
+
+    // Update Summary report
+    if (configuration['report']) {
+      SummaryReport.add(expectations);
+      if (testCase.info != null &&
+          testCase.info.hasCompileError &&
+          TestUtils.isBrowserRuntime(configuration['runtime']) &&
+          configuration['compiler'] != 'none') {
+        SummaryReport.addCompileErrorSkipTest();
+        return;
+      }
+    }
+
+    // Handle skipped tests
+    if (expectations.contains(SKIP) ||
+        expectations.contains(SKIP_BY_DESIGN)) {
+      return;
+    }
+
+    doTest(testCase);
+  }
+
+  String buildTestCaseDisplayName(Path suiteDir,
+                                  Path originTestPath,
+                                  {String multitestName: ""}) {
+    Path testNamePath = originTestPath.relativeTo(suiteDir);
+    var directory = testNamePath.directoryPath;
+    var filenameWithoutExt = testNamePath.filenameWithoutExtension;
+
+    String concat(String base, String part) {
+      if (base == "") return part;
+      if (part == "") return base;
+      return "$base/$part";
+    }
+
+    var testName = "$directory";
+    testName = concat(testName, "$filenameWithoutExt");
+    testName = concat(testName, multitestName);
+    return testName;
+  }
 }
 
 
@@ -311,7 +384,6 @@
   String hostRunnerPath;
   final String dartDir;
   List<String> statusFilePaths;
-  Function doTest;
   VoidFunction doDone;
   ReceivePort receiveTestName;
   TestExpectations testExpectations;
@@ -345,28 +417,17 @@
     } else {
       // Only run the tests that match the pattern. Use the name
       // "suiteName/testName" for cc tests.
-      RegExp pattern = configuration['selectors'][suiteName];
       String constructedName = '$suiteName/$testPrefix$testName';
-      if (!pattern.hasMatch(constructedName)) return;
 
       var expectations = testExpectations.expectations(
           '$testPrefix$testName');
 
-      if (configuration["report"]) {
-        SummaryReport.add(expectations);
-      }
-
-      if (expectations.contains(SKIP) ||
-          expectations.contains(SKIP_BY_DESIGN)) {
-        return;
-      }
-
       var args = TestUtils.standardOptions(configuration);
       args.add(testName);
 
       var command = CommandBuilder.instance.getCommand(
           'run_vm_unittest', targetRunnerPath, args, configurationDir);
-      doTest(
+      enqueueNewTestCase(
           new TestCase(constructedName,
                        [command],
                        configuration,
@@ -401,6 +462,7 @@
 
 
 class TestInformation {
+  Path originTestPath;
   Path filePath;
   Map optionsFromFile;
   bool hasCompileError;
@@ -408,12 +470,15 @@
   bool isNegativeIfChecked;
   bool hasFatalTypeErrors;
   Set<String> multitestOutcome;
+  String multitestKey;
 
   TestInformation(this.filePath, this.optionsFromFile,
                   this.hasCompileError, this.hasRuntimeError,
                   this.isNegativeIfChecked, this.hasFatalTypeErrors,
-                  this.multitestOutcome) {
+                  this.multitestOutcome,
+                  {this.multitestKey, this.originTestPath}) {
     assert(filePath.isAbsolute);
+    if (originTestPath == null) originTestPath = filePath;
   }
 }
 
@@ -424,7 +489,6 @@
 class StandardTestSuite extends TestSuite {
   final Path suiteDir;
   final List<String> statusFilePaths;
-  Function doTest;
   TestExpectations testExpectations;
   List<TestInformation> cachedTests;
   final Path dartDir;
@@ -619,11 +683,10 @@
     Path filePath = new Path(filename);
 
     // Only run the tests that match the pattern.
-    RegExp pattern = configuration['selectors'][suiteName];
     if (filePath.filename.endsWith('test_config.dart')) return;
 
     var optionsFromFile = readOptionsFromFile(filePath);
-    CreateTest createTestCase = makeTestCaseCreator(pattern, optionsFromFile);
+    CreateTest createTestCase = makeTestCaseCreator(optionsFromFile);
 
     if (optionsFromFile['isMultitest']) {
       group.add(doMultitest(filePath, buildDir, suiteDir, createTestCase));
@@ -638,55 +701,10 @@
     var filePath = info.filePath;
     var optionsFromFile = info.optionsFromFile;
 
-    // Look up expectations in status files using a test name generated
-    // from the test file's path.
-    String testName;
-
-    if (optionsFromFile['isMultitest']) {
-      // Multitests are in [build directory]/generated_tests/... .
-      // The test name will be '[test filename (no extension)]/[multitest key].
-      String name = filePath.filenameWithoutExtension;
-      int middle = name.lastIndexOf('_');
-      testName = '${name.substring(0, middle)}/${name.substring(middle + 1)}';
-    } else {
-      // The test name is the relative path from the test suite directory to
-      // the test, with the .dart extension removed.
-      assert(filePath.toNativePath().startsWith(
-                    suiteDir.toNativePath()));
-      var testNamePath = filePath.relativeTo(suiteDir);
-      assert(testNamePath.extension == 'dart');
-      if (testNamePath.extension == 'dart') {
-        testName = testNamePath.directoryPath.append(
-            testNamePath.filenameWithoutExtension).toString();
-      }
-    }
-    int shards = configuration['shards'];
-    if (shards > 1) {
-      int shard = configuration['shard'];
-      if (testName.hashCode % shards != shard - 1) {
-        return;
-      }
-    }
+    String testName = buildTestCaseDisplayName(suiteDir, info.originTestPath,
+        multitestName: optionsFromFile['isMultitest'] ? info.multitestKey : "");
 
     Set<String> expectations = testExpectations.expectations(testName);
-    if (info.hasCompileError &&
-        TestUtils.isBrowserRuntime(configuration['runtime']) &&
-        configuration['report'] &&
-        configuration['compiler'] != 'none') {
-      SummaryReport.addCompileErrorSkipTest();
-      return;
-    }
-    if (configuration['report']) {
-      // Tests with multiple VMOptions are counted more than once.
-      for (var dummy in getVmOptions(optionsFromFile)) {
-        SummaryReport.add(expectations);
-      }
-    }
-    if (expectations.contains(SKIP) ||
-        expectations.contains(SKIP_BY_DESIGN)) {
-      return;
-    }
-
     if (configuration['compiler'] != 'none' && info.hasCompileError) {
       // If a compile-time error is expected, and we're testing a
       // compiler, we never need to attempt to run the program (in a
@@ -729,12 +747,13 @@
         allVmOptions = new List.from(vmOptions)..addAll(extraVmOptions);
       }
 
-      doTest(new TestCase('$suiteName/$testName',
-                          makeCommands(info, allVmOptions, commonArguments),
-                          configuration,
-                          expectations,
-                          isNegative: isNegative(info),
-                          info: info));
+      enqueueNewTestCase(
+          new TestCase('$suiteName/$testName',
+                       makeCommands(info, allVmOptions, commonArguments),
+                       configuration,
+                       expectations,
+                       isNegative: isNegative(info),
+                       info: info));
     }
   }
 
@@ -822,25 +841,27 @@
     }
   }
 
-  CreateTest makeTestCaseCreator(RegExp pattern, Map optionsFromFile) {
+  CreateTest makeTestCaseCreator(Map optionsFromFile) {
     return (Path filePath,
             bool hasCompileError,
             bool hasRuntimeError,
             {bool isNegativeIfChecked: false,
              bool hasFatalTypeErrors: false,
-             Set<String> multitestOutcome: null}) {
-      if (pattern.hasMatch('$filePath')) {
-        // Cache the test information for each test case.
-        var info = new TestInformation(filePath,
-                                       optionsFromFile,
-                                       hasCompileError,
-                                       hasRuntimeError,
-                                       isNegativeIfChecked,
-                                       hasFatalTypeErrors,
-                                       multitestOutcome);
-        cachedTests.add(info);
-        enqueueTestCaseFromTestInformation(info);
-      }
+             Set<String> multitestOutcome: null,
+             String multitestKey,
+             Path originTestPath}) {
+      // Cache the test information for each test case.
+      var info = new TestInformation(filePath,
+                                     optionsFromFile,
+                                     hasCompileError,
+                                     hasRuntimeError,
+                                     isNegativeIfChecked,
+                                     hasFatalTypeErrors,
+                                     multitestOutcome,
+                                     multitestKey: multitestKey,
+                                     originTestPath: originTestPath);
+      cachedTests.add(info);
+      enqueueTestCaseFromTestInformation(info);
     };
   }
 
@@ -965,21 +986,29 @@
       String content = null;
       Path dir = filePath.directoryPath;
       String nameNoExt = filePath.filenameWithoutExtension;
+
       Path pngPath = dir.append('$nameNoExt.png');
       Path txtPath = dir.append('$nameNoExt.txt');
+      Path customHtmlPath = dir.append('$nameNoExt.html');
       Path expectedOutput = null;
-      if (new File(pngPath.toNativePath()).existsSync()) {
-        expectedOutput = pngPath;
-        content = getHtmlLayoutContents(scriptType, new Path("$scriptPath"));
-      } else if (new File(txtPath.toNativePath()).existsSync()) {
-        expectedOutput = txtPath;
-        content = getHtmlLayoutContents(scriptType, new Path("$scriptPath"));
+
+      if (new File(customHtmlPath.toNativePath()).existsSync()) {
+        // Use existing HTML document if available.
+        htmlPath = customHtmlPath.toNativePath();
       } else {
-        content = getHtmlContents(filename, scriptType,
-            new Path("$scriptPath"));
+        if (new File(pngPath.toNativePath()).existsSync()) {
+          expectedOutput = pngPath;
+          content = getHtmlLayoutContents(scriptType, new Path("$scriptPath"));
+        } else if (new File(txtPath.toNativePath()).existsSync()) {
+          expectedOutput = txtPath;
+          content = getHtmlLayoutContents(scriptType, new Path("$scriptPath"));
+        } else {
+          content = getHtmlContents(filename, scriptType,
+              new Path("$scriptPath"));
+        }
+        htmlTest.writeStringSync(content);
+        htmlTest.closeSync();
       }
-      htmlTest.writeStringSync(content);
-      htmlTest.closeSync();
 
       // Construct the command(s) that compile all the inputs needed by the
       // browser test. For running Dart in DRT, this will be noop commands.
@@ -1094,7 +1123,7 @@
               info, isNegative(info), fullHtmlPath);
         }
 
-        doTest(testCase);
+        enqueueNewTestCase(testCase);
         subtestIndex++;
       } while(subtestIndex < subtestNames.length);
     }
@@ -1570,7 +1599,6 @@
   final String dartDir;
   String classPath;
   List<String> testClasses;
-  TestCaseEvent doTest;
   VoidFunction doDone;
   TestExpectations testExpectations;
 
@@ -1651,10 +1679,10 @@
     updatedConfiguration['timeout'] *= 3;
     var command = CommandBuilder.instance.getCommand(
         'junit_test', 'java', args, configurationDir);
-    doTest(new TestCase(suiteName,
-                        [command],
-                        updatedConfiguration,
-                        new Set<String>.from([PASS])));
+    enqueueNewTestCase(new TestCase(suiteName,
+                                   [command],
+                                   updatedConfiguration,
+                                   new Set<String>.from([PASS])));
     doDone();
   }
 
diff --git a/utils/apidoc/apidoc.dart b/utils/apidoc/apidoc.dart
index 9bb299c..fe4e617 100644
--- a/utils/apidoc/apidoc.dart
+++ b/utils/apidoc/apidoc.dart
@@ -15,8 +15,8 @@
 library apidoc;
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 
 import 'html_diff.dart';
 
@@ -112,7 +112,7 @@
 
   print('Parsing MDN data...');
   final mdnFile = new File(path.join(scriptDir, 'mdn', 'database.json'));
-  final mdn = json.parse(mdnFile.readAsStringSync());
+  final mdn = JSON.decode(mdnFile.readAsStringSync());
 
   print('Cross-referencing dart:html...');
   // TODO(amouravski): move HtmlDiff inside of the future chain below to re-use
@@ -163,14 +163,14 @@
       var libPath = '../../$lib';
       if (new File(libPath).existsSync()) {
         apidocLibraries.add(path.toUri(libPath));
-        var libName = libPath.replaceAll('.dart', '');
+        var libName = path.basename(libPath).replaceAll('.dart', '');
         includedLibraries.add(libName);
       }
     }
 
     final apidoc = new Apidoc(mdn, outputDir, mode, generateAppCache,
                               excludedLibraries, version);
-    apidoc.dartdocPath = 
+    apidoc.dartdocPath =
         path.join(scriptDir, '..', '..', 'sdk', 'lib', '_internal', 'dartdoc');
     // Select the libraries to include in the produced documentation:
     apidoc.includeApi = true;
diff --git a/utils/apidoc/mdn/extract.dart b/utils/apidoc/mdn/extract.dart
index 2e2d766..210e84c 100644
--- a/utils/apidoc/mdn/extract.dart
+++ b/utils/apidoc/mdn/extract.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "dart:collection";
+import 'dart:convert';
 import 'dart:html';
-import 'dart:json' as json;
 
 // Workaround for HTML lib missing feature.
 Range newRange() {
@@ -346,8 +346,8 @@
 
 void onEnd() {
   // Hideous hack to send JSON back to JS.
-  String dbJson = json.stringify(dbEntry);
-  // workaround bug in json.parse.
+  String dbJson = JSON.encode(dbEntry);
+  // workaround bug in JSON.decode.
   dbJson = dbJson.replaceAll("ZDARTIUMDOESNTESCAPESLASHNJXXXX", "\\n");
 
   // Use postMessage to end the JSON to JavaScript. TODO(jacobr): use a simple
@@ -1314,7 +1314,7 @@
 void documentLoaded(event) {
   // Load the database of expected methods and properties with an HttpRequest.
   new HttpRequest.get('${window.location}.json', (req) {
-    data = json.parse(req.responseText);
+    data = JSON.decode(req.responseText);
     dbEntry = {'members': [], 'srcUrl': pageUrl};
     run();
   });
diff --git a/utils/apidoc/mdn/postProcess.dart b/utils/apidoc/mdn/postProcess.dart
index 801e7d1..ee61723 100644
--- a/utils/apidoc/mdn/postProcess.dart
+++ b/utils/apidoc/mdn/postProcess.dart
@@ -6,13 +6,13 @@
 
 library postProcess;
 
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 import 'util.dart';
 
 void main() {
   // Database of code documentation.
-  Map<String, List> database = json.parse(
+  Map<String, List> database = JSON.decode(
       new File('output/database.json').readAsStringSync());
   final filteredDb = {};
   final obsolete = [];
@@ -33,6 +33,6 @@
       }
     }
   }
-  writeFileSync("output/database.filtered.json", json.stringify(filteredDb));
-  writeFileSync("output/obsolete.json", json.stringify(obsolete));
+  writeFileSync("output/database.filtered.json", JSON.encode(filteredDb));
+  writeFileSync("output/obsolete.json", JSON.encode(obsolete));
 }
diff --git a/utils/apidoc/mdn/prettyPrint.dart b/utils/apidoc/mdn/prettyPrint.dart
index 0071279..3e5c12a 100644
--- a/utils/apidoc/mdn/prettyPrint.dart
+++ b/utils/apidoc/mdn/prettyPrint.dart
@@ -4,8 +4,8 @@
 
 library prettyPrint;
 
+import 'dart:convert';
 import 'dart:io';
-import 'dart:json' as json;
 import 'util.dart';
 
 String orEmpty(String str) {
@@ -51,7 +51,7 @@
 
 void main() {
   // Database of code documentation.
-  final Map<String, Map> database = json.parse(
+  final Map<String, Map> database = JSON.decode(
       new File('output/database.filtered.json').readAsStringSync());
 
   // Types we have documentation for.
diff --git a/utils/apidoc/mdn/util.dart b/utils/apidoc/mdn/util.dart
index b338988..e5907bd 100644
--- a/utils/apidoc/mdn/util.dart
+++ b/utils/apidoc/mdn/util.dart
@@ -1,7 +1,6 @@
 library util;
 
 import 'dart:io';
-import 'dart:json' as json;
 
 Map<String, Map> _allProps;
 
