diff --git a/compiler/javatests/com/google/dart/compiler/resolver/ClassImplementsUnknownInterfaceNegativeTest.dart b/compiler/javatests/com/google/dart/compiler/resolver/ClassImplementsUnknownInterfaceNegativeTest.dart
deleted file mode 100644
index 94ed0c8..0000000
--- a/compiler/javatests/com/google/dart/compiler/resolver/ClassImplementsUnknownInterfaceNegativeTest.dart
+++ /dev/null
@@ -1,10 +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.
-
-// Expect error - Base is not an interface.
-
-interface I {
-}
-
-interface I extends UNKNOWN;
diff --git a/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java b/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java
index 5e171c6..d924a04 100644
--- a/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java
+++ b/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java
@@ -256,10 +256,6 @@
         "}"));
   }
 
-  public void tesClassImplementsUnknownInterfaceNegativeTest() {
-    checkNumErrors("ClassImplementsUnknownInterfaceNegativeTest.dart", 1);
-  }
-
   public void testConstSuperNegativeTest1() {
     checkNumErrors("ConstSuperNegativeTest1.dart", 0);
   }
@@ -355,7 +351,7 @@
         "set bar(x) {}",
         "get bar {}"));
   }
-  
+
   public void test_nameShadow_topLevel_setter_variable() {
     checkSourceErrors(
         makeCode(
@@ -1034,7 +1030,7 @@
     Type boundType = typeParameter.getBound().getType();
     assertEquals("A", boundType.getElement().getName());
   }
-  
+
   /**
    * <p>
    * http://code.google.com/p/dart/issues/detail?id=3986
@@ -1163,7 +1159,7 @@
             ""),
         errEx(ResolverErrorCode.ILLEGAL_FIELD_ACCESS_FROM_STATIC, 4, 22, 1));
   }
-  
+
   /**
    * <p>
    * http://code.google.com/p/dart/issues/detail?id=6489
diff --git a/pkg/analyzer_experimental/bin/analyzer.dart b/pkg/analyzer_experimental/bin/analyzer.dart
index c9b83c8..805e960 100644
--- a/pkg/analyzer_experimental/bin/analyzer.dart
+++ b/pkg/analyzer_experimental/bin/analyzer.dart
@@ -42,32 +42,30 @@
     stdout.writeln("Analyzing ${options.sourceFiles}...");
   }
   ErrorSeverity allResult = ErrorSeverity.NONE;
-  for (String sourcePath in options.sourceFiles) {
-    sourcePath = sourcePath.trim();
-    // check that file exists
-    if (!new File(sourcePath).existsSync()) {
-      print('File not found: $sourcePath');
-      return ErrorSeverity.ERROR;
-    }
-    // check that file is Dart file
-    if (!AnalysisEngine.isDartFileName(sourcePath)) {
-      print('$sourcePath is not a Dart file');
-      return ErrorSeverity.ERROR;
-    }
-    // do analyze
-    ErrorFormatter formatter = new ErrorFormatter(options.machineFormat ? stderr : stdout, options);
-    AnalyzerImpl analyzer = new AnalyzerImpl(options);
-    analyzer.analyze(sourcePath);
-    // pring errors
-    formatter.formatErrors(analyzer.errorInfos);
-    // prepare status
-    ErrorSeverity status = analyzer.maxErrorSeverity;
-    if (status == ErrorSeverity.WARNING && options.warningsAreFatal) {
-      status = ErrorSeverity.ERROR;
-    }
-    allResult = allResult.max(status);
+  String sourcePath = options.sourceFiles[0];
+  sourcePath = sourcePath.trim();
+  // check that file exists
+  if (!new File(sourcePath).existsSync()) {
+    print('File not found: $sourcePath');
+    return ErrorSeverity.ERROR;
   }
-  return allResult;
+  // check that file is Dart file
+  if (!AnalysisEngine.isDartFileName(sourcePath)) {
+    print('$sourcePath is not a Dart file');
+    return ErrorSeverity.ERROR;
+  }
+  // do analyze
+  ErrorFormatter formatter = new ErrorFormatter(options.machineFormat ? stderr : stdout, options);
+  AnalyzerImpl analyzer = new AnalyzerImpl(options);
+  analyzer.analyze(sourcePath);
+  // print errors
+  formatter.formatErrors(analyzer.errorInfos);
+  // prepare status
+  ErrorSeverity status = analyzer.maxErrorSeverity;
+  if (status == ErrorSeverity.WARNING && options.warningsAreFatal) {
+    status = ErrorSeverity.ERROR;
+  }
+  return status;
 }
 
 typedef ErrorSeverity BatchRunnerHandler(List<String> args);
@@ -92,7 +90,8 @@
     var subscription = cmdLine.listen((String line) {
       // may be finish
       if (line.isEmpty) {
-        stdout.writeln('>>> BATCH END (${totalTests - testsFailed}/$totalTests) ${stopwatch.elapsedMilliseconds}ms');
+        var time = stopwatch.elapsedMilliseconds;
+        stdout.writeln('>>> BATCH END (${totalTests - testsFailed}/$totalTests) ${time}ms');
         exit(batchResult.ordinal);
       }
       // prepare aruments
diff --git a/pkg/analyzer_experimental/lib/options.dart b/pkg/analyzer_experimental/lib/options.dart
index 8c26f43..83d5585 100644
--- a/pkg/analyzer_experimental/lib/options.dart
+++ b/pkg/analyzer_experimental/lib/options.dart
@@ -86,6 +86,7 @@
   }
 
   static CommandLineOptions _parse(List<String> args) {
+    args = args.expand((String arg) => arg.split('=')).toList();
     var parser = new _CommandLineParser()
       ..addFlag('batch', abbr: 'b', help: 'Run in batch mode',
           defaultsTo: false, negatable: false)
@@ -200,6 +201,7 @@
   void addOption(String name, {String abbr, String help, List<String> allowed,
       Map<String, String> allowedHelp, String defaultsTo,
       void callback(value), bool allowMultiple: false}) {
+    _knownFlags.add(name);
     _parser.addOption(name, abbr: abbr, help: help, allowed: allowed,
         allowedHelp: allowedHelp, defaultsTo: defaultsTo, callback: callback,
         allowMultiple: allowMultiple);
@@ -224,7 +226,7 @@
   List<String> _filterUnknowns(args) {
 
     // Only filter args if the ignore flag is specified.
-    if (!args.contains('--ignore_unrecognized_flags')) {
+    if (!args.contains('--ignore-unrecognized-flags')) {
       return args;
     }
 
@@ -238,6 +240,7 @@
       var arg = args[i];
       if (arg.startsWith('--') && arg.length > 2) {
         if (!_knownFlags.contains(arg.substring(2))) {
+          print('remove: $arg');
           //"eat" params by advancing to the next flag/option
           i = _getNextFlagIndex(args, i);
         } else {
@@ -248,6 +251,7 @@
       }
     }
 
+    print(filtered);
     return filtered;
   }
 
diff --git a/pkg/analyzer_experimental/lib/src/analyzer_impl.dart b/pkg/analyzer_experimental/lib/src/analyzer_impl.dart
index 4e46d61..5d8fc4c 100644
--- a/pkg/analyzer_experimental/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_experimental/lib/src/analyzer_impl.dart
@@ -81,6 +81,7 @@
       } else {
         packageDirectory = getPackageDirectoryFor(sourceFile);
       }
+      print('packageDirectory: ${packageDirectory.getPath()}');
       if (packageDirectory != null) {
         resolvers.add(new PackageUriResolver([packageDirectory]));
       }
diff --git a/pkg/analyzer_experimental/lib/src/generated/ast.dart b/pkg/analyzer_experimental/lib/src/generated/ast.dart
index 82647d4..e242155 100644
--- a/pkg/analyzer_experimental/lib/src/generated/ast.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/ast.dart
@@ -2775,6 +2775,7 @@
   CommentType(this.name, this.ordinal) {
   }
   int compareTo(CommentType other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
@@ -12652,6 +12653,23 @@
    */
   VariableDeclaration({Comment comment, List<Annotation> metadata, SimpleIdentifier name, Token equals, Expression initializer}) : this.full(comment, metadata, name, equals, initializer);
   accept(ASTVisitor visitor) => visitor.visitVariableDeclaration(this);
+
+  /**
+   * This overridden implementation of getDocumentationComment() looks in the grandparent node for
+   * dartdoc comments if no documentation is specifically available on the node.
+   */
+  Comment get documentationComment {
+    Comment comment = super.documentationComment;
+    if (comment == null) {
+      if (parent != null && parent.parent != null) {
+        ASTNode node = parent.parent;
+        if (node is AnnotatedNode) {
+          return ((node as AnnotatedNode)).documentationComment;
+        }
+      }
+    }
+    return comment;
+  }
   VariableElement get element => _name != null ? (_name.element as VariableElement) : null;
   Token get endToken {
     if (_initializer != null) {
diff --git a/pkg/analyzer_experimental/lib/src/generated/element.dart b/pkg/analyzer_experimental/lib/src/generated/element.dart
index 575fe43..98ec241 100644
--- a/pkg/analyzer_experimental/lib/src/generated/element.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/element.dart
@@ -553,6 +553,7 @@
    */
   String get displayName => _displayName;
   int compareTo(ElementKind other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
@@ -3932,6 +3933,7 @@
   Modifier(this.name, this.ordinal) {
   }
   int compareTo(Modifier other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
@@ -5399,35 +5401,23 @@
     }
     FunctionType t = this;
     FunctionType s = type as FunctionType;
-    if (t.normalParameterTypes.length != s.normalParameterTypes.length) {
-      return false;
-    } else if (t.normalParameterTypes.length > 0) {
-      List<Type2> tTypes = t.normalParameterTypes;
-      List<Type2> sTypes = s.normalParameterTypes;
-      for (int i = 0; i < tTypes.length; i++) {
-        if (!tTypes[i].isAssignableTo(sTypes[i])) {
-          return false;
-        }
-      }
-    }
-    if (t.optionalParameterTypes.length > 0) {
-      List<Type2> tOpTypes = t.optionalParameterTypes;
-      List<Type2> sOpTypes = s.optionalParameterTypes;
-      if (tOpTypes.length < sOpTypes.length) {
-        return false;
-      }
-      for (int i = 0; i < sOpTypes.length; i++) {
-        if (!tOpTypes[i].isAssignableTo(sOpTypes[i])) {
-          return false;
-        }
-      }
-      if (t.namedParameterTypes.length > 0 || s.namedParameterTypes.length > 0) {
-        return false;
-      }
-    } else if (s.optionalParameterTypes.length > 0) {
+    List<Type2> tTypes = t.normalParameterTypes;
+    List<Type2> tOpTypes = t.optionalParameterTypes;
+    List<Type2> sTypes = s.normalParameterTypes;
+    List<Type2> sOpTypes = s.optionalParameterTypes;
+    if ((sOpTypes.length > 0 && t.namedParameterTypes.length > 0) || (tOpTypes.length > 0 && s.namedParameterTypes.length > 0)) {
       return false;
     }
     if (t.namedParameterTypes.length > 0) {
+      if (t.normalParameterTypes.length != s.normalParameterTypes.length) {
+        return false;
+      } else if (t.normalParameterTypes.length > 0) {
+        for (int i = 0; i < tTypes.length; i++) {
+          if (!tTypes[i].isAssignableTo(sTypes[i])) {
+            return false;
+          }
+        }
+      }
       Map<String, Type2> namedTypesT = t.namedParameterTypes;
       Map<String, Type2> namedTypesS = s.namedParameterTypes;
       if (namedTypesT.length < namedTypesS.length) {
@@ -5446,6 +5436,31 @@
       }
     } else if (s.namedParameterTypes.length > 0) {
       return false;
+    } else {
+      int tArgLength = tTypes.length + tOpTypes.length;
+      int sArgLength = sTypes.length + sOpTypes.length;
+      if (tArgLength < sArgLength || sTypes.length < tTypes.length) {
+        return false;
+      }
+      List<Type2> tAllTypes = new List<Type2>(sArgLength);
+      for (int i = 0; i < tTypes.length; i++) {
+        tAllTypes[i] = tTypes[i];
+      }
+      for (int i = tTypes.length, j = 0; i < sArgLength; i++, j++) {
+        tAllTypes[i] = tOpTypes[j];
+      }
+      List<Type2> sAllTypes = new List<Type2>(sArgLength);
+      for (int i = 0; i < sTypes.length; i++) {
+        sAllTypes[i] = sTypes[i];
+      }
+      for (int i = sTypes.length, j = 0; i < sArgLength; i++, j++) {
+        sAllTypes[i] = sOpTypes[j];
+      }
+      for (int i = 0; i < sAllTypes.length; i++) {
+        if (!sAllTypes[i].isAssignableTo(tAllTypes[i])) {
+          return false;
+        }
+      }
     }
     return s.returnType == VoidTypeImpl.instance || t.returnType.isAssignableTo(s.returnType);
   }
@@ -5607,7 +5622,6 @@
    * @see #getLeastUpperBound(Type)
    */
   static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) => computeSuperinterfaceSet2(type, new Set<InterfaceType>());
-  List<TypeVariableElement> get typeVariables => element.typeVariables;
 
   /**
    * This method computes the longest inheritance path from some passed {@link Type} to Object. This
@@ -5784,6 +5798,9 @@
     return typedInterfaces;
   }
   Type2 getLeastUpperBound(Type2 type) {
+    if (identical(type, this)) {
+      return this;
+    }
     Type2 dynamicType = DynamicTypeImpl.instance;
     if (identical(this, dynamicType) || identical(type, dynamicType)) {
       return dynamicType;
@@ -5846,6 +5863,7 @@
     return supertype2.substitute2(_typeArguments, TypeVariableTypeImpl.getTypes(classElement.typeVariables));
   }
   List<Type2> get typeArguments => _typeArguments;
+  List<TypeVariableElement> get typeVariables => element.typeVariables;
   int get hashCode {
     ClassElement element2 = element;
     if (element2 == null) {
@@ -6118,6 +6136,8 @@
         }
       }
       return true;
+    } else if (typeS.isDartCoreFunction() && elementT.getMethod("call") != null) {
+      return true;
     }
     InterfaceType supertype2 = elementT.supertype;
     if (supertype2 != null && ((supertype2 as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClasses)) {
diff --git a/pkg/analyzer_experimental/lib/src/generated/engine.dart b/pkg/analyzer_experimental/lib/src/generated/engine.dart
index 52df59f..b82126a 100644
--- a/pkg/analyzer_experimental/lib/src/generated/engine.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/engine.dart
@@ -3411,6 +3411,7 @@
   CacheState(this.name, this.ordinal) {
   }
   int compareTo(CacheState other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
diff --git a/pkg/analyzer_experimental/lib/src/generated/error.dart b/pkg/analyzer_experimental/lib/src/generated/error.dart
index 56db0bd..32cfa70 100644
--- a/pkg/analyzer_experimental/lib/src/generated/error.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/error.dart
@@ -80,6 +80,7 @@
    */
   ErrorSeverity max(ErrorSeverity severity) => this.ordinal >= severity.ordinal ? this : severity;
   int compareTo(ErrorSeverity other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
@@ -399,6 +400,7 @@
   ErrorProperty(this.name, this.ordinal) {
   }
   int compareTo(ErrorProperty other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
@@ -487,6 +489,7 @@
    */
   ErrorSeverity get severity => _severity;
   int compareTo(ErrorType other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
@@ -621,36 +624,42 @@
   static final CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = new CompileTimeErrorCode('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 15, "'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', 16, "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', 16, "An expression of type 'bool' was expected");
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = new CompileTimeErrorCode('CONST_EVAL_TYPE_BOOL', 17, "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', 17, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = new CompileTimeErrorCode('CONST_EVAL_TYPE_BOOL_NUM_STRING', 18, "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', 18, "An expression of type 'int' was expected");
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_INT = new CompileTimeErrorCode('CONST_EVAL_TYPE_INT', 19, "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', 19, "An expression of type 'num' was expected");
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_NUM = new CompileTimeErrorCode('CONST_EVAL_TYPE_NUM', 20, "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', 20, "Evaluation of this constant expression causes exception");
+  static final CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = new CompileTimeErrorCode('CONST_EVAL_THROWS_EXCEPTION', 21, "Evaluation of this constant expression causes exception");
 
   /**
    * 12.11.2 Const: If <i>T</i> is a parameterized type <i>S&lt;U<sub>1</sub>, &hellip;,
@@ -660,7 +669,7 @@
    * @param parameterCount the number of type parameters that were declared
    * @param argumentCount the number of type arguments provided
    */
-  static final CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = new CompileTimeErrorCode('CONST_WITH_INVALID_TYPE_PARAMETERS', 21, "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('CONST_WITH_INVALID_TYPE_PARAMETERS', 22, "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>,
@@ -668,13 +677,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', 22, "The constructor being called is not a 'const' constructor");
+  static final CompileTimeErrorCode CONST_WITH_NON_CONST = new CompileTimeErrorCode('CONST_WITH_NON_CONST', 23, "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', 23, "Arguments of a constant creation must be constant expressions");
+  static final CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = new CompileTimeErrorCode('CONST_WITH_NON_CONSTANT_ARGUMENT', 24, "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
@@ -686,12 +695,12 @@
    * followed by type arguments.
    * @param name the name of the non-type element
    */
-  static final CompileTimeErrorCode CONST_WITH_NON_TYPE = new CompileTimeErrorCode('CONST_WITH_NON_TYPE', 24, "The name '%s' is not a class");
+  static final CompileTimeErrorCode CONST_WITH_NON_TYPE = new CompileTimeErrorCode('CONST_WITH_NON_TYPE', 25, "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', 25, "The constant creation cannot use a type parameter");
+  static final CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = new CompileTimeErrorCode('CONST_WITH_TYPE_PARAMETERS', 26, "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
@@ -699,78 +708,78 @@
    * @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', 26, "The class '%s' does not have a constant constructor '%s'");
+  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = new CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR', 27, "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
    * constructor declared by the type <i>T</i>.
    * @param typeName the name of the type
    */
-  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 27, "The class '%s' does not have a default constant constructor");
+  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 28, "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', 28, "Default values aren't allowed in typedefs");
+  static final CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = new CompileTimeErrorCode('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 29, "Default values aren't allowed in typedefs");
 
   /**
    * 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', 29, "The default constructor is already defined");
+  static final CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = new CompileTimeErrorCode('DUPLICATE_CONSTRUCTOR_DEFAULT', 30, "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
    * declared in the same scope.
    * @param duplicateName the name of the duplicate entity
    */
-  static final CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = new CompileTimeErrorCode('DUPLICATE_CONSTRUCTOR_NAME', 30, "The constructor with name '%s' is already defined");
+  static final CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = new CompileTimeErrorCode('DUPLICATE_CONSTRUCTOR_NAME', 31, "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
    * declared in the same scope.
    * @param duplicateName the name of the duplicate entity
    */
-  static final CompileTimeErrorCode DUPLICATE_DEFINITION = new CompileTimeErrorCode('DUPLICATE_DEFINITION', 31, "The name '%s' is already defined");
+  static final CompileTimeErrorCode DUPLICATE_DEFINITION = new CompileTimeErrorCode('DUPLICATE_DEFINITION', 32, "The name '%s' is already defined");
 
   /**
    * 7 Classes: It is a compile-time error if a class declares two members of the same name.
    */
-  static final CompileTimeErrorCode DUPLICATE_MEMBER_NAME = new CompileTimeErrorCode('DUPLICATE_MEMBER_NAME', 32, "");
+  static final CompileTimeErrorCode DUPLICATE_MEMBER_NAME = new CompileTimeErrorCode('DUPLICATE_MEMBER_NAME', 33, "");
 
   /**
    * 7 Classes: It is a compile-time error if a class has an instance member and a static member
    * with the same name.
    */
-  static final CompileTimeErrorCode DUPLICATE_MEMBER_NAME_INSTANCE_STATIC = new CompileTimeErrorCode('DUPLICATE_MEMBER_NAME_INSTANCE_STATIC', 33, "");
+  static final CompileTimeErrorCode DUPLICATE_MEMBER_NAME_INSTANCE_STATIC = new CompileTimeErrorCode('DUPLICATE_MEMBER_NAME_INSTANCE_STATIC', 34, "");
 
   /**
    * 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', 34, "The argument for the named parameter '%s' was already specified");
+  static final CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = new CompileTimeErrorCode('DUPLICATE_NAMED_ARGUMENT', 35, "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', 35, "The library %s is internal and cannot be exported");
+  static final CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = new CompileTimeErrorCode('EXPORT_INTERNAL_LIBRARY', 36, "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
    * not a library declaration.
    * @param uri the uri pointing to a non-library declaration
    */
-  static final CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = new CompileTimeErrorCode('EXPORT_OF_NON_LIBRARY', 36, "The exported library '%s' must not have a part-of directive");
+  static final CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = new CompileTimeErrorCode('EXPORT_OF_NON_LIBRARY', 37, "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
    * a type expression that does not denote a class available in the lexical scope of <i>C</i>.
    * @param typeName the name of the superclass that was not found
    */
-  static final CompileTimeErrorCode EXTENDS_NON_CLASS = new CompileTimeErrorCode('EXTENDS_NON_CLASS', 37, "Classes can only extend other classes");
+  static final CompileTimeErrorCode EXTENDS_NON_CLASS = new CompileTimeErrorCode('EXTENDS_NON_CLASS', 38, "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.
@@ -788,7 +797,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', 38, "Classes cannot extend '%s'");
+  static final CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = new CompileTimeErrorCode('EXTENDS_DISALLOWED_CLASS', 39, "Classes cannot extend '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
@@ -798,7 +807,7 @@
    * @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', 39, "%d positional arguments expected, but %d found");
+  static final CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = new CompileTimeErrorCode('EXTRA_POSITIONAL_ARGUMENTS', 40, "%d positional arguments expected, but %d found");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -816,35 +825,35 @@
    * @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', 40, "Classes cannot implement '%s'");
+  static final CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = new CompileTimeErrorCode('IMPLEMENTS_DISALLOWED_CLASS', 41, "Classes cannot implement '%s'");
 
   /**
    * 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', 41, "The field '%s' cannot be initialized twice in the same constructor");
+  static final CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = new CompileTimeErrorCode('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 42, "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', 42, "Values cannot be set in the constructor if they are final, and have already been set");
+  static final CompileTimeErrorCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = new CompileTimeErrorCode('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 43, "Values cannot be set in the constructor if they are final, and have already been set");
 
   /**
    * 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', 43, "Fields cannot be initialized in both the parameter list and the initializers");
+  static final CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = new CompileTimeErrorCode('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 44, "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', 44, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
+  static final CompileTimeErrorCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = new CompileTimeErrorCode('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 45, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
 
   /**
    * 5 Variables: It is a compile-time error if a final instance variable that has is initialized by
@@ -852,19 +861,19 @@
    * constructor.
    * @param name the name of the field in question
    */
-  static final CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = new CompileTimeErrorCode('FINAL_INITIALIZED_MULTIPLE_TIMES', 45, "'%s' is a final field and so can only be set once");
+  static final CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = new CompileTimeErrorCode('FINAL_INITIALIZED_MULTIPLE_TIMES', 46, "'%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', 46, "Initializing formal fields cannot be used in factory constructors");
+  static final CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 47, "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', 47, "Initializing formal fields can only be used in constructors");
+  static final CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 48, "Initializing formal fields can only be used in constructors");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -873,14 +882,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', 48, "The redirecting constructor cannot have a field initializer");
-
-  /**
-   * 5 Variables: It is a compile-time error if a library, static or local variable <i>v</i> is
-   * final and <i>v</i> is not initialized at its point of declaration.
-   * @param name the name of the variable in question
-   */
-  static final CompileTimeErrorCode FINAL_NOT_INITIALIZED = new CompileTimeErrorCode('FINAL_NOT_INITIALIZED', 49, "The final variable '%s' must be initialized");
+  static final CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 49, "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
@@ -1511,7 +1513,7 @@
    * <i>n</i> type parameters.
    */
   static final CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = new CompileTimeErrorCode('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 130, "");
-  static final List<CompileTimeErrorCode> values = [AMBIGUOUS_EXPORT, AMBIGUOUS_IMPORT, ARGUMENT_DEFINITION_TEST_NON_PARAMETER, BUILT_IN_IDENTIFIER_AS_TYPE, BUILT_IN_IDENTIFIER_AS_TYPE_NAME, BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME, BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME, CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, COMPILE_TIME_CONSTANT_RAISES_EXCEPTION, CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, CONST_CONSTRUCTOR_THROWS_EXCEPTION, CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, CONST_FORMAL_PARAMETER, CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, CONST_EVAL_TYPE_BOOL, CONST_EVAL_TYPE_BOOL_NUM_STRING, CONST_EVAL_TYPE_INT, CONST_EVAL_TYPE_NUM, CONST_EVAL_THROWS_EXCEPTION, CONST_WITH_INVALID_TYPE_PARAMETERS, CONST_WITH_NON_CONST, CONST_WITH_NON_CONSTANT_ARGUMENT, CONST_WITH_NON_TYPE, CONST_WITH_TYPE_PARAMETERS, CONST_WITH_UNDEFINED_CONSTRUCTOR, CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, DUPLICATE_CONSTRUCTOR_DEFAULT, DUPLICATE_CONSTRUCTOR_NAME, DUPLICATE_DEFINITION, DUPLICATE_MEMBER_NAME, DUPLICATE_MEMBER_NAME_INSTANCE_STATIC, DUPLICATE_NAMED_ARGUMENT, EXPORT_INTERNAL_LIBRARY, EXPORT_OF_NON_LIBRARY, EXTENDS_NON_CLASS, EXTENDS_DISALLOWED_CLASS, EXTRA_POSITIONAL_ARGUMENTS, IMPLEMENTS_DISALLOWED_CLASS, 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, FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, FINAL_NOT_INITIALIZED, GETTER_AND_METHOD_WITH_SAME_NAME, IMPLEMENTS_DYNAMIC, IMPLEMENTS_NON_CLASS, IMPLEMENTS_REPEATED, IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, IMPORT_INTERNAL_LIBRARY, IMPORT_OF_NON_LIBRARY, INCONSISTENT_CASE_EXPRESSION_TYPES, INITIALIZER_FOR_NON_EXISTANT_FIELD, INITIALIZER_FOR_STATIC_FIELD, INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, INITIALIZING_FORMAL_FOR_STATIC_FIELD, INVALID_CONSTANT, INVALID_CONSTRUCTOR_NAME, INVALID_FACTORY_NAME_NOT_A_CLASS, INVALID_OVERRIDE_DEFAULT_VALUE, 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, LABEL_IN_OUTER_SCOPE, LABEL_UNDEFINED, MEMBER_WITH_CLASS_NAME, METHOD_AND_GETTER_WITH_SAME_NAME, MISSING_CONST_IN_LIST_LITERAL, MISSING_CONST_IN_MAP_LITERAL, MIXIN_DECLARES_CONSTRUCTOR, MIXIN_INHERITS_FROM_NOT_OBJECT, MIXIN_OF_NON_CLASS, MIXIN_REFERENCES_SUPER, MIXIN_WITH_NON_CLASS_SUPERCLASS, MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS, MULTIPLE_SUPER_INITIALIZERS, NEW_WITH_INVALID_TYPE_PARAMETERS, NON_CONST_MAP_AS_EXPRESSION_STATEMENT, NON_CONSTANT_CASE_EXPRESSION, NON_CONSTANT_DEFAULT_VALUE, NON_CONSTANT_LIST_ELEMENT, NON_CONSTANT_MAP_KEY, NON_CONSTANT_MAP_VALUE, NON_CONSTANT_VALUE_IN_INITIALIZER, NOT_ENOUGH_REQUIRED_ARGUMENTS, NON_GENERATIVE_CONSTRUCTOR, OBJECT_CANNOT_EXTEND_ANOTHER_CLASS, OPTIONAL_PARAMETER_IN_OPERATOR, PART_OF_NON_PART, PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, PRIVATE_OPTIONAL_PARAMETER, RECURSIVE_COMPILE_TIME_CONSTANT, RECURSIVE_CONSTRUCTOR_REDIRECT, RECURSIVE_FACTORY_REDIRECT, RECURSIVE_FUNCTION_TYPE_ALIAS, RECURSIVE_INTERFACE_INHERITANCE, RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS, RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS, REDIRECT_TO_NON_CONST_CONSTRUCTOR, REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER, RESERVED_WORD_AS_IDENTIFIER, RETHROW_OUTSIDE_CATCH, RETURN_IN_GENERATIVE_CONSTRUCTOR, STATIC_TOP_LEVEL_FUNCTION, STATIC_TOP_LEVEL_VARIABLE, SUPER_IN_INVALID_CONTEXT, SUPER_IN_REDIRECTING_CONSTRUCTOR, SUPER_INITIALIZER_IN_OBJECT, TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS, UNDEFINED_CLASS, UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, UNINITIALIZED_FINAL_FIELD, UNDEFINED_NAMED_PARAMETER, URI_DOES_NOT_EXIST, URI_WITH_INTERPOLATION, WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS, WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, WRONG_NUMBER_OF_TYPE_ARGUMENTS];
+  static final List<CompileTimeErrorCode> values = [AMBIGUOUS_EXPORT, AMBIGUOUS_IMPORT, ARGUMENT_DEFINITION_TEST_NON_PARAMETER, BUILT_IN_IDENTIFIER_AS_TYPE, BUILT_IN_IDENTIFIER_AS_TYPE_NAME, BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME, BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME, CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, COMPILE_TIME_CONSTANT_RAISES_EXCEPTION, CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, CONST_CONSTRUCTOR_THROWS_EXCEPTION, CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, CONST_FORMAL_PARAMETER, CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, CONST_INSTANCE_FIELD, CONST_EVAL_TYPE_BOOL, CONST_EVAL_TYPE_BOOL_NUM_STRING, CONST_EVAL_TYPE_INT, CONST_EVAL_TYPE_NUM, CONST_EVAL_THROWS_EXCEPTION, CONST_WITH_INVALID_TYPE_PARAMETERS, CONST_WITH_NON_CONST, CONST_WITH_NON_CONSTANT_ARGUMENT, CONST_WITH_NON_TYPE, CONST_WITH_TYPE_PARAMETERS, CONST_WITH_UNDEFINED_CONSTRUCTOR, CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, DUPLICATE_CONSTRUCTOR_DEFAULT, DUPLICATE_CONSTRUCTOR_NAME, DUPLICATE_DEFINITION, DUPLICATE_MEMBER_NAME, DUPLICATE_MEMBER_NAME_INSTANCE_STATIC, DUPLICATE_NAMED_ARGUMENT, EXPORT_INTERNAL_LIBRARY, EXPORT_OF_NON_LIBRARY, EXTENDS_NON_CLASS, EXTENDS_DISALLOWED_CLASS, EXTRA_POSITIONAL_ARGUMENTS, IMPLEMENTS_DISALLOWED_CLASS, 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, FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, GETTER_AND_METHOD_WITH_SAME_NAME, IMPLEMENTS_DYNAMIC, IMPLEMENTS_NON_CLASS, IMPLEMENTS_REPEATED, IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, IMPORT_INTERNAL_LIBRARY, IMPORT_OF_NON_LIBRARY, INCONSISTENT_CASE_EXPRESSION_TYPES, INITIALIZER_FOR_NON_EXISTANT_FIELD, INITIALIZER_FOR_STATIC_FIELD, INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD, INITIALIZING_FORMAL_FOR_STATIC_FIELD, INVALID_CONSTANT, INVALID_CONSTRUCTOR_NAME, INVALID_FACTORY_NAME_NOT_A_CLASS, INVALID_OVERRIDE_DEFAULT_VALUE, 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, LABEL_IN_OUTER_SCOPE, LABEL_UNDEFINED, MEMBER_WITH_CLASS_NAME, METHOD_AND_GETTER_WITH_SAME_NAME, MISSING_CONST_IN_LIST_LITERAL, MISSING_CONST_IN_MAP_LITERAL, MIXIN_DECLARES_CONSTRUCTOR, MIXIN_INHERITS_FROM_NOT_OBJECT, MIXIN_OF_NON_CLASS, MIXIN_REFERENCES_SUPER, MIXIN_WITH_NON_CLASS_SUPERCLASS, MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS, MULTIPLE_SUPER_INITIALIZERS, NEW_WITH_INVALID_TYPE_PARAMETERS, NON_CONST_MAP_AS_EXPRESSION_STATEMENT, NON_CONSTANT_CASE_EXPRESSION, NON_CONSTANT_DEFAULT_VALUE, NON_CONSTANT_LIST_ELEMENT, NON_CONSTANT_MAP_KEY, NON_CONSTANT_MAP_VALUE, NON_CONSTANT_VALUE_IN_INITIALIZER, NOT_ENOUGH_REQUIRED_ARGUMENTS, NON_GENERATIVE_CONSTRUCTOR, OBJECT_CANNOT_EXTEND_ANOTHER_CLASS, OPTIONAL_PARAMETER_IN_OPERATOR, PART_OF_NON_PART, PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, PRIVATE_OPTIONAL_PARAMETER, RECURSIVE_COMPILE_TIME_CONSTANT, RECURSIVE_CONSTRUCTOR_REDIRECT, RECURSIVE_FACTORY_REDIRECT, RECURSIVE_FUNCTION_TYPE_ALIAS, RECURSIVE_INTERFACE_INHERITANCE, RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS, RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS, REDIRECT_TO_NON_CONST_CONSTRUCTOR, REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER, RESERVED_WORD_AS_IDENTIFIER, RETHROW_OUTSIDE_CATCH, RETURN_IN_GENERATIVE_CONSTRUCTOR, STATIC_TOP_LEVEL_FUNCTION, STATIC_TOP_LEVEL_VARIABLE, SUPER_IN_INVALID_CONTEXT, SUPER_IN_REDIRECTING_CONSTRUCTOR, SUPER_INITIALIZER_IN_OBJECT, TYPE_ARGUMENTS_FOR_NON_GENERIC_CLASS, UNDEFINED_CLASS, UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, UNINITIALIZED_FINAL_FIELD, UNDEFINED_NAMED_PARAMETER, URI_DOES_NOT_EXIST, URI_WITH_INTERPOLATION, WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS, WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, WRONG_NUMBER_OF_TYPE_ARGUMENTS];
 
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
@@ -1535,6 +1537,7 @@
   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;
 }
 /**
@@ -1591,6 +1594,7 @@
   String get message => _message;
   ErrorType get type => ErrorType.PUB_SUGGESTION;
   int compareTo(PubSuggestionCode other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
@@ -1657,7 +1661,7 @@
    * 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', 4, "");
+  static final StaticWarningCode CAST_TO_NON_TYPE = new StaticWarningCode('CAST_TO_NON_TYPE', 4, "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
@@ -1782,12 +1786,19 @@
   static final StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = new StaticWarningCode('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 20, "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
+   * and <i>v</i> is not initialized at its point of declaration.
+   * @param name the name of the uninitialized final variable
+   */
+  static final StaticWarningCode FINAL_NOT_INITIALIZED = new StaticWarningCode('FINAL_NOT_INITIALIZED', 21, "The final variable '%s' must be initialized");
+
+  /**
    * 14.1 Imports: It is a static warning to import two different libraries with the same name.
    * @param uri1 the uri pointing to a first library
    * @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', 21, "The imported libraries '%s' and '%s' should not have the same name '%s'");
+  static final StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode('IMPORT_DUPLICATED_LIBRARY_NAME', 22, "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>,
@@ -1799,13 +1810,13 @@
    * 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', 22, "'%s' is inherited as a getter and also a method");
+  static final StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = new StaticWarningCode('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 23, "'%s' is inherited as a getter and also a method");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
    * n</i>.
    */
-  static final StaticWarningCode INCORRECT_NUMBER_OF_ARGUMENTS = new StaticWarningCode('INCORRECT_NUMBER_OF_ARGUMENTS', 23, "");
+  static final StaticWarningCode INCORRECT_NUMBER_OF_ARGUMENTS = new StaticWarningCode('INCORRECT_NUMBER_OF_ARGUMENTS', 24, "");
 
   /**
    * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
@@ -1814,12 +1825,12 @@
    * @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', 24, "'%s' collides with a static member in the superclass '%s'");
+  static final StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = new StaticWarningCode('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 25, "'%s' collides with a static member in the superclass '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if <i>M.id</i> is not a constructor name.
    */
-  static final StaticWarningCode INVALID_FACTORY_NAME = new StaticWarningCode('INVALID_FACTORY_NAME', 25, "");
+  static final StaticWarningCode INVALID_FACTORY_NAME = new StaticWarningCode('INVALID_FACTORY_NAME', 26, "");
 
   /**
    * 7.2 Getters: It is a static warning if a getter <i>m1</i> overrides a getter <i>m2</i> and the
@@ -1830,7 +1841,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', 26, "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('INVALID_GETTER_OVERRIDE_RETURN_TYPE', 27, "The return type '%s' is not assignable to '%s' as required from getter it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -1840,7 +1851,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', 27, "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('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'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -1851,7 +1862,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', 28, "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('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'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -1861,7 +1872,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', 29, "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('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'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -1872,7 +1883,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', 30, "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('INVALID_METHOD_OVERRIDE_RETURN_TYPE', 31, "The return type '%s' is not assignable to '%s' as required from method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -1880,7 +1891,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 = new StaticWarningCode('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES', 31, "");
+  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES = new StaticWarningCode('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES', 32, "");
 
   /**
    * 7.3 Setters: It is a static warning if a setter <i>m1</i> overrides a setter <i>m2</i> and the
@@ -1891,7 +1902,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', 32, "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('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 33, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1899,7 +1910,7 @@
    * x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. If <i>S.m</i> exists, it is a static warning if the type
    * <i>F</i> of <i>S.m</i> may not be assigned to a function type.
    */
-  static final StaticWarningCode INVOCATION_OF_NON_FUNCTION = new StaticWarningCode('INVOCATION_OF_NON_FUNCTION', 33, "");
+  static final StaticWarningCode INVOCATION_OF_NON_FUNCTION = new StaticWarningCode('INVOCATION_OF_NON_FUNCTION', 34, "");
 
   /**
    * 15.1 Static Types: A type <i>T</i> is malformed iff: <li><i>T</i> has the form <i>id</i> or the
@@ -1911,27 +1922,27 @@
    * <p>
    * Any use of a malformed type gives rise to a static warning.
    */
-  static final StaticWarningCode MALFORMED_TYPE = new StaticWarningCode('MALFORMED_TYPE', 34, "");
+  static final StaticWarningCode MALFORMED_TYPE = new StaticWarningCode('MALFORMED_TYPE', 35, "");
 
   /**
    * 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', 35, "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('MISMATCHED_GETTER_AND_SETTER_TYPES', 36, "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', 36, "Abstract classes cannot be created with a 'new' expression");
+  static final StaticWarningCode NEW_WITH_ABSTRACT_CLASS = new StaticWarningCode('NEW_WITH_ABSTRACT_CLASS', 37, "Abstract classes cannot be created with a 'new' expression");
 
   /**
    * 12.11.1 New: It is a static warning if <i>T</i> is not a class accessible in the current scope,
    * optionally followed by type arguments.
    * @param name the name of the non-type element
    */
-  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode('NEW_WITH_NON_TYPE', 37, "The name '%s' is not a class");
+  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode('NEW_WITH_NON_TYPE', 38, "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:
@@ -1942,7 +1953,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', 38, "The class '%s' does not have a constructor '%s'");
+  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = new StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR', 39, "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:
@@ -1953,7 +1964,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', 39, "The class '%s' does not have a default constructor");
+  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 40, "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
@@ -1962,17 +1973,25 @@
    * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
    * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
    * corresponding instance member <i>m</i>.
+   * @param getterSetterOrMethod a string containing either "get ", "set " or "" for the first
+   * member
    * @param enclosingClass enclosing class of the first missing member
    * @param name first member name
+   * @param getterSetterOrMethod a string containing either "get ", "set " or "" for the second
+   * member
    * @param enclosingClass enclosing class of the second missing member
    * @param name second member name
+   * @param getterSetterOrMethod a string containing either "get ", "set " or "" for the third
+   * member
    * @param enclosingClass enclosing class of the third missing member
    * @param name third member name
+   * @param getterSetterOrMethod a string containing either "get ", "set " or "" for the fourth
+   * member
    * @param enclosingClass enclosing class of the fourth missing member
    * @param name fourth member name
    * @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', 40, "Missing inherited members '%s.%s', '%s.%s', '%s.%s', '%s.%s' and %d more");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 41, "Missing inherited members: %s'%s.%s', %s'%s.%s', %s'%s.%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
@@ -1981,16 +2000,24 @@
    * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
    * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
    * corresponding instance member <i>m</i>.
+   * @param getterSetterOrMethod a string containing either "get ", "set " or "" for the first
+   * member
    * @param enclosingClass enclosing class of the first missing member
    * @param name first member name
+   * @param getterSetterOrMethod a string containing either "get ", "set " or "" for the second
+   * member
    * @param enclosingClass enclosing class of the second missing member
    * @param name second member name
+   * @param getterSetterOrMethod a string containing either "get ", "set " or "" for the third
+   * member
    * @param enclosingClass enclosing class of the third missing member
    * @param name third member name
+   * @param getterSetterOrMethod a string containing either "get ", "set " or "" for the fourth
+   * member
    * @param enclosingClass enclosing class of the fourth missing member
    * @param name fourth member name
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 41, "Missing inherited members '%s.%s', '%s.%s', '%s.%s' and '%s.%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 42, "Missing inherited members: %s'%s.%s', %s'%s.%s', %s'%s.%s' and %s'%s.%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -1999,10 +2026,11 @@
    * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
    * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
    * corresponding instance member <i>m</i>.
+   * @param getterSetterOrMethod a string containing either "get ", "set " or ""
    * @param enclosingClass enclosing class of the missing member
    * @param name member name
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 42, "Missing inherited member '%s.%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 43, "Missing inherited member %s'%s.%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2011,14 +2039,20 @@
    * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
    * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
    * corresponding instance member <i>m</i>.
+   * @param getterSetterOrMethod a string containing either "get ", "set " or "" for the first
+   * member
    * @param enclosingClass enclosing class of the first missing member
    * @param name first member name
+   * @param getterSetterOrMethod a string containing either "get ", "set " or "" for the second
+   * member
    * @param enclosingClass enclosing class of the second missing member
    * @param name second member name
+   * @param getterSetterOrMethod a string containing either "get ", "set " or "" for the third
+   * member
    * @param enclosingClass enclosing class of the third missing member
    * @param name third member name
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 43, "Missing inherited members '%s.%s', '%s.%s' and '%s.%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 44, "Missing inherited members: %s'%s.%s', %s'%s.%s' and %s'%s.%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2027,18 +2061,16 @@
    * 7.10 Superinterfaces: It is a static warning if the implicit interface of a non-abstract class
    * <i>C</i> includes an instance member <i>m</i> and <i>C</i> does not declare or inherit a
    * corresponding instance member <i>m</i>.
+   * @param getterSetterOrMethod a string containing either "get ", "set " or "" for the first
+   * member
    * @param enclosingClass enclosing class of the first missing member
    * @param name first member name
+   * @param getterSetterOrMethod a string containing either "get ", "set " or "" for the second
+   * member
    * @param enclosingClass enclosing class of the second missing member
    * @param name second member name
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 44, "Missing inherited members '%s.%s' and '%s.%s'");
-
-  /**
-   * 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 NON_TYPE = new StaticWarningCode('NON_TYPE', 45, "");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 45, "Missing inherited members: %s'%s.%s' and %s'%s.%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
@@ -2096,14 +2128,14 @@
    * 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', 53, "");
+  static final StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = new StaticWarningCode('REDIRECT_TO_MISSING_CONSTRUCTOR', 53, "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', 54, "");
+  static final StaticWarningCode REDIRECT_TO_NON_CLASS = new StaticWarningCode('REDIRECT_TO_NON_CLASS', 54, "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
@@ -2129,17 +2161,23 @@
   static final StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = new StaticWarningCode('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 57, "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', 58, "The name '%s' is not a type and cannot be used in an 'is' expression");
+
+  /**
    * 12.15.3 Static Invocation: A static method invocation <i>i</i> has the form
    * <i>C.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>. It is a static warning if <i>C</i> does not denote a
    * class in the current scope.
    */
-  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode('UNDEFINED_CLASS', 58, "Undefined class '%s'");
+  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode('UNDEFINED_CLASS', 59, "Undefined class '%s'");
 
   /**
    * Same as {@link #UNDEFINED_CLASS}, but to catch using "boolean" instead of "bool".
    */
-  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode('UNDEFINED_CLASS_BOOLEAN', 59, "Undefined class 'boolean'; did you mean 'bool'?");
+  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode('UNDEFINED_CLASS_BOOLEAN', 60, "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
@@ -2148,7 +2186,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', 60, "There is no such getter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_GETTER = new StaticWarningCode('UNDEFINED_GETTER', 61, "There is no such getter '%s' in '%s'");
 
   /**
    * 12.30 Identifier Reference: It is as static warning if an identifier expression of the form
@@ -2156,7 +2194,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', 61, "Undefined name '%s'");
+  static final StaticWarningCode UNDEFINED_IDENTIFIER = new StaticWarningCode('UNDEFINED_IDENTIFIER', 62, "Undefined name '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -2164,7 +2202,7 @@
    * <i>p<sub>n+k</sub></i>} or a static warning occurs.
    * @param name the name of the requested named parameter
    */
-  static final StaticWarningCode UNDEFINED_NAMED_PARAMETER = new StaticWarningCode('UNDEFINED_NAMED_PARAMETER', 62, "The named parameter '%s' is not defined");
+  static final StaticWarningCode UNDEFINED_NAMED_PARAMETER = new StaticWarningCode('UNDEFINED_NAMED_PARAMETER', 63, "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
@@ -2178,7 +2216,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', 63, "There is no such setter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_SETTER = new StaticWarningCode('UNDEFINED_SETTER', 64, "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
@@ -2186,8 +2224,8 @@
    * @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', 64, "There is no such static method '%s' in '%s'");
-  static final List<StaticWarningCode> values = [AMBIGUOUS_IMPORT, ARGUMENT_TYPE_NOT_ASSIGNABLE, ASSIGNMENT_TO_FINAL, CASE_BLOCK_NOT_TERMINATED, CAST_TO_NON_TYPE, COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE, COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE, COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR, COMMENT_REFERENCE_UNDECLARED_IDENTIFIER, COMMENT_REFERENCE_URI_NOT_LIBRARY, CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER, CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER, CONST_WITH_ABSTRACT_CLASS, EQUAL_KEYS_IN_MAP, EXPORT_DUPLICATED_LIBRARY_NAME, EXTRA_POSITIONAL_ARGUMENTS, FIELD_INITIALIZER_NOT_ASSIGNABLE, FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, IMPORT_DUPLICATED_LIBRARY_NAME, INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD, INCORRECT_NUMBER_OF_ARGUMENTS, INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, INVALID_FACTORY_NAME, INVALID_GETTER_OVERRIDE_RETURN_TYPE, INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE, INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, INVALID_METHOD_OVERRIDE_RETURN_TYPE, INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES, INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, INVOCATION_OF_NON_FUNCTION, MALFORMED_TYPE, MISMATCHED_GETTER_AND_SETTER_TYPES, NEW_WITH_ABSTRACT_CLASS, NEW_WITH_NON_TYPE, NEW_WITH_UNDEFINED_CONSTRUCTOR, NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, NON_TYPE, NON_TYPE_IN_CATCH_CLAUSE, NON_VOID_RETURN_FOR_OPERATOR, NON_VOID_RETURN_FOR_SETTER, NOT_ENOUGH_REQUIRED_ARGUMENTS, PART_OF_DIFFERENT_LIBRARY, REDIRECT_TO_INVALID_FUNCTION_TYPE, REDIRECT_TO_INVALID_RETURN_TYPE, REDIRECT_TO_MISSING_CONSTRUCTOR, REDIRECT_TO_NON_CLASS, RETURN_WITHOUT_VALUE, STATIC_ACCESS_TO_INSTANCE_MEMBER, SWITCH_EXPRESSION_NOT_ASSIGNABLE, UNDEFINED_CLASS, UNDEFINED_CLASS_BOOLEAN, UNDEFINED_GETTER, UNDEFINED_IDENTIFIER, UNDEFINED_NAMED_PARAMETER, UNDEFINED_SETTER, UNDEFINED_STATIC_METHOD_OR_GETTER];
+  static final StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = new StaticWarningCode('UNDEFINED_STATIC_METHOD_OR_GETTER', 65, "There is no such static method '%s' in '%s'");
+  static final List<StaticWarningCode> values = [AMBIGUOUS_IMPORT, ARGUMENT_TYPE_NOT_ASSIGNABLE, ASSIGNMENT_TO_FINAL, CASE_BLOCK_NOT_TERMINATED, CAST_TO_NON_TYPE, COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE, COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE, COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR, COMMENT_REFERENCE_UNDECLARED_IDENTIFIER, COMMENT_REFERENCE_URI_NOT_LIBRARY, CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER, CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER, CONST_WITH_ABSTRACT_CLASS, EQUAL_KEYS_IN_MAP, EXPORT_DUPLICATED_LIBRARY_NAME, EXTRA_POSITIONAL_ARGUMENTS, FIELD_INITIALIZER_NOT_ASSIGNABLE, FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, FINAL_NOT_INITIALIZED, IMPORT_DUPLICATED_LIBRARY_NAME, INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD, INCORRECT_NUMBER_OF_ARGUMENTS, INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, INVALID_FACTORY_NAME, INVALID_GETTER_OVERRIDE_RETURN_TYPE, INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE, INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, INVALID_METHOD_OVERRIDE_RETURN_TYPE, INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES, INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, INVOCATION_OF_NON_FUNCTION, MALFORMED_TYPE, MISMATCHED_GETTER_AND_SETTER_TYPES, NEW_WITH_ABSTRACT_CLASS, NEW_WITH_NON_TYPE, NEW_WITH_UNDEFINED_CONSTRUCTOR, NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, NON_TYPE_IN_CATCH_CLAUSE, NON_VOID_RETURN_FOR_OPERATOR, NON_VOID_RETURN_FOR_SETTER, NOT_ENOUGH_REQUIRED_ARGUMENTS, PART_OF_DIFFERENT_LIBRARY, REDIRECT_TO_INVALID_FUNCTION_TYPE, REDIRECT_TO_INVALID_RETURN_TYPE, REDIRECT_TO_MISSING_CONSTRUCTOR, REDIRECT_TO_NON_CLASS, RETURN_WITHOUT_VALUE, STATIC_ACCESS_TO_INSTANCE_MEMBER, SWITCH_EXPRESSION_NOT_ASSIGNABLE, TYPE_TEST_NON_TYPE, UNDEFINED_CLASS, UNDEFINED_CLASS_BOOLEAN, UNDEFINED_GETTER, UNDEFINED_IDENTIFIER, UNDEFINED_NAMED_PARAMETER, UNDEFINED_SETTER, UNDEFINED_STATIC_METHOD_OR_GETTER];
 
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
@@ -2211,6 +2249,7 @@
   String get message => _message;
   ErrorType get type => ErrorType.STATIC_WARNING;
   int compareTo(StaticWarningCode other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
@@ -2280,6 +2319,7 @@
   String get message => _message;
   ErrorType get type => ErrorType.STATIC_WARNING;
   int compareTo(HtmlWarningCode other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
@@ -2514,5 +2554,6 @@
   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 206f552..741c07f 100644
--- a/pkg/analyzer_experimental/lib/src/generated/html.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/html.dart
@@ -300,10 +300,54 @@
   }
 
   /**
+   * This method exists for debugging purposes only.
+   */
+  void appendIdentifier(JavaStringBuilder builder, XmlNode node) {
+    if (node is XmlTagNode) {
+      builder.append(((node as XmlTagNode)).tag.lexeme);
+    } else if (node is XmlAttributeNode) {
+      builder.append(((node as XmlAttributeNode)).name.lexeme);
+    } else {
+      builder.append("htmlUnit");
+    }
+  }
+
+  /**
+   * This method exists for debugging purposes only.
+   */
+  String buildRecursiveStructureMessage(XmlNode newParent) {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("Attempt to create recursive structure: ");
+    XmlNode current = newParent;
+    while (current != null) {
+      if (current != newParent) {
+        builder.append(" -> ");
+      }
+      if (identical(current, this)) {
+        builder.appendChar(0x2A);
+        appendIdentifier(builder, current);
+        builder.appendChar(0x2A);
+      } else {
+        appendIdentifier(builder, current);
+      }
+      current = current.parent;
+    }
+    return builder.toString();
+  }
+
+  /**
    * Set the parent of this node to the given node.
    * @param newParent the node that is to be made the parent of this node
    */
   void set parent(XmlNode newParent) {
+    XmlNode current = newParent;
+    while (current != null) {
+      if (identical(current, this)) {
+        AnalysisEngine.instance.logger.logError3(new IllegalArgumentException(buildRecursiveStructureMessage(newParent)));
+        return;
+      }
+      current = current.parent;
+    }
     _parent = newParent;
   }
 }
@@ -853,6 +897,7 @@
    */
   String get lexeme => _lexeme;
   int compareTo(TokenType other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 class TokenType_EOF extends TokenType {
diff --git a/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart b/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
index 034f718..6821936 100644
--- a/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
@@ -257,6 +257,7 @@
   InstrumentationLevel(this.name, this.ordinal) {
   }
   int compareTo(InstrumentationLevel other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
diff --git a/pkg/analyzer_experimental/lib/src/generated/java_core.dart b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
index 18888f7..e8b1047 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_core.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
@@ -456,8 +456,8 @@
   }
 }
 
-Set<MapEntry> getMapEntrySet(Map m) {
-  Set<MapEntry> result = new Set();
+Iterable<MapEntry> getMapEntrySet(Map m) {
+  List<MapEntry> result = [];
   m.forEach((k, v) {
     result.add(new MapEntry(m, k, v));
   });
diff --git a/pkg/analyzer_experimental/lib/src/generated/java_engine.dart b/pkg/analyzer_experimental/lib/src/generated/java_engine.dart
index e507ea3..265e323 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_engine.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_engine.dart
@@ -1,7 +1,8 @@
 library java.engine;
 
 class StringUtilities {
-  static List<String> EMPTY_ARRAY = new List(0);
+  static const String EMPTY = '';
+  static const List<String> EMPTY_ARRAY = const <String> [];
   static String intern(String s) => s;
   static String substringBefore(String str, String separator) {
     if (str == null || str.isEmpty) {
diff --git a/pkg/analyzer_experimental/lib/src/generated/java_io.dart b/pkg/analyzer_experimental/lib/src/generated/java_io.dart
index 7799d49..b1cced8 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_io.dart
@@ -63,7 +63,11 @@
     this._path = new Path(path);
   }
   JavaFile.relative(JavaFile base, String child) {
-    this._path = base._path.join(new Path(child));
+    if (child.isEmpty) {
+      this._path = base._path;
+    } else {
+      this._path = base._path.join(new Path(child));
+    }
   }
   JavaFile.fromUri(Uri uri) : this(uri.path);
   int get hashCode => _path.hashCode;
diff --git a/pkg/analyzer_experimental/lib/src/generated/parser.dart b/pkg/analyzer_experimental/lib/src/generated/parser.dart
index 0a82fed..c24b42e 100644
--- a/pkg/analyzer_experimental/lib/src/generated/parser.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/parser.dart
@@ -5370,6 +5370,7 @@
   String get message => _message;
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
   int compareTo(ParserErrorCode other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
diff --git a/pkg/analyzer_experimental/lib/src/generated/resolver.dart b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
index 4ff1d00..e0a4a74 100644
--- a/pkg/analyzer_experimental/lib/src/generated/resolver.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
@@ -3523,18 +3523,42 @@
     } else {
       resultMap = new Map<String, ExecutableElement>();
     }
+    InterfaceType supertype2 = classElt.supertype;
+    ClassElement superclassElement = supertype2 != null ? supertype2.element : null;
     List<InterfaceType> interfaces2 = classElt.interfaces;
-    if (interfaces2.length == 0) {
+    if (superclassElement == null || interfaces2.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));
+        } finally {
+          visitedInterfaces.remove(superclassElement);
+        }
+      } else {
+        Map<String, ExecutableElement> map = _interfaceLookup[classElt];
+        if (map != null) {
+          lookupMaps.add(map);
+        } else {
+          _interfaceLookup[superclassElement] = resultMap;
+          return resultMap;
+        }
+      }
+    }
     for (InterfaceType interfaceType in interfaces2) {
       ClassElement interfaceElement = interfaceType.element;
       if (interfaceElement != null) {
         if (!visitedInterfaces.contains(interfaceElement)) {
-          javaSetAdd(visitedInterfaces, interfaceElement);
-          lookupMaps.add(computeInterfaceLookupMap(interfaceElement, visitedInterfaces));
+          try {
+            javaSetAdd(visitedInterfaces, interfaceElement);
+            lookupMaps.add(computeInterfaceLookupMap(interfaceElement, visitedInterfaces));
+          } finally {
+            visitedInterfaces.remove(interfaceElement);
+          }
         } else {
           Map<String, ExecutableElement> map = _interfaceLookup[classElt];
           if (map != null) {
@@ -3563,11 +3587,39 @@
         }
       }
     }
+    if (superclassElement != null) {
+      List<MethodElement> methods2 = superclassElement.methods;
+      for (MethodElement method in methods2) {
+        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> accessors2 = superclassElement.accessors;
+      for (PropertyAccessorElement accessor in accessors2) {
+        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 interfaces2) {
       ClassElement interfaceElement = interfaceType.element;
       if (interfaceElement != null) {
-        List<MethodElement> methods2 = interfaceElement.methods;
-        for (MethodElement method in methods2) {
+        List<MethodElement> methods3 = interfaceElement.methods;
+        for (MethodElement method in methods3) {
           if (method.isAccessibleIn(_library) && !method.isStatic()) {
             String key = method.name;
             if (!unionMap.containsKey(key)) {
@@ -3579,8 +3631,8 @@
             }
           }
         }
-        List<PropertyAccessorElement> accessors2 = interfaceElement.accessors;
-        for (PropertyAccessorElement accessor in accessors2) {
+        List<PropertyAccessorElement> accessors3 = interfaceElement.accessors;
+        for (PropertyAccessorElement accessor in accessors3) {
           if (accessor.isAccessibleIn(_library) && !accessor.isStatic()) {
             String key = accessor.name;
             if (!unionMap.containsKey(key)) {
@@ -3623,7 +3675,7 @@
           for (int i = 0; i < numOfEltsWithMatchingNames; i++) {
             executableElementTypes[i] = elements[i].type;
           }
-          bool foundSubtypeOfAllTypes = true;
+          bool foundSubtypeOfAllTypes = false;
           for (int i = 0; i < numOfEltsWithMatchingNames; i++) {
             FunctionType subtype = executableElementTypes[i];
             if (subtype == null) {
@@ -3634,12 +3686,12 @@
               if (i != j) {
                 if (!subtype.isSubtypeOf(executableElementTypes[j])) {
                   subtypeOfAllTypes = false;
-                  foundSubtypeOfAllTypes = false;
                   break;
                 }
               }
             }
             if (subtypeOfAllTypes) {
+              foundSubtypeOfAllTypes = true;
               resultMap[key] = elements[i];
               break;
             }
@@ -7969,9 +8021,15 @@
       if (typeNameSimple.name == "boolean") {
         reportError(StaticWarningCode.UNDEFINED_CLASS_BOOLEAN, typeNameSimple, []);
       } else if (isTypeNameInCatchClause(node)) {
-        reportError(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, node, [node]);
+        reportError(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeName.name]);
+      } else if (isTypeNameInAsExpression(node)) {
+        reportError(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
+      } else if (isTypeNameInIsExpression(node)) {
+        reportError(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
+      } else if (isTypeNameTargetInRedirectedConstructor(node)) {
+        reportError(StaticWarningCode.REDIRECT_TO_NON_CLASS, typeName, [typeName.name]);
       } else {
-        reportError(StaticWarningCode.UNDEFINED_CLASS, typeNameSimple, [typeNameSimple.name]);
+        reportError(StaticWarningCode.UNDEFINED_CLASS, typeName, [typeName.name]);
       }
       elementValid = false;
     }
@@ -8001,7 +8059,11 @@
       }
     } else {
       if (isTypeNameInCatchClause(node)) {
-        reportError(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, node, [node]);
+        reportError(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, [typeName.name]);
+      } else if (isTypeNameInAsExpression(node)) {
+        reportError(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
+      } else if (isTypeNameInIsExpression(node)) {
+        reportError(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
       }
       setElement(typeName, _dynamicType.element);
       typeName.staticType = _dynamicType;
@@ -8201,9 +8263,23 @@
   }
 
   /**
-   * Checks if the given type name is used as the exception type in the catch clause.
+   * Checks if the given type name is used as the type in an as expression.
    * @param typeName the type name to analyzer
-   * @return {@code true} if the given type name is used as the exception type in the catch clause.
+   * @return {@code true} if the given type name is used as the type in an as expression
+   */
+  bool isTypeNameInAsExpression(TypeName typeName) {
+    ASTNode parent2 = typeName.parent;
+    if (parent2 is AsExpression) {
+      AsExpression asExpression = parent2 as AsExpression;
+      return identical(asExpression.type, typeName);
+    }
+    return false;
+  }
+
+  /**
+   * Checks if the given type name is used as the exception type in a catch clause.
+   * @param typeName the type name to analyzer
+   * @return {@code true} if the given type name is used as the exception type in a catch clause
    */
   bool isTypeNameInCatchClause(TypeName typeName) {
     ASTNode parent2 = typeName.parent;
@@ -8215,9 +8291,9 @@
   }
 
   /**
-   * Checks if the given type name is used as the type in the instance creation expression.
+   * Checks if the given type name is used as the type in an instance creation expression.
    * @param typeName the type name to analyzer
-   * @return {@code true} if the given type name is used as the type in the instance creation
+   * @return {@code true} if the given type name is used as the type in an instance creation
    * expression
    */
   bool isTypeNameInInstanceCreationExpression(TypeName typeName) {
@@ -8230,6 +8306,38 @@
   }
 
   /**
+   * Checks if the given type name is used as the type in an is expression.
+   * @param typeName the type name to analyzer
+   * @return {@code true} if the given type name is used as the type in an is expression
+   */
+  bool isTypeNameInIsExpression(TypeName typeName) {
+    ASTNode parent2 = typeName.parent;
+    if (parent2 is IsExpression) {
+      IsExpression isExpression = parent2 as IsExpression;
+      return identical(isExpression.type, typeName);
+    }
+    return false;
+  }
+
+  /**
+   * Checks if the given type name is the target in a redirected constructor.
+   * @param typeName the type name to analyzer
+   * @return {@code true} if the given type name is used as the type in a redirected constructor
+   */
+  bool isTypeNameTargetInRedirectedConstructor(TypeName typeName) {
+    ASTNode parent2 = typeName.parent;
+    if (parent2 is ConstructorName) {
+      ConstructorName constructorName = parent2 as ConstructorName;
+      parent2 = constructorName.parent;
+      if (parent2 is ConstructorDeclaration) {
+        ConstructorDeclaration constructorDeclaration = parent2 as ConstructorDeclaration;
+        return constructorName == constructorDeclaration.redirectedConstructor;
+      }
+    }
+    return false;
+  }
+
+  /**
    * Record that the static type of the given node is the given type.
    * @param expression the node whose type is to be recorded
    * @param type the static type of the node
@@ -9766,7 +9874,7 @@
       checkForMultipleSuperInitializers(node);
       checkForRecursiveConstructorRedirect(node);
       checkForRecursiveFactoryRedirect(node);
-      checkForRedirectToInvalidFunction(node);
+      checkForAllRedirectConstructorErrorCodes(node);
       checkForUndefinedConstructorInInitializerImplicit(node);
       checkForRedirectToNonConstConstructor(node);
       return super.visitConstructorDeclaration(node);
@@ -9798,6 +9906,15 @@
     checkForExportInternalLibrary(node);
     return super.visitExportDirective(node);
   }
+  Object visitFieldDeclaration(FieldDeclaration node) {
+    if (!node.isStatic()) {
+      VariableDeclarationList variables = node.fields;
+      if (variables.isConst()) {
+        _errorReporter.reportError4(CompileTimeErrorCode.CONST_INSTANCE_FIELD, variables.keyword, []);
+      }
+    }
+    return super.visitFieldDeclaration(node);
+  }
   Object visitFieldFormalParameter(FieldFormalParameter node) {
     checkForConstFormalParameter(node);
     checkForFieldInitializingFormalRedirectingConstructor(node);
@@ -10283,6 +10400,48 @@
   }
 
   /**
+   * This checks error related to the redirected constructors.
+   * @param node the constructor declaration to evaluate
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#REDIRECT_TO_INVALID_RETURN_TYPE
+   * @see StaticWarningCode#REDIRECT_TO_INVALID_FUNCTION_TYPE
+   * @see StaticWarningCode#REDIRECT_TO_MISSING_CONSTRUCTOR
+   */
+  bool checkForAllRedirectConstructorErrorCodes(ConstructorDeclaration node) {
+    ConstructorName redirectedNode = node.redirectedConstructor;
+    if (redirectedNode == null) {
+      return false;
+    }
+    ConstructorElement redirectedElement = redirectedNode.element;
+    if (redirectedElement == null) {
+      TypeName constructorTypeName = redirectedNode.type;
+      Type2 redirectedType = constructorTypeName.type;
+      if (redirectedType != null && redirectedType.element != null && redirectedType.element != DynamicElementImpl.instance) {
+        String constructorStrName = constructorTypeName.name.name;
+        if (redirectedNode.name != null) {
+          constructorStrName += ".${redirectedNode.name.name}";
+        }
+        _errorReporter.reportError2(StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR, redirectedNode, [constructorStrName, redirectedType.displayName]);
+        return true;
+      }
+      return false;
+    }
+    FunctionType redirectedType = redirectedElement.type;
+    Type2 redirectedReturnType = redirectedType.returnType;
+    FunctionType constructorType = node.element.type;
+    Type2 constructorReturnType = constructorType.returnType;
+    if (!redirectedReturnType.isSubtypeOf(constructorReturnType)) {
+      _errorReporter.reportError2(StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, redirectedNode, [redirectedReturnType, constructorReturnType]);
+      return true;
+    }
+    if (!redirectedType.isSubtypeOf(constructorType)) {
+      _errorReporter.reportError2(StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE, redirectedNode, [redirectedType, constructorType]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
    * This checks that the return statement of the form <i>return e;</i> is not in a generative
    * constructor.
    * <p>
@@ -11200,7 +11359,7 @@
       NodeList<VariableDeclaration> variables2 = node.variables;
       for (VariableDeclaration variable in variables2) {
         if (variable.initializer == null) {
-          _errorReporter.reportError2(CompileTimeErrorCode.FINAL_NOT_INITIALIZED, variable, [variable.name.name]);
+          _errorReporter.reportError2(StaticWarningCode.FINAL_NOT_INITIALIZED, variable, [variable.name.name]);
           foundError = true;
         }
       }
@@ -11728,16 +11887,25 @@
       return false;
     }
     List<ExecutableElement> missingOverridesArray = new List.from(missingOverrides);
+    List<String> stringTypeArray = new List<String>(Math.min(missingOverridesSize, 4));
+    String GET = "get ";
+    String SET = "set ";
+    for (int i = 0; i < stringTypeArray.length; i++) {
+      stringTypeArray[i] = StringUtilities.EMPTY;
+      if (missingOverridesArray[i] is PropertyAccessorElement) {
+        stringTypeArray[i] = ((missingOverridesArray[i] as PropertyAccessorElement)).isGetter() ? GET : SET;
+      }
+    }
     if (missingOverridesSize == 1) {
-      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, node.name, [missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName]);
+      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName]);
     } else if (missingOverridesSize == 2) {
-      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, node.name, [missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName]);
+      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName]);
     } else if (missingOverridesSize == 3) {
-      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, node.name, [missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName]);
+      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName]);
     } else if (missingOverridesSize == 4) {
-      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, node.name, [missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName, missingOverridesArray[3].enclosingElement.displayName, missingOverridesArray[3].displayName]);
+      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName, stringTypeArray[3], missingOverridesArray[3].enclosingElement.displayName, missingOverridesArray[3].displayName]);
     } else {
-      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, node.name, [missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName, missingOverridesArray[3].enclosingElement.displayName, missingOverridesArray[3].displayName, missingOverridesArray.length - 4]);
+      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName, stringTypeArray[3], missingOverridesArray[3].enclosingElement.displayName, missingOverridesArray[3].displayName, missingOverridesArray.length - 4]);
     }
     return true;
   }
@@ -12038,38 +12206,6 @@
   }
 
   /**
-   * This checks if the passed constructor declaration has redirected constructor with compatible
-   * function type.
-   * @param node the constructor declaration to evaluate
-   * @return {@code true} if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#REDIRECT_TO_INVALID_RETURN_TYPE
-   * @see StaticWarningCode#REDIRECT_TO_INVALID_FUNCTION_TYPE
-   */
-  bool checkForRedirectToInvalidFunction(ConstructorDeclaration node) {
-    ConstructorName redirectedNode = node.redirectedConstructor;
-    if (redirectedNode == null) {
-      return false;
-    }
-    ConstructorElement redirectedElement = redirectedNode.element;
-    if (redirectedElement == null) {
-      return false;
-    }
-    FunctionType redirectedType = redirectedElement.type;
-    Type2 redirectedReturnType = redirectedType.returnType;
-    FunctionType constructorType = node.element.type;
-    Type2 constructorReturnType = constructorType.returnType;
-    if (!redirectedReturnType.isSubtypeOf(constructorReturnType)) {
-      _errorReporter.reportError2(StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, redirectedNode, [redirectedReturnType, constructorReturnType]);
-      return true;
-    }
-    if (!redirectedType.isSubtypeOf(constructorType)) {
-      _errorReporter.reportError2(StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE, redirectedNode, [redirectedType, constructorType]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
    * This checks if the passed constructor declaration has redirected constructor and references
    * itself directly or indirectly. TODO(scheglov)
    * @param node the constructor declaration to evaluate
@@ -12245,8 +12381,9 @@
   }
 
   /**
-   * This checks that if the passed generative constructor has no explicit super constructor
-   * invocation, then super class has the default generative constructor.
+   * This checks that if the passed generative constructor has neither an explicit super constructor
+   * invocation nor a redirecting constructor invocation, that the superclass has a default
+   * generative constructor.
    * @param node the constructor declaration to evaluate
    * @return {@code true} if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT
@@ -12256,6 +12393,11 @@
     if (node.factoryKeyword != null) {
       return false;
     }
+    for (ConstructorInitializer constructorInitializer in node.initializers) {
+      if (constructorInitializer is SuperConstructorInvocation || constructorInitializer is RedirectingConstructorInvocation) {
+        return false;
+      }
+    }
     if (_enclosingClass == null) {
       return false;
     }
@@ -12264,11 +12406,6 @@
       return false;
     }
     ClassElement superElement = superType.element;
-    for (ConstructorInitializer constructorInitializer in node.initializers) {
-      if (constructorInitializer is SuperConstructorInvocation) {
-        return false;
-      }
-    }
     ConstructorElement superDefaultConstructor = superElement.unnamedConstructor;
     if (superDefaultConstructor != null) {
       if (superDefaultConstructor.isFactory()) {
@@ -12485,6 +12622,7 @@
   INIT_STATE(this.name, this.ordinal) {
   }
   int compareTo(INIT_STATE other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
@@ -12554,7 +12692,7 @@
    * @param path the path to be validated (not {@code null})
    * @return {@code true} if the import path contains ".."
    */
-  bool checkForPackageImportContainsDotDot(String path) => path.contains("/../");
+  bool checkForPackageImportContainsDotDot(String path) => path.startsWith("../") || path.contains("/../");
 
   /**
    * Answer the full name of the source associated with the compilation unit containing the given
@@ -12621,5 +12759,6 @@
   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 2da3af1..091e88c 100644
--- a/pkg/analyzer_experimental/lib/src/generated/scanner.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/scanner.dart
@@ -158,6 +158,7 @@
   String get message => _message;
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
   int compareTo(ScannerErrorCode other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
@@ -312,6 +313,7 @@
    */
   bool isPseudoKeyword() => _isPseudoKeyword2;
   int compareTo(Keyword other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
@@ -1806,6 +1808,7 @@
    */
   int get precedence => _precedence;
   int compareTo(TokenClass other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
@@ -2033,6 +2036,7 @@
    */
   bool 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 {
diff --git a/pkg/analyzer_experimental/lib/src/generated/source.dart b/pkg/analyzer_experimental/lib/src/generated/source.dart
index 1fec215..da272e9 100644
--- a/pkg/analyzer_experimental/lib/src/generated/source.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/source.dart
@@ -420,6 +420,7 @@
   SourceKind(this.name, this.ordinal) {
   }
   int compareTo(SourceKind other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
@@ -490,6 +491,7 @@
    */
   int get encoding => _encoding;
   int compareTo(UriKind other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 /**
diff --git a/pkg/analyzer_experimental/lib/src/generated/source_io.dart b/pkg/analyzer_experimental/lib/src/generated/source_io.dart
index 3decc7b..e473fc9 100644
--- a/pkg/analyzer_experimental/lib/src/generated/source_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/source_io.dart
@@ -234,7 +234,7 @@
         AnalysisEngine.instance.logger.logError2("Canonical failed: ${pkgDir}", e);
       }
     }
-    return new JavaFile.relative(pkgDir, relPath.replaceAll('/', JavaFile.separatorChar));
+    return new JavaFile.relative(pkgDir, relPath.replaceAll('/', new String.fromCharCode(JavaFile.separatorChar)));
   }
 }
 /**
diff --git a/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart b/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
index ee959a3..80804cd 100644
--- a/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
@@ -38,5 +38,6 @@
    */
   bool 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/test/generated/ast_test.dart b/pkg/analyzer_experimental/test/generated/ast_test.dart
index 10c7928..a458f11 100644
--- a/pkg/analyzer_experimental/test/generated/ast_test.dart
+++ b/pkg/analyzer_experimental/test/generated/ast_test.dart
@@ -182,6 +182,35 @@
     });
   }
 }
+class VariableDeclarationTest extends ParserTestCase {
+  void test_getDocumentationComment_onGrandParent() {
+    VariableDeclaration varDecl = ASTFactory.variableDeclaration("a");
+    TopLevelVariableDeclaration decl = ASTFactory.topLevelVariableDeclaration2(Keyword.VAR, [varDecl]);
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    JUnitTestCase.assertNull(varDecl.documentationComment);
+    decl.documentationComment = comment;
+    JUnitTestCase.assertNotNull(varDecl.documentationComment);
+    JUnitTestCase.assertNotNull(decl.documentationComment);
+  }
+  void test_getDocumentationComment_onNode() {
+    VariableDeclaration decl = ASTFactory.variableDeclaration("a");
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    decl.documentationComment = comment;
+    JUnitTestCase.assertNotNull(decl.documentationComment);
+  }
+  static dartSuite() {
+    _ut.group('VariableDeclarationTest', () {
+      _ut.test('test_getDocumentationComment_onGrandParent', () {
+        final __test = new VariableDeclarationTest();
+        runJUnitTest(__test, __test.test_getDocumentationComment_onGrandParent);
+      });
+      _ut.test('test_getDocumentationComment_onNode', () {
+        final __test = new VariableDeclarationTest();
+        runJUnitTest(__test, __test.test_getDocumentationComment_onNode);
+      });
+    });
+  }
+}
 /**
  * The class {@code ASTFactory} defines utility methods that can be used to create AST nodes. The
  * nodes that are created are complete in the sense that all of the tokens that would have been
@@ -679,6 +708,7 @@
   AssignmentKind(this.name, this.ordinal) {
   }
   int compareTo(AssignmentKind other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 class WrapperKind implements Comparable<WrapperKind> {
@@ -697,6 +727,7 @@
   WrapperKind(this.name, this.ordinal) {
   }
   int compareTo(WrapperKind other) => ordinal - other.ordinal;
+  int get hashCode => ordinal;
   String toString() => name;
 }
 class BreadthFirstVisitorTest extends ParserTestCase {
@@ -2910,4 +2941,5 @@
   BreadthFirstVisitorTest.dartSuite();
   IndexExpressionTest.dartSuite();
   SimpleIdentifierTest.dartSuite();
+  VariableDeclarationTest.dartSuite();
 }
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/test/generated/element_test.dart b/pkg/analyzer_experimental/test/generated/element_test.dart
index ed98686..4b440f0 100644
--- a/pkg/analyzer_experimental/test/generated/element_test.dart
+++ b/pkg/analyzer_experimental/test/generated/element_test.dart
@@ -2279,6 +2279,38 @@
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name"], <ClassElement> [b]).type;
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
   }
+  void test_isSubtypeOf_normalAndPositionalArgs_1() {
+    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));
+  }
+  void test_isSubtypeOf_normalAndPositionalArgs_2() {
+    ClassElement a = ElementFactory.classElement2("A", []);
+    FunctionType t = ElementFactory.functionElement6("t", <ClassElement> [a], <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [a]).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+  }
+  void test_isSubtypeOf_normalAndPositionalArgs_3() {
+    ClassElement a = ElementFactory.classElement2("A", []);
+    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
+    FunctionType s = ElementFactory.functionElement("s").type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+  }
+  void test_isSubtypeOf_normalAndPositionalArgs_4() {
+    ClassElement a = ElementFactory.classElement2("A", []);
+    ClassElement b = ElementFactory.classElement2("B", []);
+    ClassElement c = ElementFactory.classElement2("C", []);
+    ClassElement d = ElementFactory.classElement2("D", []);
+    ClassElement e = ElementFactory.classElement2("E", []);
+    FunctionType t = ElementFactory.functionElement6("t", <ClassElement> [a, b], <ClassElement> [c, d, e]).type;
+    FunctionType s = ElementFactory.functionElement6("s", <ClassElement> [a, b, c], <ClassElement> [d]).type;
+    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+  }
   void test_isSubtypeOf_normalParameters_isAssignable() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
@@ -2311,7 +2343,7 @@
     InterfaceType t = ElementFactory.object.type;
     JUnitTestCase.assertTrue(f.isSubtypeOf(t));
   }
-  void test_isSubtypeOf_optionalParameters_isAssignable() {
+  void test_isSubtypeOf_positionalParameters_isAssignable() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
@@ -2319,19 +2351,19 @@
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
     JUnitTestCase.assertTrue(s.isSubtypeOf(t));
   }
-  void test_isSubtypeOf_optionalParameters_isNotAssignable() {
+  void test_isSubtypeOf_positionalParameters_isNotAssignable() {
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [ElementFactory.classElement2("A", [])]).type;
     FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [ElementFactory.classElement2("B", [])]).type;
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
   }
-  void test_isSubtypeOf_optionalParameters_sHasMoreParams() {
+  void test_isSubtypeOf_positionalParameters_sHasMoreParams() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
     FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [b, b]).type;
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
   }
-  void test_isSubtypeOf_optionalParameters_tHasMoreParams() {
+  void test_isSubtypeOf_positionalParameters_tHasMoreParams() {
     ClassElement a = ElementFactory.classElement2("A", []);
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a, a]).type;
@@ -2339,7 +2371,7 @@
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
   }
   void test_isSubtypeOf_returnType_sIsVoid() {
-    FunctionType t = ElementFactory.functionElement2("t", ElementFactory.classElement2("A", [])).type;
+    FunctionType t = ElementFactory.functionElement("t").type;
     FunctionType s = ElementFactory.functionElement("s").type;
     JUnitTestCase.assertTrue(VoidTypeImpl.instance == s.returnType);
     JUnitTestCase.assertTrue(t.isSubtypeOf(s));
@@ -2364,13 +2396,6 @@
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
     JUnitTestCase.assertFalse(s.isSubtypeOf(t));
   }
-  void test_isSubtypeOf_wrongFunctionType_normal_optional() {
-    ClassElement a = ElementFactory.classElement2("A", []);
-    FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [a]).type;
-    FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [a]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
-  }
   void test_isSubtypeOf_wrongFunctionType_optional_named() {
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
@@ -2544,6 +2569,22 @@
         final __test = new FunctionTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_namedParameters_tHasMoreParams);
       });
+      _ut.test('test_isSubtypeOf_normalAndPositionalArgs_1', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_normalAndPositionalArgs_1);
+      });
+      _ut.test('test_isSubtypeOf_normalAndPositionalArgs_2', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_normalAndPositionalArgs_2);
+      });
+      _ut.test('test_isSubtypeOf_normalAndPositionalArgs_3', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_normalAndPositionalArgs_3);
+      });
+      _ut.test('test_isSubtypeOf_normalAndPositionalArgs_4', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_normalAndPositionalArgs_4);
+      });
       _ut.test('test_isSubtypeOf_normalParameters_isAssignable', () {
         final __test = new FunctionTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_normalParameters_isAssignable);
@@ -2560,21 +2601,21 @@
         final __test = new FunctionTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_normalParameters_tHasMoreParams);
       });
-      _ut.test('test_isSubtypeOf_optionalParameters_isAssignable', () {
+      _ut.test('test_isSubtypeOf_positionalParameters_isAssignable', () {
         final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_optionalParameters_isAssignable);
+        runJUnitTest(__test, __test.test_isSubtypeOf_positionalParameters_isAssignable);
       });
-      _ut.test('test_isSubtypeOf_optionalParameters_isNotAssignable', () {
+      _ut.test('test_isSubtypeOf_positionalParameters_isNotAssignable', () {
         final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_optionalParameters_isNotAssignable);
+        runJUnitTest(__test, __test.test_isSubtypeOf_positionalParameters_isNotAssignable);
       });
-      _ut.test('test_isSubtypeOf_optionalParameters_sHasMoreParams', () {
+      _ut.test('test_isSubtypeOf_positionalParameters_sHasMoreParams', () {
         final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_optionalParameters_sHasMoreParams);
+        runJUnitTest(__test, __test.test_isSubtypeOf_positionalParameters_sHasMoreParams);
       });
-      _ut.test('test_isSubtypeOf_optionalParameters_tHasMoreParams', () {
+      _ut.test('test_isSubtypeOf_positionalParameters_tHasMoreParams', () {
         final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_optionalParameters_tHasMoreParams);
+        runJUnitTest(__test, __test.test_isSubtypeOf_positionalParameters_tHasMoreParams);
       });
       _ut.test('test_isSubtypeOf_returnType_sIsVoid', () {
         final __test = new FunctionTypeImplTest();
@@ -2592,10 +2633,6 @@
         final __test = new FunctionTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_wrongFunctionType_normal_named);
       });
-      _ut.test('test_isSubtypeOf_wrongFunctionType_normal_optional', () {
-        final __test = new FunctionTypeImplTest();
-        runJUnitTest(__test, __test.test_isSubtypeOf_wrongFunctionType_normal_optional);
-      });
       _ut.test('test_isSubtypeOf_wrongFunctionType_optional_named', () {
         final __test = new FunctionTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_wrongFunctionType_optional_named);
diff --git a/pkg/analyzer_experimental/test/generated/resolver_test.dart b/pkg/analyzer_experimental/test/generated/resolver_test.dart
index 4884cbe..77231c2 100644
--- a/pkg/analyzer_experimental/test/generated/resolver_test.dart
+++ b/pkg/analyzer_experimental/test/generated/resolver_test.dart
@@ -527,6 +527,12 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_argumentTypeNotAssignable_classWithCall_Function() {
+    Source source = addSource(EngineTestCase.createSource(["  caller(Function callee) {", "    callee();", "  }", "", "  class CallMeBack {", "    call() => 0;", "  }", "", "  main() {", "    caller(new CallMeBack());", "  }"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_argumentTypeNotAssignable_invocation_functionParameter_generic() {
     Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  m(f(K k), K v) {", "    f(v);", "  }", "}"]));
     resolve(source);
@@ -636,12 +642,6 @@
     assertNoErrors();
     verify([source]);
   }
-  void test_constConstructorWithNonFinalField_constInstanceVar() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  const int x = 0;", "  const A();", "}"]));
-    resolve(source);
-    assertNoErrors();
-    verify([source]);
-  }
   void test_constConstructorWithNonFinalField_finalInstanceVar() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x = 0;", "  const A();", "}"]));
     resolve(source);
@@ -685,7 +685,7 @@
     verify([source]);
   }
   void test_constWithTypeParameters_direct() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  const V = const A<int>();", "  const A();", "}"]));
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  static const V = const A<int>();", "  const A();", "}"]));
     resolve(source);
     assertNoErrors();
     verify([source]);
@@ -1457,6 +1457,12 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_undefinedConstructorInInitializer_redirecting() {
+    Source source = addSource(EngineTestCase.createSource(["class Foo {", "  Foo.ctor();", "}", "class Bar extends Foo {", "  Bar() : this.ctor();", "  Bar.ctor() : super.ctor();", "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_undefinedGetter_noSuchMethod_getter() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  noSuchMethod(invocation) {}", "}", "f() {", "  (new A()).g;", "}"]));
     resolve(source);
@@ -1587,6 +1593,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_Object_Function);
       });
+      _ut.test('test_argumentTypeNotAssignable_classWithCall_Function', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_argumentTypeNotAssignable_classWithCall_Function);
+      });
       _ut.test('test_argumentTypeNotAssignable_invocation_functionParameter_generic', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_invocation_functionParameter_generic);
@@ -1655,10 +1665,6 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_conflictingStaticSetterAndInstanceMember_thisClass_method);
       });
-      _ut.test('test_constConstructorWithNonFinalField_constInstanceVar', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_constInstanceVar);
-      });
       _ut.test('test_constConstructorWithNonFinalField_finalInstanceVar', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_constConstructorWithNonFinalField_finalInstanceVar);
@@ -2199,6 +2205,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_implicit_typedef);
       });
+      _ut.test('test_undefinedConstructorInInitializer_redirecting', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_undefinedConstructorInInitializer_redirecting);
+      });
       _ut.test('test_undefinedGetter_noSuchMethod_getter', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedGetter_noSuchMethod_getter);
@@ -2433,10 +2443,22 @@
     assertErrors([StaticTypeWarningCode.TYPE_ARGUMENT_VIOLATES_BOUNDS]);
     verify([source]);
   }
-  void test_inconsistentMethodInheritanceGetterAndMethod() {
-    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  int x();", "}", "abstract class B {", "  int get x;", "}", "class C implements A, B {", "}"]));
+  void test_inconsistentMethodInheritance_paramCount() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  int x();", "}", "abstract class B {", "  int x(int y);", "}", "class C implements A, B {", "}"]));
     resolve(source);
-    assertErrors([StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
+    assertErrors([StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+    verify([source]);
+  }
+  void test_inconsistentMethodInheritance_paramType() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  x(int i);", "}", "abstract class B {", "  x(String s);", "}", "abstract class C implements A, B {}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+    verify([source]);
+  }
+  void test_inconsistentMethodInheritance_returnType() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  int x();", "}", "abstract class B {", "  String x();", "}", "abstract class C implements A, B {}"]));
+    resolve(source);
+    assertErrors([StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
     verify([source]);
   }
   void test_invalidAssignment_compoundAssignment() {
@@ -2631,9 +2653,17 @@
   }
   static dartSuite() {
     _ut.group('StaticTypeWarningCodeTest', () {
-      _ut.test('test_inconsistentMethodInheritanceGetterAndMethod', () {
+      _ut.test('test_inconsistentMethodInheritance_paramCount', () {
         final __test = new StaticTypeWarningCodeTest();
-        runJUnitTest(__test, __test.test_inconsistentMethodInheritanceGetterAndMethod);
+        runJUnitTest(__test, __test.test_inconsistentMethodInheritance_paramCount);
+      });
+      _ut.test('test_inconsistentMethodInheritance_paramType', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_inconsistentMethodInheritance_paramType);
+      });
+      _ut.test('test_inconsistentMethodInheritance_returnType', () {
+        final __test = new StaticTypeWarningCodeTest();
+        runJUnitTest(__test, __test.test_inconsistentMethodInheritance_returnType);
       });
       _ut.test('test_invalidAssignment_compoundAssignment', () {
         final __test = new StaticTypeWarningCodeTest();
@@ -3820,12 +3850,6 @@
     assertErrors([CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
-  void fail_finalNotInitialized_inConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x;", "  A() {}", "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
-    verify([source]);
-  }
   void fail_invalidOverrideDefaultValue() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  m([a = 0]) {}", "}", "class B extends A {", "  m([a = 1]) {}", "}"]));
     resolve(source);
@@ -4203,6 +4227,12 @@
     assertErrors([CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
     verify([source]);
   }
+  void test_constInstanceField() {
+    Source source = addSource(EngineTestCase.createSource(["class C {", "  const int f = 0;", "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.CONST_INSTANCE_FIELD]);
+    verify([source]);
+  }
   void test_constWithInvalidTypeParameters() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "f() { return const A<A>(); }"]));
     resolve(source);
@@ -4228,13 +4258,13 @@
     verify([source]);
   }
   void test_constWithTypeParameters_direct() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  const V = const A<T>();", "  const A();", "}"]));
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  static const V = const A<T>();", "  const A();", "}"]));
     resolve(source);
     assertErrors([CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS]);
     verify([source]);
   }
   void test_constWithTypeParameters_indirect() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  const V = const A<List<T>>();", "  const A();", "}"]));
+    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  static const V = const A<List<T>>();", "  const A();", "}"]));
     resolve(source);
     assertErrors([CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS]);
     verify([source]);
@@ -4403,12 +4433,6 @@
     assertErrors([CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
     verify([source]);
   }
-  void test_fieldInitializedInInitializerAndDeclaration_const() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  const int x = 0;", "  A() : x = 1 {}", "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
-    verify([source]);
-  }
   void test_fieldInitializedInInitializerAndDeclaration_final() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x = 0;", "  A() : x = 1 {}", "}"]));
     resolve(source);
@@ -4512,54 +4536,6 @@
     assertErrors([CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES]);
     verify([source]);
   }
-  void test_finalNotInitialized_instanceField_const() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  const F;", "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
-    verify([source]);
-  }
-  void test_finalNotInitialized_instanceField_const_static() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static const F;", "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
-    verify([source]);
-  }
-  void test_finalNotInitialized_instanceField_final() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final F;", "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
-    verify([source]);
-  }
-  void test_finalNotInitialized_instanceField_final_static() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static final F;", "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
-    verify([source]);
-  }
-  void test_finalNotInitialized_library_const() {
-    Source source = addSource(EngineTestCase.createSource(["const F;"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
-    verify([source]);
-  }
-  void test_finalNotInitialized_library_final() {
-    Source source = addSource(EngineTestCase.createSource(["final F;"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
-    verify([source]);
-  }
-  void test_finalNotInitialized_local_const() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  const int x;", "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
-    verify([source]);
-  }
-  void test_finalNotInitialized_local_final() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  final int x;", "}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.FINAL_NOT_INITIALIZED]);
-    verify([source]);
-  }
   void test_getterAndMethodWithSameName() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  x(y) {}", "  get x => 0;", "}"]));
     resolve(source);
@@ -5584,6 +5560,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_constInitializedWithNonConstValue_missingConstInMapLiteral);
       });
+      _ut.test('test_constInstanceField', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constInstanceField);
+      });
       _ut.test('test_constWithInvalidTypeParameters', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_constWithInvalidTypeParameters);
@@ -5716,10 +5696,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_fieldInitializedByMultipleInitializers_multipleNames);
       });
-      _ut.test('test_fieldInitializedInInitializerAndDeclaration_const', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_fieldInitializedInInitializerAndDeclaration_const);
-      });
       _ut.test('test_fieldInitializedInInitializerAndDeclaration_final', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_fieldInitializedInInitializerAndDeclaration_final);
@@ -5776,38 +5752,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_finalInitializedMultipleTimes_initializingFormals);
       });
-      _ut.test('test_finalNotInitialized_instanceField_const', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalNotInitialized_instanceField_const);
-      });
-      _ut.test('test_finalNotInitialized_instanceField_const_static', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalNotInitialized_instanceField_const_static);
-      });
-      _ut.test('test_finalNotInitialized_instanceField_final', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalNotInitialized_instanceField_final);
-      });
-      _ut.test('test_finalNotInitialized_instanceField_final_static', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalNotInitialized_instanceField_final_static);
-      });
-      _ut.test('test_finalNotInitialized_library_const', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalNotInitialized_library_const);
-      });
-      _ut.test('test_finalNotInitialized_library_final', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalNotInitialized_library_final);
-      });
-      _ut.test('test_finalNotInitialized_local_const', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalNotInitialized_local_const);
-      });
-      _ut.test('test_finalNotInitialized_local_final', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_finalNotInitialized_local_final);
-      });
       _ut.test('test_getterAndMethodWithSameName', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_getterAndMethodWithSameName);
@@ -7419,6 +7363,11 @@
     resolve(source);
     assertErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST, PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT]);
   }
+  void test_import_packageWithLeadingDotDot() {
+    Source source = addSource(EngineTestCase.createSource(["import 'package:../other.dart';"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST, PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT]);
+  }
   void test_import_referenceIntoLibDirectory() {
     Source source = addSource(EngineTestCase.createSource(["import '../lib/other.dart';"]));
     resolve(source);
@@ -7440,6 +7389,10 @@
         final __test = new PubSuggestionCodeTest();
         runJUnitTest(__test, __test.test_import_packageWithDotDot);
       });
+      _ut.test('test_import_packageWithLeadingDotDot', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_packageWithLeadingDotDot);
+      });
       _ut.test('test_import_referenceIntoLibDirectory', () {
         final __test = new PubSuggestionCodeTest();
         runJUnitTest(__test, __test.test_import_referenceIntoLibDirectory);
@@ -7462,12 +7415,6 @@
     assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
-  void fail_castToNonType() {
-    Source source = addSource(EngineTestCase.createSource(["var A = 0;", "f(String s) { var x = s as A; }"]));
-    resolve(source);
-    assertErrors([StaticWarningCode.CAST_TO_NON_TYPE]);
-    verify([source]);
-  }
   void fail_commentReferenceConstructorNotVisible() {
     Source source = addSource(EngineTestCase.createSource([]));
     resolve(source);
@@ -7498,6 +7445,12 @@
     assertErrors([StaticWarningCode.COMMENT_REFERENCE_URI_NOT_LIBRARY]);
     verify([source]);
   }
+  void fail_finalNotInitialized_inConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x;", "  A() {}", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.FINAL_NOT_INITIALIZED]);
+    verify([source]);
+  }
   void fail_incorrectNumberOfArguments_tooFew() {
     Source source = addSource(EngineTestCase.createSource(["f(a, b) => 0;", "g() {", "  f(2);", "}"]));
     resolve(source);
@@ -7540,24 +7493,6 @@
     assertErrors([StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
     verify([source]);
   }
-  void fail_nonType() {
-    Source source = addSource(EngineTestCase.createSource(["var A = 0;", "f(var p) {", "  if (p is A) {", "  }", "}"]));
-    resolve(source);
-    assertErrors([StaticWarningCode.NON_TYPE]);
-    verify([source]);
-  }
-  void fail_redirectToMissingConstructor() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source);
-    assertErrors([StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
-    verify([source]);
-  }
-  void fail_redirectToNonClass() {
-    Source source = addSource(EngineTestCase.createSource([]));
-    resolve(source);
-    assertErrors([StaticWarningCode.REDIRECT_TO_NON_CLASS]);
-    verify([source]);
-  }
   void fail_undefinedGetter() {
     Source source = addSource(EngineTestCase.createSource([]));
     resolve(source);
@@ -7751,6 +7686,12 @@
     assertErrors([StaticWarningCode.CASE_BLOCK_NOT_TERMINATED]);
     verify([source]);
   }
+  void test_castToNonType() {
+    Source source = addSource(EngineTestCase.createSource(["var A = 0;", "f(String s) { var x = s as A; }"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.CAST_TO_NON_TYPE]);
+    verify([source]);
+  }
   void test_concreteClassWithAbstractMember() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  m();", "}"]));
     resolve(source);
@@ -7867,6 +7808,48 @@
     assertErrors([StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE]);
     verify([source]);
   }
+  void test_finalNotInitialized_instanceField_const_static() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static const F;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.FINAL_NOT_INITIALIZED]);
+    verify([source]);
+  }
+  void test_finalNotInitialized_instanceField_final() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  final F;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.FINAL_NOT_INITIALIZED]);
+    verify([source]);
+  }
+  void test_finalNotInitialized_instanceField_final_static() {
+    Source source = addSource(EngineTestCase.createSource(["class A {", "  static final F;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.FINAL_NOT_INITIALIZED]);
+    verify([source]);
+  }
+  void test_finalNotInitialized_library_const() {
+    Source source = addSource(EngineTestCase.createSource(["const F;"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.FINAL_NOT_INITIALIZED]);
+    verify([source]);
+  }
+  void test_finalNotInitialized_library_final() {
+    Source source = addSource(EngineTestCase.createSource(["final F;"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.FINAL_NOT_INITIALIZED]);
+    verify([source]);
+  }
+  void test_finalNotInitialized_local_const() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  const int x;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.FINAL_NOT_INITIALIZED]);
+    verify([source]);
+  }
+  void test_finalNotInitialized_local_final() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  final int x;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.FINAL_NOT_INITIALIZED]);
+    verify([source]);
+  }
   void test_importDuplicatedLibraryName() {
     Source source = addSource(EngineTestCase.createSource(["library test;", "import 'lib1.dart';", "import 'lib2.dart';"]));
     addSource2("/lib1.dart", "library lib;");
@@ -7875,10 +7858,10 @@
     assertErrors([StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAME]);
     verify([source]);
   }
-  void test_inconsistentMethodInheritance() {
-    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  x(int i);", "}", "abstract class B {", "  x(String s);", "}", "abstract class C implements A, B {}"]));
+  void test_inconsistentMethodInheritanceGetterAndMethod() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  int x();", "}", "abstract class B {", "  int get x;", "}", "class C implements A, B {", "}"]));
     resolve(source);
-    assertErrors([StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+    assertErrors([StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
     verify([source]);
   }
   void test_instanceMethodNameCollidesWithSuperclassStatic_field() {
@@ -8066,6 +8049,12 @@
     assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
+  void test_nonAbstractClassInheritsAbstractMemberOne_method_optionalParamCount() {
+    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  int x(int a);", "}", "abstract class B {", "  int x(int a, [int b]);", "}", "class C implements A, B {", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
   void test_nonAbstractClassInheritsAbstractMemberOne_setter_fromInterface() {
     Source source = addSource(EngineTestCase.createSource(["class I {", "  set s(int i) {}", "}", "class C implements I {", "}"]));
     resolve(source);
@@ -8145,6 +8134,22 @@
     assertErrors([StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE]);
     verify([source]);
   }
+  void test_redirectToMissingConstructor_named() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements B{", "  A() {}", "}", "class B {", "  B() = A.name;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
+  }
+  void test_redirectToMissingConstructor_unnamed() {
+    Source source = addSource(EngineTestCase.createSource(["class A implements B{", "  A.name() {}", "}", "class B {", "  B() = A;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
+  }
+  void test_redirectToNonClass() {
+    Source source = addSource(EngineTestCase.createSource(["class B {", "  B() = A;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.REDIRECT_TO_NON_CLASS]);
+    verify([source]);
+  }
   void test_returnWithoutValue() {
     Source source = addSource(EngineTestCase.createSource(["int f() { return; }"]));
     resolve(source);
@@ -8187,6 +8192,12 @@
     assertErrors([StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE]);
     verify([source]);
   }
+  void test_typeTestNonType() {
+    Source source = addSource(EngineTestCase.createSource(["var A = 0;", "f(var p) {", "  if (p is A) {", "  }", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.TYPE_TEST_NON_TYPE]);
+    verify([source]);
+  }
   void test_undefinedClass_instanceCreation() {
     Source source = addSource(EngineTestCase.createSource(["f() { new C(); }"]));
     resolve(source);
@@ -8328,6 +8339,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_caseBlockNotTerminated);
       });
+      _ut.test('test_castToNonType', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_castToNonType);
+      });
       _ut.test('test_concreteClassWithAbstractMember', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_concreteClassWithAbstractMember);
@@ -8404,13 +8419,41 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_fieldInitializingFormalNotAssignable);
       });
+      _ut.test('test_finalNotInitialized_instanceField_const_static', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_finalNotInitialized_instanceField_const_static);
+      });
+      _ut.test('test_finalNotInitialized_instanceField_final', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_finalNotInitialized_instanceField_final);
+      });
+      _ut.test('test_finalNotInitialized_instanceField_final_static', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_finalNotInitialized_instanceField_final_static);
+      });
+      _ut.test('test_finalNotInitialized_library_const', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_finalNotInitialized_library_const);
+      });
+      _ut.test('test_finalNotInitialized_library_final', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_finalNotInitialized_library_final);
+      });
+      _ut.test('test_finalNotInitialized_local_const', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_finalNotInitialized_local_const);
+      });
+      _ut.test('test_finalNotInitialized_local_final', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_finalNotInitialized_local_final);
+      });
       _ut.test('test_importDuplicatedLibraryName', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_importDuplicatedLibraryName);
       });
-      _ut.test('test_inconsistentMethodInheritance', () {
+      _ut.test('test_inconsistentMethodInheritanceGetterAndMethod', () {
         final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_inconsistentMethodInheritance);
+        runJUnitTest(__test, __test.test_inconsistentMethodInheritanceGetterAndMethod);
       });
       _ut.test('test_instanceMethodNameCollidesWithSuperclassStatic_field', () {
         final __test = new StaticWarningCodeTest();
@@ -8536,6 +8579,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_method_fromSuperclass);
       });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_method_optionalParamCount', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_method_optionalParamCount);
+      });
       _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_setter_fromInterface', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_setter_fromInterface);
@@ -8588,6 +8635,18 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_redirectToInvalidReturnType);
       });
+      _ut.test('test_redirectToMissingConstructor_named', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_redirectToMissingConstructor_named);
+      });
+      _ut.test('test_redirectToMissingConstructor_unnamed', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_redirectToMissingConstructor_unnamed);
+      });
+      _ut.test('test_redirectToNonClass', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_redirectToNonClass);
+      });
       _ut.test('test_returnWithoutValue', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_returnWithoutValue);
@@ -8616,6 +8675,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_switchExpressionNotAssignable);
       });
+      _ut.test('test_typeTestNonType', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_typeTestNonType);
+      });
       _ut.test('test_undefinedClassBoolean_variableDeclaration', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedClassBoolean_variableDeclaration);
diff --git a/pkg/crypto/lib/crypto.dart b/pkg/crypto/lib/crypto.dart
index 1b764ae..f5f737b 100644
--- a/pkg/crypto/lib/crypto.dart
+++ b/pkg/crypto/lib/crypto.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 dart.crypto;
+library crypto;
 
 import 'dart:math';
 
@@ -54,75 +54,9 @@
 }
 
 /**
- * SHA1 hash function implementation.
- */
-abstract class SHA1 implements Hash {
-  factory SHA1() => new _SHA1();
-}
-
-/**
- * SHA256 hash function implementation.
- */
-abstract class SHA256 implements Hash {
-  factory SHA256() => new _SHA256();
-}
-
-/**
- * MD5 hash function implementation.
- *
- * WARNING: MD5 has known collisions and should only be used when
- * required for backwards compatibility.
- */
-abstract class MD5 implements Hash {
-  factory MD5() => new _MD5();
-}
-
-/**
- * Hash-based Message Authentication Code support.
- *
- * The [add] method is used to add data to the message. The [digest] and
- * [close] methods are used to extract the message authentication code.
- */
-// TODO(floitsch): make Hash implement Sink, EventSink or similar.
-abstract class HMAC {
-  /**
-   * Create an [HMAC] object from a [Hash] and a key.
-   */
-  factory HMAC(Hash hash, List<int> key) => new _HMAC(hash, key);
-
-  /**
-   * Add a list of bytes to the message.
-   */
-  add(List<int> data);
-
-  /**
-   * Perform the actual computation and extract the message digest
-   * as a list of bytes.
-   */
-  List<int> close();
-
-  /**
-   * Extract the message digest as a list of bytes without closing [this].
-   */
-  List<int> get digest;
-
-  /**
-   * Verify that the HMAC computed for the data so far matches the
-   * given message digest.
-   *
-   * This method should be used instead of memcmp-style comparisons
-   * to avoid leaking information via timing.
-   *
-   * Throws an exception if the given digest does not have the same
-   * size as the digest computed by this HMAC instance.
-   */
-  bool verify(List<int> digest);
-}
-
-/**
  * Utility methods for working with message digests.
  */
-abstract class CryptoUtils {
+class CryptoUtils {
   /**
    * Convert a list of bytes (for example a message digest) into a hex
    * string.
@@ -157,26 +91,15 @@
   /**
    * Converts a Base 64 encoded String into list of bytes.
    *
-   * Decoder ignores "\r\n" sequences from input. By default it also ignores
-   * all illegal characters unless [ignoreInvalidCharacters] is false.
+   * Decoder ignores "\r\n" sequences from input.
    *
    * Accepts both URL safe and unsafe Base 64 encoded strings.
    *
+   * Throws a FormatException exception if input contains invalid characters.
+   *
    * Based on [RFC 4648](http://tools.ietf.org/html/rfc4648)
    */
-  static List<int> base64StringToBytes(String input,
-                                       {bool ignoreInvalidCharacters : true}) {
-    return _CryptoUtils.base64StringToBytes(input, ignoreInvalidCharacters);
+  static List<int> base64StringToBytes(String input) {
+    return _CryptoUtils.base64StringToBytes(input);
   }
 }
-
-/**
- * HashExceptions are thrown on invalid use of a Hash
- * object.
- */
-class HashException {
-  HashException(String this.message);
-  toString() => "HashException: $message";
-  String message;
-}
-
diff --git a/pkg/crypto/lib/src/crypto_utils.dart b/pkg/crypto/lib/src/crypto_utils.dart
index e08bbdd..b593c0d 100644
--- a/pkg/crypto/lib/src/crypto_utils.dart
+++ b/pkg/crypto/lib/src/crypto_utils.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.
 
-part of dart.crypto;
+part of crypto;
 
 abstract class _CryptoUtils {
   static String bytesToHex(List<int> bytes) {
@@ -104,21 +104,20 @@
     return new String.fromCharCodes(out);
   }
 
-  static List<int> base64StringToBytes(String input,
-                                       [bool ignoreInvalidCharacters = true]) {
+  static List<int> base64StringToBytes(String input) {
     int len = input.length;
     if (len == 0) {
       return new List<int>(0);
     }
 
     // Count '\r', '\n' and illegal characters, For illegal characters,
-    // if [ignoreInvalidCharacters] is false, throw an exception.
+    // throw an exception.
     int extrasLen = 0;
     for (int i = 0; i < len; i++) {
       int c = _decodeTable[input.codeUnitAt(i)];
       if (c < 0) {
         extrasLen++;
-        if(c == -2 && !ignoreInvalidCharacters) {
+        if(c == -2) {
           throw new FormatException('Invalid character: ${input[i]}');
         }
       }
@@ -129,7 +128,7 @@
           must be a multiple of 4. Input: $input''');
     }
 
-    // Count pad characters, ignore illegal characters at the end.
+    // Count pad characters.
     int padLength = 0;
     for (int i = len - 1; i >= 0; i--) {
       int currentCodeUnit = input.codeUnitAt(i);
diff --git a/pkg/crypto/lib/src/hash_utils.dart b/pkg/crypto/lib/src/hash_utils.dart
index 4188c52..713dbb9 100644
--- a/pkg/crypto/lib/src/hash_utils.dart
+++ b/pkg/crypto/lib/src/hash_utils.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.
 
-part of dart.crypto;
+part of crypto;
 
 // Constants.
 const _MASK_8 = 0xff;
@@ -33,7 +33,7 @@
   // Update the hasher with more data.
   add(List<int> data) {
     if (_digestCalled) {
-      throw new HashException(
+      throw new StateError(
           'Hash update method called after digest was retrieved');
     }
     _lengthInBytes += data.length;
diff --git a/pkg/crypto/lib/src/hmac.dart b/pkg/crypto/lib/src/hmac.dart
index 794746d..59c1771 100644
--- a/pkg/crypto/lib/src/hmac.dart
+++ b/pkg/crypto/lib/src/hmac.dart
@@ -2,18 +2,34 @@
 // 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 dart.crypto;
+part of crypto;
 
-class _HMAC implements HMAC {
+/**
+ * Hash-based Message Authentication Code support.
+ *
+ * The [add] method is used to add data to the message. The [digest] and
+ * [close] methods are used to extract the message authentication code.
+ */
+// TODO(floitsch): make Hash implement Sink, EventSink or similar.
+class HMAC {
   bool _isClosed = false;
 
-  _HMAC(Hash this._hash, List<int> this._key) : _message = [];
+  /**
+   * Create an [HMAC] object from a [Hash] and a key.
+   */
+  HMAC(Hash this._hash, List<int> this._key) : _message = [];
 
+  /**
+   * Add a list of bytes to the message.
+   */
   add(List<int> data) {
     if (_isClosed) throw new StateError("HMAC is closed");
     _message.addAll(data);
   }
 
+  /**
+   * Extract the message digest as a list of bytes without closing [this].
+   */
   List<int> get digest {
     var blockSize = _hash.blockSize;
 
@@ -58,11 +74,25 @@
     return _hash.close();
   }
 
+  /**
+   * Perform the actual computation and extract the message digest
+   * as a list of bytes.
+   */
   List<int> close() {
     _isClosed = true;
     return digest;
   }
 
+  /**
+   * Verify that the HMAC computed for the data so far matches the
+   * given message digest.
+   *
+   * This method should be used instead of memcmp-style comparisons
+   * to avoid leaking information via timing.
+   *
+   * Throws an exception if the given digest does not have the same
+   * size as the digest computed by this HMAC instance.
+   */
   bool verify(List<int> digest) {
     var computedDigest = this.digest;
     if (digest.length != computedDigest.length) {
diff --git a/pkg/crypto/lib/src/md5.dart b/pkg/crypto/lib/src/md5.dart
index 7763832..6acf384 100644
--- a/pkg/crypto/lib/src/md5.dart
+++ b/pkg/crypto/lib/src/md5.dart
@@ -2,11 +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.
 
-part of dart.crypto;
+part of crypto;
 
-// The MD5 hasher is used to compute an MD5 message digest.
-class _MD5 extends _HashBase implements MD5 {
-  _MD5() : super(16, 4, false) {
+/**
+ * MD5 hash function implementation.
+ *
+ * WARNING: MD5 has known collisions and should only be used when
+ * required for backwards compatibility.
+ */
+class MD5 extends _HashBase {
+  MD5() : super(16, 4, false) {
     _h[0] = 0x67452301;
     _h[1] = 0xefcdab89;
     _h[2] = 0x98badcfe;
diff --git a/pkg/crypto/lib/src/sha1.dart b/pkg/crypto/lib/src/sha1.dart
index 8ee28ce..f08c987 100644
--- a/pkg/crypto/lib/src/sha1.dart
+++ b/pkg/crypto/lib/src/sha1.dart
@@ -2,12 +2,14 @@
 // 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 dart.crypto;
+part of crypto;
 
-// The SHA1 hasher is used to compute an SHA1 message digest.
-class _SHA1 extends _HashBase implements SHA1 {
+/**
+ * SHA1 hash function implementation.
+ */
+class SHA1 extends _HashBase {
   // Construct a SHA1 hasher object.
-  _SHA1() : _w = new List(80), super(16, 5, true) {
+  SHA1() : _w = new List(80), super(16, 5, true) {
     _h[0] = 0x67452301;
     _h[1] = 0xEFCDAB89;
     _h[2] = 0x98BADCFE;
diff --git a/pkg/crypto/lib/src/sha256.dart b/pkg/crypto/lib/src/sha256.dart
index 3df0ffd..f1c20e3 100644
--- a/pkg/crypto/lib/src/sha256.dart
+++ b/pkg/crypto/lib/src/sha256.dart
@@ -2,12 +2,14 @@
 // 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 dart.crypto;
+part of crypto;
 
-// The SHA256 hasher is used to compute an SHA256 message digest.
-class _SHA256 extends _HashBase implements SHA256 {
+/**
+ * SHA256 hash function implementation.
+ */
+class SHA256 extends _HashBase {
   // Construct a SHA256 hasher object.
-  _SHA256() : _w = new List(64), super(16, 8, true) {
+  SHA256() : _w = new List(64), super(16, 8, true) {
     // Initial value of the hash parts. First 32 bits of the fractional parts
     // of the square roots of the first 8 prime numbers.
     _h[0] = 0x6a09e667;
diff --git a/pkg/crypto/pubspec.yaml b/pkg/crypto/pubspec.yaml
index cc3c47d..3fd7917 100644
--- a/pkg/crypto/pubspec.yaml
+++ b/pkg/crypto/pubspec.yaml
@@ -1,5 +1,6 @@
 name: crypto
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
+documentation: http://api.dartlang.org/docs/pkg/crypto
 description: >
  Library of cryptographic functions.
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 06ccb56..0f21f41 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -116,6 +116,10 @@
 unittest/test/mock_regexp_negative_test: fail
 unittest/test/mock_stepwise_negative_test: fail
 
+[ $compiler == dart2analyzer ]
+unittest/test/mock_regexp_negative_test: fail
+unittest/test/mock_stepwise_negative_test: fail
+
 [ $compiler == dart2js ]
 unittest/test/instance_test: Skip
 
diff --git a/pkg/unittest/lib/test_controller.js b/pkg/unittest/lib/test_controller.js
index f3932d3..145173a 100644
--- a/pkg/unittest/lib/test_controller.js
+++ b/pkg/unittest/lib/test_controller.js
@@ -121,9 +121,6 @@
   window.postMessage('unittest-suite-external-error', '*');
 }
 
-// If nobody intercepts the error, finish the test.
-window.addEventListener("error", externalError, false);
-
 document.addEventListener('readystatechange', function () {
   if (document.readyState != "loaded") return;
   // If 'startedDartTest' is not set, that means that the test did not have
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index 35d52ba..04006e5 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -83,6 +83,7 @@
   return big.AsValidInteger();
 }
 
+
 DEFINE_NATIVE_ENTRY(Double_trunc_div, 2) {
   double left = Double::CheckedHandle(arguments->NativeArgAt(0)).value();
   GET_NON_NULL_NATIVE_ARGUMENT(Double, right_object, arguments->NativeArgAt(1));
diff --git a/runtime/lib/regexp_patch.dart b/runtime/lib/regexp_patch.dart
index e365f30..fc7797f 100644
--- a/runtime/lib/regexp_patch.dart
+++ b/runtime/lib/regexp_patch.dart
@@ -13,21 +13,21 @@
 }
 
 class _JSRegExpMatch implements Match {
-  _JSRegExpMatch(this.regexp, this.str, this._match);
+  _JSRegExpMatch(this._regexp, this.str, this._match);
 
   int get start => _start(0);
   int get end => _end(0);
 
   int _start(int groupIdx) {
-    return _match[(groupIdx * MATCH_PAIR)];
+    return _match[(groupIdx * _MATCH_PAIR)];
   }
 
   int _end(int groupIdx) {
-    return _match[(groupIdx * MATCH_PAIR) + 1];
+    return _match[(groupIdx * _MATCH_PAIR) + 1];
   }
 
   String group(int groupIdx) {
-    if (groupIdx < 0 || groupIdx > regexp._groupCount) {
+    if (groupIdx < 0 || groupIdx > _regexp._groupCount) {
       throw new RangeError.value(groupIdx);
     }
     int startIndex = _start(groupIdx);
@@ -51,14 +51,14 @@
     return groupsList;
   }
 
-  int get groupCount => regexp._groupCount;
+  int get groupCount => _regexp._groupCount;
 
-  String get pattern => regexp.pattern;
+  Pattern get pattern => _regexp;
 
-  final RegExp regexp;
+  final RegExp _regexp;
   final String str;
   final List<int> _match;
-  static const int MATCH_PAIR = 2;
+  static const int _MATCH_PAIR = 2;
 }
 
 
@@ -78,25 +78,7 @@
 
   Iterable<Match> allMatches(String str) {
     if (str is! String) throw new ArgumentError(str);
-    List<Match> result = new List<Match>();
-    int length = str.length;
-    int startIndex = 0;
-    while (true) {
-      List match = _ExecuteMatch(str, startIndex);
-      if (match == null) {
-        break;
-      }
-      result.add(new _JSRegExpMatch(this, str, match));
-      int endIndex = match[1];
-      if (endIndex == length) {
-        break;
-      } else if (match[0] == endIndex) {
-        ++startIndex;  // empty match, advance and restart
-      } else {
-        startIndex = endIndex;
-      }
-    }
-    return result;
+    return new _AllMatchesIterable(this, str);
   }
 
   bool hasMatch(String str) {
@@ -123,3 +105,47 @@
   List _ExecuteMatch(String str, int start_index)
       native "JSSyntaxRegExp_ExecuteMatch";
 }
+
+class _AllMatchesIterable extends IterableBase<Match> {
+  final _JSSyntaxRegExp _re;
+  final String _str;
+
+  const _AllMatchesIterable(this._re, this._str);
+
+  Iterator<Match> get iterator => new _AllMatchesIterator(_re, _str);
+}
+
+class _AllMatchesIterator implements Iterator<Match> {
+  final String _str;
+  _JSSyntaxRegExp _re;
+  Match _current;
+
+  _AllMatchesIterator(this._re, this._str);
+
+  Match get current => _current;
+
+  bool moveNext() {
+    if (_re == null) return false;  // Cleared after a failed match.
+    int nextIndex = 0;
+    if (_current != null) {
+      nextIndex = _current.end;
+      if (nextIndex == _current.start) {
+        // Zero-width match. Advance by one more.
+        nextIndex++;
+        if (nextIndex > _str.length) {
+          _re = null;
+          _current = null;
+          return false;
+        }
+      }
+    }
+    var match = _re._ExecuteMatch(_str, nextIndex);
+    if (match == null) {
+      _current = null;
+      _re = null;
+      return false;
+    }
+    _current = new _JSRegExpMatch(_re, _str, match);
+    return true;
+  }
+}
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index 0707a5f..3cdb2a1 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -267,9 +267,12 @@
 
   bool contains(Pattern pattern, [int startIndex = 0]) {
     if (pattern is String) {
+      if (startIndex < 0 || startIndex > this.length) {
+        throw new RangeError.range(startIndex, 0, this.length);
+      }
       return indexOf(pattern, startIndex) >= 0;
     }
-    return pattern.allMatches(this.substring(startIndex)).iterator.moveNext();
+    return pattern.allMatches(this.substring(startIndex)).isNotEmpty;
   }
 
   String replaceFirst(Pattern pattern, String replacement) {
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index dedbd9c..9130d89 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -86,3 +86,7 @@
 # has compilation error, as designed
 dart/isolate_mirror_local_test: fail
 
+[ $compiler == dart2analyzer ]
+# has compilation error, as designed
+dart/isolate_mirror_local_test: fail
+
diff --git a/runtime/vm/assembler_arm_test.cc b/runtime/vm/assembler_arm_test.cc
index 0c0296d..9e54e5a 100644
--- a/runtime/vm/assembler_arm_test.cc
+++ b/runtime/vm/assembler_arm_test.cc
@@ -239,8 +239,8 @@
 
 ASSEMBLER_TEST_RUN(DoubleSqrtNeg, test) {
   EXPECT(test != NULL);
-  typedef double (*DoubleFPOperations)();
-  EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(DoubleFPOperations, test->entry()));
+  typedef int (*DoubleSqrtNeg)();
+  EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(DoubleSqrtNeg, test->entry()));
 }
 
 
diff --git a/runtime/vm/ast.cc b/runtime/vm/ast.cc
index 77f14fd..48df7e3 100644
--- a/runtime/vm/ast.cc
+++ b/runtime/vm/ast.cc
@@ -77,7 +77,7 @@
   : AstNode(token_pos),
     vars_(1),
     initializers_(1),
-    body_(NULL) { }
+    nodes_(1) { }
 
 
 LocalVariable* LetNode::AddInitializer(AstNode* node) {
@@ -97,7 +97,9 @@
   for (intptr_t i = 0; i < num_temps(); ++i) {
     initializers_[i]->Visit(visitor);
   }
-  body_->Visit(visitor);
+  for (intptr_t i = 0; i < nodes_.length(); ++i) {
+    nodes_[i]->Visit(visitor);
+  }
 }
 
 
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index 43fe8b2..c679d2a 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -56,7 +56,6 @@
   V(StoreIndexedNode, "store indexed")                                         \
   V(SequenceNode, "seq")                                                       \
   V(LetNode, "let")                                                            \
-  V(CommaNode, "comma")                                                        \
   V(CatchClauseNode, "catch clause block")                                     \
   V(TryCatchNode, "try catch block")                                           \
   V(ThrowNode, "throw")                                                        \
@@ -182,35 +181,6 @@
 };
 
 
-// Comma node represents a pair of expressions evaluated in sequence
-// and return the value of the second expression.
-class CommaNode : public AstNode {
- public:
-  CommaNode(intptr_t token_pos,
-            AstNode* first,
-            AstNode* second)
-      : AstNode(token_pos),
-        first_(first),
-        second_(second) { }
-
-  AstNode* first() const { return first_; }
-  AstNode* second() const { return second_; }
-
-  void VisitChildren(AstNodeVisitor* visitor) const {
-    first_->Visit(visitor);
-    second_->Visit(visitor);
-  }
-
-  DECLARE_COMMON_NODE_FUNCTIONS(CommaNode);
-
- private:
-  AstNode* first_;
-  AstNode* second_;
-
-  DISALLOW_COPY_AND_ASSIGN(CommaNode);
-};
-
-
 class CloneContextNode : public AstNode {
  public:
   explicit CloneContextNode(intptr_t token_pos)
@@ -303,13 +273,14 @@
 
   LocalVariable* AddInitializer(AstNode* node);
 
+  const GrowableArray<AstNode*>& nodes() const { return nodes_; }
+
+  void AddNode(AstNode* node) { nodes_.Add(node); }
+
   intptr_t num_temps() const {
     return vars_.length();
   }
 
-  AstNode* body() const { return body_; }
-  void set_body(AstNode* node) { body_ = node; }
-
   void VisitChildren(AstNodeVisitor* visitor) const;
 
   DECLARE_COMMON_NODE_FUNCTIONS(LetNode);
@@ -317,7 +288,7 @@
  private:
   GrowableArray<LocalVariable*> vars_;
   GrowableArray<AstNode*> initializers_;
-  AstNode* body_;
+  GrowableArray<AstNode*> nodes_;
 
   DISALLOW_COPY_AND_ASSIGN(LetNode);
 };
diff --git a/runtime/vm/ast_printer.cc b/runtime/vm/ast_printer.cc
index 9bf4816..58fce94 100644
--- a/runtime/vm/ast_printer.cc
+++ b/runtime/vm/ast_printer.cc
@@ -38,11 +38,6 @@
 }
 
 
-void AstPrinter::VisitCommaNode(CommaNode* node) {
-  VisitGenericAstNode(node);
-}
-
-
 void AstPrinter::VisitCloneContextNode(CloneContextNode* node) {
   VisitGenericAstNode(node);
 }
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 3badf77..ba6b949 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -59,7 +59,9 @@
   const int kNumIterations = 100;
   char* err = NULL;
   Dart_Isolate base_isolate = Dart_CurrentIsolate();
-  Dart_Isolate test_isolate = Dart_CreateIsolate(NULL, NULL, NULL, NULL, &err);
+  Dart_Isolate test_isolate = Dart_CreateIsolate(NULL, NULL,
+                                                 bin::snapshot_buffer,
+                                                 NULL, &err);
   EXPECT(test_isolate != NULL);
   Dart_EnterScope();
   uint8_t* buffer = NULL;
diff --git a/runtime/vm/bit_vector.cc b/runtime/vm/bit_vector.cc
index b97c18e..90c074a 100644
--- a/runtime/vm/bit_vector.cc
+++ b/runtime/vm/bit_vector.cc
@@ -55,8 +55,10 @@
   for (intptr_t i = 0; i < data_length_; i++) {
     const uword before = data_[i];
     const uword after = data_[i] | from->data_[i];
-    if (before != after) changed = true;
-    data_[i] = after;
+    if (before != after) {
+      changed = true;
+      data_[i] = after;
+    }
   }
   return changed;
 }
@@ -68,8 +70,10 @@
   for (intptr_t i = 0; i < data_length_; i++) {
     const uword before = data_[i];
     const uword after = data_[i] & ~from->data_[i];
-    if (before != after) changed = true;
-    data_[i] = after;
+    if (before != after) {
+      changed = true;
+      data_[i] = after;
+    }
   }
   return changed;
 }
diff --git a/runtime/vm/bitmap.cc b/runtime/vm/bitmap.cc
index ae114d8..e2d5fe6e 100644
--- a/runtime/vm/bitmap.cc
+++ b/runtime/vm/bitmap.cc
@@ -32,7 +32,9 @@
 
 
 bool BitmapBuilder::Get(intptr_t bit_offset) const {
-  ASSERT(InRange(bit_offset));
+  if (!InRange(bit_offset)) {
+    return false;
+  }
   intptr_t byte_offset = bit_offset >> kBitsPerByteLog2;
   // Bits not covered by the backing store are implicitly false.
   return (byte_offset < data_size_in_bytes_) && GetBit(bit_offset);
@@ -40,7 +42,6 @@
 
 
 void BitmapBuilder::Set(intptr_t bit_offset, bool value) {
-  ASSERT(bit_offset >= 0);
   if (!InRange(bit_offset)) {
     length_ = bit_offset + 1;
     // Bits not covered by the backing store are implicitly false.
@@ -72,7 +73,9 @@
 
 
 bool BitmapBuilder::GetBit(intptr_t bit_offset) const {
-  ASSERT(InRange(bit_offset));
+  if (!InRange(bit_offset)) {
+    return false;
+  }
   intptr_t byte_offset = bit_offset >> kBitsPerByteLog2;
   ASSERT(byte_offset < data_size_in_bytes_);
   intptr_t bit_remainder = bit_offset & (kBitsPerByte - 1);
@@ -83,7 +86,10 @@
 
 
 void BitmapBuilder::SetBit(intptr_t bit_offset, bool value) {
-  ASSERT(InRange(bit_offset));
+  if (!InRange(bit_offset)) {
+    FATAL1("Fatal error in BitmapBuilder::SetBit :"
+           " invalid bit_offset, %"Pd"\n", bit_offset);
+  }
   int byte_offset = bit_offset >> kBitsPerByteLog2;
   ASSERT(byte_offset < data_size_in_bytes_);
   int bit_remainder = bit_offset & (kBitsPerByte - 1);
diff --git a/runtime/vm/bitmap.h b/runtime/vm/bitmap.h
index f0304d0..bf8e437 100644
--- a/runtime/vm/bitmap.h
+++ b/runtime/vm/bitmap.h
@@ -52,7 +52,11 @@
   static const intptr_t kIncrementSizeInBytes = 16;
 
   bool InRange(intptr_t offset) const {
-    return (offset >= 0) && (offset < length_);
+    if (offset < 0) {
+      FATAL1("Fatal error in BitmapBuilder::InRange :"
+             " invalid bit_offset, %"Pd"\n", offset);
+    }
+    return (offset < length_);
   }
 
   // Get/Set a bit that is known to be covered by the backing store.
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 05e4b78..a2f37fb 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -445,6 +445,10 @@
         sinking->Optimize();
       }
 
+      // Ensure that all phis inserted by optimization passes have consistent
+      // representations.
+      optimizer.UnboxPhis();
+
       if (optimizer.Canonicalize()) {
         // To fully remove redundant boxing (e.g. BoxDouble used only in
         // environments and UnboxDouble instructions) instruction we
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index e77d6df..250f714 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -2632,7 +2632,7 @@
   intptr_t mydata = 12345;
   char* err;
   Dart_Isolate isolate =
-      Dart_CreateIsolate(NULL, NULL, NULL,
+      Dart_CreateIsolate(NULL, NULL, bin::snapshot_buffer,
                          reinterpret_cast<void*>(mydata),
                          &err);
   EXPECT(isolate != NULL);
@@ -6685,7 +6685,9 @@
   {
     sync->Enter();
     char* error = NULL;
-    shared_isolate = Dart_CreateIsolate(NULL, NULL, NULL, NULL, &error);
+    shared_isolate = Dart_CreateIsolate(NULL, NULL,
+                                        bin::snapshot_buffer,
+                                        NULL, &error);
     EXPECT(shared_isolate != NULL);
     Dart_EnterScope();
     Dart_Handle url = NewString(TestCase::url());
@@ -6809,7 +6811,9 @@
 
   // Create an isolate.
   char* err;
-  Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL, NULL, my_data, &err);
+  Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL,
+                                            bin::snapshot_buffer,
+                                            my_data, &err);
   if (isolate == NULL) {
     OS::Print("Creation of isolate failed '%s'\n", err);
     free(err);
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 280bd6e..9cc15fd 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -604,6 +604,10 @@
       library = Library::IsolateLibrary();
       class_name = &Symbols::IsolateUnhandledException();
       break;
+    case kFiftyThreeBitOverflowError:
+      library = Library::CoreLibrary();
+      class_name = &Symbols::FiftyThreeBitOverflowError();
+      break;
   }
 
   return DartLibraryCalls::ExceptionCreate(library,
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index e74a0db..b762627 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -59,7 +59,8 @@
     kInternalError,
     kNullThrown,
     kIsolateSpawn,
-    kIsolateUnhandledException
+    kIsolateUnhandledException,
+    kFiftyThreeBitOverflowError,
   };
 
   static void ThrowByType(ExceptionType type, const Array& arguments);
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index ed90651..a524b8e 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -1877,29 +1877,53 @@
 
 
 void EffectGraphVisitor::VisitLetNode(LetNode* node) {
-  BuildLetTempExpressions(node);
   intptr_t num_temps = node->num_temps();
+  if (num_temps > 0) {
+    BuildLetTempExpressions(node);
+    // TODO(fschneider): Generate better code for effect context by visiting the
+    // body for effect. Currently, the value of the body expression is
+    // materialized and then dropped. This also requires changing DropTempsInstr
+    // to have zero or one inputs.
 
-  // TODO(fschneider): Generate better code for effect context by visiting the
-  // body for effect. Currently, the value of the body expression is
-  // materialized and then dropped. This also requires changing DropTempsInstr
-  // to have zero or one inputs.
-  ValueGraphVisitor for_value(owner(), temp_index());
-  node->body()->Visit(&for_value);
-  Append(for_value);
-  Value* result_value = for_value.value();
-  DeallocateTempIndex(num_temps);
-  Do(new DropTempsInstr(num_temps, result_value));
+    // Visit body.
+    for (intptr_t i = 0; i < node->nodes().length() - 1; ++i) {
+      EffectGraphVisitor for_effect(owner(), temp_index());
+      node->nodes()[i]->Visit(&for_effect);
+      Append(for_effect);
+    }
+    // Visit the last body expression for value.
+    ValueGraphVisitor for_value(owner(), temp_index());
+    node->nodes().Last()->Visit(&for_value);
+    Append(for_value);
+    Value* result_value = for_value.value();
+    DeallocateTempIndex(num_temps);
+    Do(new DropTempsInstr(num_temps, result_value));
+  } else {
+    ASSERT(num_temps == 0);
+    for (intptr_t i = 0; i < node->nodes().length(); ++i) {
+      EffectGraphVisitor for_effect(owner(), temp_index());
+      node->nodes()[i]->Visit(&for_effect);
+      Append(for_effect);
+    }
+  }
 }
 
 
 void ValueGraphVisitor::VisitLetNode(LetNode* node) {
   BuildLetTempExpressions(node);
 
+  // Visit body.
+  for (intptr_t i = 0; i < node->nodes().length() - 1; ++i) {
+    EffectGraphVisitor for_effect(owner(), temp_index());
+    node->nodes()[i]->Visit(&for_effect);
+    Append(for_effect);
+  }
+  // Visit the last body expression for value.
   ValueGraphVisitor for_value(owner(), temp_index());
-  node->body()->Visit(&for_value);
+  node->nodes().Last()->Visit(&for_value);
   Append(for_value);
   Value* result_value = for_value.value();
+
   intptr_t num_temps = node->num_temps();
   if (num_temps > 0) {
     DeallocateTempIndex(num_temps);
@@ -3215,29 +3239,6 @@
 }
 
 
-void EffectGraphVisitor::VisitCommaNode(CommaNode* node) {
-  EffectGraphVisitor for_effect_first(owner(), temp_index());
-  node->first()->Visit(&for_effect_first);
-  Append(for_effect_first);
-
-  EffectGraphVisitor for_effect_second(owner(), temp_index());
-  node->second()->Visit(&for_effect_second);
-  Append(for_effect_second);
-}
-
-
-void ValueGraphVisitor::VisitCommaNode(CommaNode* node) {
-  EffectGraphVisitor for_effect(owner(), temp_index());
-  node->first()->Visit(&for_effect);
-  Append(for_effect);
-
-  ValueGraphVisitor for_value(owner(), temp_index());
-  node->second()->Visit(&for_value);
-  Append(for_value);
-  ReturnValue(for_value.value());
-}
-
-
 void EffectGraphVisitor::VisitTryCatchNode(TryCatchNode* node) {
   InlineBailout("EffectGraphVisitor::VisitTryCatchNode (exception)");
   intptr_t old_try_index = owner()->try_index();
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index e087659..e3d2acf 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -418,7 +418,6 @@
   virtual void VisitStaticSetterNode(StaticSetterNode* node);
   virtual void VisitStoreStaticFieldNode(StoreStaticFieldNode* node);
   virtual void VisitTypeNode(TypeNode* node);
-  virtual void VisitCommaNode(CommaNode* node);
   virtual void VisitLetNode(LetNode* node);
 
   Value* value() const { return value_; }
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index a42ed3b..d282034 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -28,6 +28,7 @@
 DECLARE_FLAG(bool, print_scopes);
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, eliminate_type_checks);
+DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
 
 
 FlowGraphCompiler::~FlowGraphCompiler() {
@@ -42,7 +43,8 @@
 
 bool FlowGraphCompiler::SupportsUnboxedMints() {
   // Support unboxed mints when SSE 4.1 is available.
-  return FLAG_unbox_mints && CPUFeatures::sse4_1_supported();
+  return FLAG_unbox_mints && CPUFeatures::sse4_1_supported() &&
+         !FLAG_throw_on_javascript_int_overflow;
 }
 
 
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 8eb247b..c2379c3 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -25,7 +25,7 @@
 // Flags for inlining heuristics.
 DEFINE_FLAG(int, inlining_depth_threshold, 3,
     "Inline function calls up to threshold nesting depth");
-DEFINE_FLAG(int, inlining_size_threshold, 20,
+DEFINE_FLAG(int, inlining_size_threshold, 22,
     "Always inline functions that have threshold or fewer instructions");
 DEFINE_FLAG(int, inlining_callee_call_sites_threshold, 1,
     "Always inline functions containing threshold or fewer calls.");
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index f22e386..6087381 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -390,53 +390,104 @@
 }
 
 
+void FlowGraphOptimizer::ConvertUse(Value* use, Representation from_rep) {
+  const Representation to_rep =
+      use->instruction()->RequiredInputRepresentation(use->use_index());
+  if (from_rep == to_rep || to_rep == kNoRepresentation) {
+    return;
+  }
+
+  Instruction* insert_before;
+  Instruction* deopt_target;
+  PhiInstr* phi = use->instruction()->AsPhi();
+  if (phi != NULL) {
+    ASSERT(phi->is_alive());
+    // For phis conversions have to be inserted in the predecessor.
+    insert_before =
+        phi->block()->PredecessorAt(use->use_index())->last_instruction();
+    deopt_target = NULL;
+  } else {
+    deopt_target = insert_before = use->instruction();
+  }
+
+  InsertConversion(from_rep, to_rep, use, insert_before, deopt_target);
+}
+
 void FlowGraphOptimizer::InsertConversionsFor(Definition* def) {
   const Representation from_rep = def->representation();
 
   for (Value::Iterator it(def->input_use_list());
        !it.Done();
        it.Advance()) {
-    Value* use = it.Current();
-    const Representation to_rep =
-        use->instruction()->RequiredInputRepresentation(use->use_index());
-    if (from_rep == to_rep || to_rep == kNoRepresentation) {
-      continue;
-    }
+    ConvertUse(it.Current(), from_rep);
+  }
+}
 
-    Instruction* insert_before;
-    Instruction* deopt_target;
-    PhiInstr* phi = use->instruction()->AsPhi();
-    if (phi != NULL) {
-      ASSERT(phi->is_alive());
-      // For phis conversions have to be inserted in the predecessor.
-      insert_before =
-          phi->block()->PredecessorAt(use->use_index())->last_instruction();
-      deopt_target = NULL;
-    } else {
-      deopt_target = insert_before = use->instruction();
-    }
 
-    InsertConversion(from_rep, to_rep, use, insert_before, deopt_target);
+// Returns true if phi's representation was changed.
+static bool UnboxPhi(PhiInstr* phi) {
+  Representation current = phi->representation();
+  Representation unboxed = current;
+
+  switch (phi->Type()->ToCid()) {
+    case kDoubleCid:
+      unboxed = kUnboxedDouble;
+      break;
+    case kFloat32x4Cid:
+      unboxed = kUnboxedFloat32x4;
+      break;
+    case kUint32x4Cid:
+      unboxed = kUnboxedUint32x4;
+      break;
+  }
+
+  if (unboxed != current) {
+    phi->set_representation(unboxed);
+    return true;
+  }
+
+  return false;
+}
+
+
+void FlowGraphOptimizer::UnboxPhis() {
+  GrowableArray<PhiInstr*> worklist(5);
+
+  // Convervatively unbox all phis that were proven to be of Double,
+  // Float32x4, or Uint32x4 type.
+  for (intptr_t i = 0; i < block_order_.length(); ++i) {
+    JoinEntryInstr* join_entry = block_order_[i]->AsJoinEntry();
+    if (join_entry != NULL) {
+      for (PhiIterator it(join_entry); !it.Done(); it.Advance()) {
+        PhiInstr* phi = it.Current();
+        if (UnboxPhi(phi)) {
+          worklist.Add(phi);
+        }
+      }
+    }
+  }
+
+  while (!worklist.is_empty()) {
+    PhiInstr* phi = worklist.RemoveLast();
+    InsertConversionsFor(phi);
+
+    for (intptr_t i = 0; i < phi->InputCount(); i++) {
+      ConvertUse(phi->InputAt(i),
+                 phi->InputAt(i)->definition()->representation());
+    }
   }
 }
 
 
 void FlowGraphOptimizer::SelectRepresentations() {
   // Convervatively unbox all phis that were proven to be of Double,
-  // Float32x4, or Uint32x4.
+  // Float32x4, or Uint32x4 type.
   for (intptr_t i = 0; i < block_order_.length(); ++i) {
     JoinEntryInstr* join_entry = block_order_[i]->AsJoinEntry();
     if (join_entry != NULL) {
       for (PhiIterator it(join_entry); !it.Done(); it.Advance()) {
         PhiInstr* phi = it.Current();
-        ASSERT(phi != NULL);
-        if (phi->Type()->ToCid() == kDoubleCid) {
-          phi->set_representation(kUnboxedDouble);
-        } else if (phi->Type()->ToCid() == kFloat32x4Cid) {
-          phi->set_representation(kUnboxedFloat32x4);
-        } else if (phi->Type()->ToCid() == kUint32x4Cid) {
-          phi->set_representation(kUnboxedUint32x4);
-        }
+        UnboxPhi(phi);
       }
     }
   }
@@ -706,7 +757,6 @@
   InsertBefore(call,
                new CheckArrayBoundInstr(new Value(length),
                                         new Value(*index),
-                                        class_id,
                                         call),
                call->env(),
                Definition::kEffect);
@@ -1586,7 +1636,6 @@
     InsertBefore(call,
                  new CheckArrayBoundInstr(new Value(length),
                                           new Value(index),
-                                          cid,
                                           call),
                  call->env(),
                  Definition::kEffect);
@@ -2185,7 +2234,6 @@
   InsertBefore(call,
                new CheckArrayBoundInstr(new Value(len_in_bytes),
                                         new Value(byte_index),
-                                        receiver_cid,
                                         call),
                call->env(),
                Definition::kEffect);
@@ -3070,10 +3118,6 @@
 
 void RangeAnalysis::ConstrainValueAfterCheckArrayBound(
     Definition* defn, CheckArrayBoundInstr* check) {
-  if (!CheckArrayBoundInstr::IsFixedLengthArrayType(check->array_type())) {
-    return;
-  }
-
   Definition* length = check->length()->definition();
 
   Range* constraint_range = new Range(
@@ -6299,6 +6343,7 @@
           // Update use lists to reflect changes in the graph.
           phi->UnuseAllInputs();
           branch->UnuseAllInputs();
+          block->UnuseAllInputs();
 
           // The graph has changed. Recompute dominators and block orders after
           // this pass is finished.
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index dfa24a6..4b8574a 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -42,6 +42,8 @@
 
   void SelectRepresentations();
 
+  void UnboxPhis();
+
   void InferSmiRanges();
 
   void AnalyzeTryCatch();
@@ -133,6 +135,8 @@
 
   void InsertConversionsFor(Definition* def);
 
+  void ConvertUse(Value* use, Representation from);
+
   void InsertConversion(Representation from,
                         Representation to,
                         Value* use,
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index 7dc47d2..82a9233 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -14,6 +14,7 @@
             "Trace flow graph type propagation");
 
 DECLARE_FLAG(bool, enable_type_checks);
+DECLARE_FLAG(bool, propagate_types);
 DECLARE_FLAG(bool, use_cha);
 
 
@@ -489,9 +490,11 @@
 
 intptr_t CompileType::ToNullableCid() {
   if (cid_ == kIllegalCid) {
-    ASSERT(type_ != NULL);
-
-    if (type_->IsMalformed()) {
+    if (type_ == NULL) {
+      // Type propagation is turned off.
+      ASSERT(!FLAG_propagate_types);
+      return kDynamicCid;
+    } else if (type_->IsMalformed()) {
       cid_ = kDynamicCid;
     } else if (type_->IsVoidType()) {
       cid_ = kNullCid;
diff --git a/runtime/vm/handles.h b/runtime/vm/handles.h
index aeca55d..9f08b7a 100644
--- a/runtime/vm/handles.h
+++ b/runtime/vm/handles.h
@@ -77,8 +77,7 @@
   Handles()
       : zone_blocks_(NULL),
         first_scoped_block_(NULL),
-        scoped_blocks_(&first_scoped_block_),
-        last_visited_block_(NULL) {
+        scoped_blocks_(&first_scoped_block_) {
   }
   ~Handles() {
     DeleteAll();
@@ -139,8 +138,7 @@
   class HandlesBlock {
    public:
     explicit HandlesBlock(HandlesBlock* next)
-        : last_visited_handle_(0),
-          next_handle_slot_(0),
+        : next_handle_slot_(0),
           next_block_(next) { }
     ~HandlesBlock();
 
@@ -170,10 +168,6 @@
     // Visit all object pointers in the handle block.
     void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
-    // Visit all the object pointers in the block since the last time this
-    // method was called.
-    void VisitUnvisitedObjectPointers(ObjectPointerVisitor* visitor);
-
     // Visit all of the handles in the handle block.
     void Visit(HandleVisitor* visitor);
 
@@ -194,10 +188,6 @@
     void set_next_block(HandlesBlock* next) { next_block_ = next; }
 
    private:
-    // Last handle visited by VisitUnvisitedObjectPointers.  Handles
-    // at, or beyond this index are new.
-    intptr_t last_visited_handle_;
-
     uword data_[kHandleSizeInWords * kHandlesPerChunk];  // Handles area.
     intptr_t next_handle_slot_;  // Next slot for allocation in current block.
     HandlesBlock* next_block_;  // Link to next block of handles.
@@ -234,8 +224,6 @@
   HandlesBlock* zone_blocks_;  // List of zone handles.
   HandlesBlock first_scoped_block_;  // First block of scoped handles.
   HandlesBlock* scoped_blocks_;  // List of scoped handles.
-  // Last block visited by VisitUnvisitedHandles.
-  HandlesBlock* last_visited_block_;
 
   friend class HandleScope;
   friend class Dart;
diff --git a/runtime/vm/handles_impl.h b/runtime/vm/handles_impl.h
index 95d7515..dbc376a 100644
--- a/runtime/vm/handles_impl.h
+++ b/runtime/vm/handles_impl.h
@@ -49,23 +49,6 @@
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
 void Handles<kHandleSizeInWords,
              kHandlesPerChunk,
-             kOffsetOfRawPtr>::VisitUnvisitedScopedHandles(
-    ObjectPointerVisitor* visitor) {
-  HandlesBlock* block = &first_scoped_block_;
-  while (block != NULL && block != last_visited_block_) {
-    block->VisitUnvisitedObjectPointers(visitor);
-    block = block->next_block();
-  }
-  // We want this to point to first_scoped_block.next,
-  // Because pointers are still being added to first_scoped_block
-  // So it may be "partially new", and require a partial scan.
-  last_visited_block_ = first_scoped_block_.next_block();
-}
-
-
-template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
              kOffsetOfRawPtr>::Visit(HandleVisitor* visitor) {
   // Visit all zone handles.
   HandlesBlock* block = zone_blocks_;
@@ -339,24 +322,6 @@
 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
 void Handles<kHandleSizeInWords,
              kHandlesPerChunk,
-             kOffsetOfRawPtr>::HandlesBlock::VisitUnvisitedObjectPointers(
-                 ObjectPointerVisitor* visitor) {
-  ASSERT(visitor != NULL);
-
-  // last_visited_handle_ picks up where we were last time,
-  // so there is nothing in the intialization position of this for loop.
-
-  while (last_visited_handle_ < next_handle_slot_) {
-    last_visited_handle_ += kHandleSizeInWords;
-    uword* addr = &data_[last_visited_handle_ + kOffsetOfRawPtr / kWordSize];
-    visitor->VisitPointer(reinterpret_cast<RawObject**>(addr));
-  }
-}
-
-
-template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr>
-void Handles<kHandleSizeInWords,
-             kHandlesPerChunk,
              kOffsetOfRawPtr>::HandlesBlock::Visit(HandleVisitor* visitor) {
   ASSERT(visitor != NULL);
   for (intptr_t i = 0; i < next_handle_slot_; i += kHandleSizeInWords) {
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 3fd1a11..35b3f25 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -30,6 +30,7 @@
 DECLARE_FLAG(int, max_polymorphic_checks);
 DECLARE_FLAG(bool, trace_optimization);
 DECLARE_FLAG(bool, trace_constant_propagation);
+DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
 
 Definition::Definition()
     : range_(NULL),
@@ -129,13 +130,6 @@
 }
 
 
-bool CheckArrayBoundInstr::AttributesEqual(Instruction* other) const {
-  CheckArrayBoundInstr* other_check = other->AsCheckArrayBound();
-  ASSERT(other_check != NULL);
-  return array_type() == other_check->array_type();
-}
-
-
 bool AssertAssignableInstr::AttributesEqual(Instruction* other) const {
   AssertAssignableInstr* other_assert = other->AsAssertAssignable();
   ASSERT(other_assert != NULL);
@@ -975,6 +969,7 @@
 
 
 bool BinarySmiOpInstr::CanDeoptimize() const {
+  if (FLAG_throw_on_javascript_int_overflow) return true;
   switch (op_kind()) {
     case Token::kBIT_AND:
     case Token::kBIT_OR:
@@ -2347,11 +2342,6 @@
 
 
 bool CheckArrayBoundInstr::IsRedundant(RangeBoundary length) {
-  // Check that array has an immutable length.
-  if (!IsFixedLengthArrayType(array_type())) {
-    return false;
-  }
-
   Range* index_range = index()->definition()->range();
 
   // Range of the index is unknown can't decide if the check is redundant.
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 99fc0d3..e3bd33d 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -6208,9 +6208,7 @@
  public:
   CheckArrayBoundInstr(Value* length,
                        Value* index,
-                       intptr_t array_type,
-                       InstanceCallInstr* instance_call)
-      : array_type_(array_type) {
+                       InstanceCallInstr* instance_call) {
     SetInputAt(kLengthPos, length);
     SetInputAt(kIndexPos, index);
     deopt_id_ = instance_call->deopt_id();
@@ -6219,8 +6217,6 @@
   Value* length() const { return inputs_[kLengthPos]; }
   Value* index() const { return inputs_[kIndexPos]; }
 
-  intptr_t array_type() const { return array_type_; }
-
   DECLARE_INSTRUCTION(CheckArrayBound)
 
   virtual intptr_t ArgumentCount() const { return 0; }
@@ -6239,7 +6235,7 @@
   virtual bool AllowsCSE() const { return true; }
   virtual EffectSet Effects() const { return EffectSet::None(); }
   virtual EffectSet Dependencies() const { return EffectSet::None(); }
-  virtual bool AttributesEqual(Instruction* other) const;
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
 
   virtual bool MayThrow() const { return false; }
 
@@ -6249,7 +6245,6 @@
     kLengthPos = 0,
     kIndexPos = 1
   };
-  intptr_t array_type_;
 
   DISALLOW_COPY_AND_ASSIGN(CheckArrayBoundInstr);
 };
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 1124c02..500ca71 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -300,7 +300,7 @@
     // Only right can be a stack slot.
     locs->set_in(1, locs->in(0).IsConstant()
                         ? Location::RequiresRegister()
-                        : Location::AnyOrConstant(right()));
+                        : Location::RegisterOrConstant(right()));
     locs->set_out(Location::RequiresRegister());
     return locs;
   }
@@ -945,7 +945,7 @@
     // operands should be handled by constant propagation.
     summary->set_in(1, summary->in(0).IsConstant()
                            ? Location::RequiresRegister()
-                           : Location::AnyOrConstant(right()));
+                           : Location::RegisterOrConstant(right()));
     summary->set_out(Location::RequiresRegister());
     return summary;
   }
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 1ca8f2e..26bcf90 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -23,6 +23,7 @@
 
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, propagate_ic_data);
+DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register RAX.
@@ -455,7 +456,7 @@
     // Only right can be a stack slot.
     locs->set_in(1, locs->in(0).IsConstant()
                         ? Location::RequiresRegister()
-                        : Location::AnyOrConstant(right()));
+                        : Location::RegisterOrConstant(right()));
     locs->set_out(Location::RequiresRegister());
     return locs;
   }
@@ -975,7 +976,7 @@
     // operands should be handled by constant propagation.
     summary->set_in(1, summary->in(0).IsConstant()
                            ? Location::RequiresRegister()
-                           : Location::AnyOrConstant(right()));
+                           : Location::RegisterOrConstant(right()));
     summary->set_out(Location::RequiresRegister());
     return summary;
   }
@@ -2129,6 +2130,22 @@
 }
 
 
+static void Emit53BitOverflowCheck(FlowGraphCompiler* compiler,
+                                   Label* overflow,
+                                   Register result) {
+  if (FLAG_throw_on_javascript_int_overflow) {
+    ASSERT(overflow != NULL);
+    __ movq(TMP, result);  // result is a tagged Smi.
+    // Bits 54...64 must be all 0 or all 1. (It would be bit 53, but result
+    // is tagged.)
+    __ shlq(result, Immediate(64 - 54));
+    __ sarq(result, Immediate(64 - 54));
+    __ cmpq(result, TMP);
+    __ j(NOT_EQUAL, overflow);  // 53-bit overflow.
+  }
+}
+
+
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
   const bool is_truncating = shift_left->is_truncating();
@@ -2168,6 +2185,7 @@
       // Shift for result now we know there is no overflow.
       __ shlq(left, Immediate(value));
     }
+    Emit53BitOverflowCheck(compiler, deopt, result);
     return;
   }
 
@@ -2197,6 +2215,7 @@
       __ SmiUntag(right);
       __ shlq(left, right);
     }
+    Emit53BitOverflowCheck(compiler, deopt, result);
     return;
   }
 
@@ -2247,6 +2266,7 @@
     // Shift for result now we know there is no overflow.
     __ shlq(left, right);
   }
+  Emit53BitOverflowCheck(compiler, deopt, result);
 }
 
 
@@ -2445,6 +2465,7 @@
         UNREACHABLE();
         break;
     }
+    Emit53BitOverflowCheck(compiler, deopt, result);
     return;
   }  // locs()->in(1).IsConstant().
 
@@ -2487,6 +2508,7 @@
         UNREACHABLE();
         break;
     }
+    Emit53BitOverflowCheck(compiler, deopt, result);
     return;
   }  // locs()->in(1).IsStackSlot().
 
@@ -2616,6 +2638,7 @@
       UNREACHABLE();
       break;
   }
+  Emit53BitOverflowCheck(compiler, deopt, result);
 }
 
 
@@ -3734,6 +3757,7 @@
   __ shlq(temp, Immediate(1));
   __ j(OVERFLOW, &do_call, Assembler::kNearJump);
   __ SmiTag(result);
+  Emit53BitOverflowCheck(compiler, &do_call, result);
   __ jmp(&done);
   __ Bind(&do_call);
   ASSERT(instance_call()->HasICData());
@@ -3779,6 +3803,7 @@
   __ shlq(temp, Immediate(1));
   __ j(OVERFLOW, deopt);
   __ SmiTag(result);
+  Emit53BitOverflowCheck(compiler, deopt, result);
 }
 
 
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index f8f2542..9df4798 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -11,7 +11,7 @@
 namespace dart {
 
 DEFINE_FLAG(bool, intrinsify, true, "Instrinsify when possible");
-
+DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
 
 static bool CompareNames(const Library& lib,
                          const char* test_name,
@@ -117,12 +117,18 @@
     func = cls.LookupFunctionAllowPrivate(str);                                \
   }                                                                            \
   ASSERT(!func.IsNull());                                                      \
-  func.set_is_intrinsic(true);                                                 \
+  func.set_is_intrinsic(true);
 
   // Set up all core lib functions that can be intrisified.
   lib = Library::CoreLibrary();
   CORE_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
 
+  // Integer intrinsics are in the core library, but we don't want to intrinsify
+  // if we are looking for javascript integer overflow.
+  if (!FLAG_throw_on_javascript_int_overflow) {
+    CORE_INTEGER_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
+  }
+
   // Set up all math lib functions that can be intrisified.
   lib = Library::MathLibrary();
   MATH_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
@@ -153,6 +159,9 @@
 
   if (lib.raw() == Library::CoreLibrary()) {
     CORE_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
+    if (!FLAG_throw_on_javascript_int_overflow) {
+      CORE_INTEGER_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
+    }
   } else if (lib.raw() == Library::TypedDataLibrary()) {
     TYPED_DATA_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
   } else if (lib.raw() == Library::MathLibrary()) {
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index d55d3c1..0e0f942 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -16,6 +16,46 @@
 // When adding a new function for intrinsification add a 0 as fingerprint,
 // build and run to get the correct fingerprint from the mismatch error.
 #define CORE_LIB_INTRINSIC_LIST(V)                                             \
+  V(_Smi, ~, Smi_bitNegate, 882629793)                                         \
+  V(_Double, >, Double_greaterThan, 301935359)                                 \
+  V(_Double, >=, Double_greaterEqualThan, 1184528952)                          \
+  V(_Double, <, Double_lessThan, 1596251333)                                   \
+  V(_Double, <=, Double_lessEqualThan, 1184499161)                             \
+  V(_Double, ==, Double_equal, 1706047712)                                     \
+  V(_Double, +, Double_add, 210576655)                                         \
+  V(_Double, -, Double_sub, 1605354741)                                        \
+  V(_Double, *, Double_mul, 788270837)                                         \
+  V(_Double, /, Double_div, 1202831412)                                        \
+  V(_Double, get:isNaN, Double_getIsNaN, 54462366)                             \
+  V(_Double, get:isNegative, Double_getIsNegative, 54462366)                   \
+  V(_Double, _mulFromInteger, Double_mulFromInteger, 704314034)                \
+  V(_Double, .fromInteger, Double_fromInteger, 842078193)                      \
+  V(_ObjectArray, ., ObjectArray_Allocate, 97987288)                           \
+  V(_ObjectArray, get:length, Array_getLength, 405297088)                      \
+  V(_ObjectArray, [], Array_getIndexed, 71937385)                              \
+  V(_ObjectArray, []=, Array_setIndexed, 255863719)                            \
+  V(_GrowableObjectArray, .withData, GrowableArray_Allocate, 816132033)        \
+  V(_GrowableObjectArray, get:length, GrowableArray_getLength, 725548050)      \
+  V(_GrowableObjectArray, get:_capacity, GrowableArray_getCapacity, 725548050) \
+  V(_GrowableObjectArray, [], GrowableArray_getIndexed, 581838973)             \
+  V(_GrowableObjectArray, []=, GrowableArray_setIndexed, 1048007636)           \
+  V(_GrowableObjectArray, _setLength, GrowableArray_setLength, 796709584)      \
+  V(_GrowableObjectArray, _setData, GrowableArray_setData, 629110947)          \
+  V(_GrowableObjectArray, add, GrowableArray_add, 1904852879)                  \
+  V(_ImmutableArray, [], ImmutableArray_getIndexed, 486821199)                 \
+  V(_ImmutableArray, get:length, ImmutableArray_getLength, 433698233)          \
+  V(Object, ==, Object_equal, 2126897013)                                      \
+  V(_StringBase, get:hashCode, String_getHashCode, 320803993)                  \
+  V(_StringBase, get:isEmpty, String_getIsEmpty, 1026765313)                   \
+  V(_StringBase, get:length, String_getLength, 320803993)                      \
+  V(_StringBase, codeUnitAt, String_codeUnitAt, 984449525)                     \
+  V(_OneByteString, get:hashCode, OneByteString_getHashCode, 682660413)        \
+  V(_OneByteString, _substringUncheckedNative,                                 \
+      OneByteString_substringUnchecked, 713121438)                             \
+  V(_OneByteString, _setAt, OneByteString_setAt, 342452817)                    \
+  V(_OneByteString, _allocate, OneByteString_allocate, 510754908)              \
+
+#define CORE_INTEGER_LIB_INTRINSIC_LIST(V)                                     \
   V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger, 726019207)\
   V(_IntegerImplementation, +, Integer_add, 1768648592)                        \
   V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger, 726019207)\
@@ -46,45 +86,7 @@
   V(_IntegerImplementation, >=, Integer_greaterEqualThan, 949045946)           \
   V(_IntegerImplementation, <<, Integer_shl, 1195917829)                       \
   V(_IntegerImplementation, >>, Integer_sar, 1980227743)                       \
-  V(_Smi, ~, Smi_bitNegate, 882629793)                                         \
-  V(_Double, >, Double_greaterThan, 301935359)                                 \
-  V(_Double, >=, Double_greaterEqualThan, 1184528952)                          \
-  V(_Double, <, Double_lessThan, 1596251333)                                   \
-  V(_Double, <=, Double_lessEqualThan, 1184499161)                             \
-  V(_Double, ==, Double_equal, 1706047712)                                     \
-  V(_Double, +, Double_add, 210576655)                                         \
-  V(_Double, -, Double_sub, 1605354741)                                        \
-  V(_Double, *, Double_mul, 788270837)                                         \
-  V(_Double, /, Double_div, 1202831412)                                        \
-  V(_Double, get:isNaN, Double_getIsNaN, 54462366)                             \
-  V(_Double, get:isNegative, Double_getIsNegative, 54462366)                   \
-  V(_Double, _mulFromInteger, Double_mulFromInteger, 704314034)                \
-  V(_Double, .fromInteger, Double_fromInteger, 842078193)                      \
-  V(_Double, toInt, Double_toInt, 362666636)                                   \
-  V(_ObjectArray, ., ObjectArray_Allocate, 97987288)                           \
-  V(_ObjectArray, get:length, Array_getLength, 405297088)                      \
-  V(_ObjectArray, [], Array_getIndexed, 71937385)                              \
-  V(_ObjectArray, []=, Array_setIndexed, 255863719)                            \
-  V(_GrowableObjectArray, .withData, GrowableArray_Allocate, 816132033)        \
-  V(_GrowableObjectArray, get:length, GrowableArray_getLength, 725548050)      \
-  V(_GrowableObjectArray, get:_capacity, GrowableArray_getCapacity, 725548050) \
-  V(_GrowableObjectArray, [], GrowableArray_getIndexed, 581838973)             \
-  V(_GrowableObjectArray, []=, GrowableArray_setIndexed, 1048007636)           \
-  V(_GrowableObjectArray, _setLength, GrowableArray_setLength, 796709584)      \
-  V(_GrowableObjectArray, _setData, GrowableArray_setData, 629110947)          \
-  V(_GrowableObjectArray, add, GrowableArray_add, 1904852879)                  \
-  V(_ImmutableArray, [], ImmutableArray_getIndexed, 486821199)                 \
-  V(_ImmutableArray, get:length, ImmutableArray_getLength, 433698233)          \
-  V(Object, ==, Object_equal, 2126897013)                                      \
-  V(_StringBase, get:hashCode, String_getHashCode, 320803993)                  \
-  V(_StringBase, get:isEmpty, String_getIsEmpty, 1026765313)                   \
-  V(_StringBase, get:length, String_getLength, 320803993)                      \
-  V(_StringBase, codeUnitAt, String_codeUnitAt, 984449525)                     \
-  V(_OneByteString, get:hashCode, OneByteString_getHashCode, 682660413)        \
-  V(_OneByteString, _substringUncheckedNative,                                 \
-      OneByteString_substringUnchecked, 713121438)                             \
-  V(_OneByteString, _setAt, OneByteString_setAt, 342452817)                    \
-  V(_OneByteString, _allocate, OneByteString_allocate, 510754908)              \
+  V(_Double, toInt, Double_toInt, 362666636)
 
 
 #define MATH_LIB_INTRINSIC_LIST(V)                                             \
@@ -142,6 +144,7 @@
   static bool destination(Assembler* assembler);
 
   CORE_LIB_INTRINSIC_LIST(DECLARE_FUNCTION)
+  CORE_INTEGER_LIB_INTRINSIC_LIST(DECLARE_FUNCTION)
   MATH_LIB_INTRINSIC_LIST(DECLARE_FUNCTION)
   TYPED_DATA_LIB_INTRINSIC_LIST(DECLARE_FUNCTION)
 
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 1d6a9d3..71463e8 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -1308,12 +1308,20 @@
 
 
 bool Intrinsifier::Double_toInt(Assembler* assembler) {
+  Label fall_through;
+
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
+
+  // Explicit NaN check, since ARM gives an FPU exception if you try to
+  // convert NaN to an int.
+  __ vcmpd(D0, D0);
+  __ vmstat();
+  __ b(&fall_through, VS);
+
   __ vcvtid(S0, D0);
   __ vmovrs(R0, S0);
   // Overflow is signaled with minint.
-  Label fall_through;
   // Check for overflow and that it fits into Smi.
   __ CompareImmediate(R0, 0xC0000000);
   __ b(&fall_through, MI);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index a9e8d41..b2a77b9 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -50,6 +50,8 @@
     "Huge method cutoff in tokens: Disables optimizations for huge methods.");
 DEFINE_FLAG(int, huge_method_cutoff_in_code_size, 200000,
     "Huge method cutoff in unoptimized code size (in bytes).");
+DEFINE_FLAG(bool, throw_on_javascript_int_overflow, false,
+    "Throw an exception when integer arithmetic exceeds 53 bits.");
 DECLARE_FLAG(bool, trace_compiler);
 DECLARE_FLAG(bool, eliminate_type_checks);
 DECLARE_FLAG(bool, enable_type_checks);
@@ -7005,6 +7007,7 @@
 
   lib = Library::CoreLibrary();
   CORE_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS);
+  CORE_INTEGER_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS);
 
   RECOGNIZED_LIST(CHECK_FINGERPRINTS);
 
@@ -10440,16 +10443,33 @@
 }
 
 
+// Throw FiftyThreeBitOverflow exception.
+static void ThrowFiftyThreeBitOverflow(const Integer& i) {
+  const Array& exc_args = Array::Handle(Array::New(1));
+  exc_args.SetAt(0, i);
+  Exceptions::ThrowByType(Exceptions::kFiftyThreeBitOverflowError, exc_args);
+}
+
+
 RawInteger* Integer::New(int64_t value, Heap::Space space) {
   if ((value <= Smi::kMaxValue) && (value >= Smi::kMinValue)) {
     return Smi::New(value);
   }
+  if (FLAG_throw_on_javascript_int_overflow && !Utils::IsInt(53, value)) {
+    const Integer &i = Integer::Handle(Mint::New(value));
+    ThrowFiftyThreeBitOverflow(i);
+  }
   return Mint::New(value, space);
 }
 
 
 RawInteger* Integer::NewFromUint64(uint64_t value, Heap::Space space) {
   if (value > static_cast<uint64_t>(Mint::kMaxValue)) {
+    if (FLAG_throw_on_javascript_int_overflow) {
+      const Integer &i =
+          Integer::Handle(BigintOperations::NewFromUint64(value));
+      ThrowFiftyThreeBitOverflow(i);
+    }
     return BigintOperations::NewFromUint64(value);
   } else {
     return Integer::New(value);
@@ -10475,7 +10495,32 @@
 }
 
 
+static void CheckFiftyThreeBitOverflow(const Integer &i) {
+  // Always overflow if the value doesn't fit into an int64_t.
+  int64_t value = 1ULL << 63;
+  if (i.IsSmi()) {
+    value = i.AsInt64Value();
+  } else if (i.IsMint()) {
+    Mint& mint = Mint::Handle();
+    mint ^= i.raw();
+    value = mint.value();
+  } else {
+    ASSERT(i.IsBigint());
+    Bigint& big_value = Bigint::Handle();
+    big_value ^= i.raw();
+    if (BigintOperations::FitsIntoInt64(big_value)) {
+      value = BigintOperations::ToInt64(big_value);
+    }
+  }
+  if (Utils::IsInt(53, value)) return;
+  ThrowFiftyThreeBitOverflow(i);
+}
+
+
 RawInteger* Integer::AsValidInteger() const {
+  if (FLAG_throw_on_javascript_int_overflow) {
+    CheckFiftyThreeBitOverflow(*this);
+  }
   if (IsSmi()) return raw();
   if (IsMint()) {
     Mint& mint = Mint::Handle();
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index ddde3cf..bcc02b0 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -1435,15 +1435,15 @@
   for (intptr_t i = 0; i < function_args.length(); i++) {
     AstNode* arg = function_args.NodeAt(i);
     if ((temp_for_last_arg != NULL) && (i == function_args.length() - 1)) {
-      args_array->AddElement(
-          new CommaNode(arg->token_pos(),
-                        new StoreLocalNode(arg->token_pos(),
+      LetNode* store_arg = new LetNode(arg->token_pos());
+      store_arg->AddNode(new StoreLocalNode(arg->token_pos(),
                                            temp_for_last_arg,
-                                           arg),
-                        new LoadLocalNode(arg->token_pos(),
-                                          temp_for_last_arg)));
+                                           arg));
+      store_arg->AddNode(new LoadLocalNode(arg->token_pos(),
+                                           temp_for_last_arg));
+      args_array->AddElement(store_arg);
     } else {
-      args_array->AddElement(function_args.NodeAt(i));
+      args_array->AddElement(arg);
     }
   }
   arguments->Add(args_array);
@@ -7081,12 +7081,8 @@
 
 AstNode* Parser::ParseCascades(AstNode* expr) {
   intptr_t cascade_pos = TokenPos();
-  LetNode* result = new LetNode(cascade_pos);
-  LocalVariable* cascade_receiver_var = result->AddInitializer(expr);
-  // TODO(fschneider): Make LetNode support more than one body node and
-  // replace the SequenceNode here and CommaNode here and in postfix
-  // expressions.
-  SequenceNode* cascade = new SequenceNode(cascade_pos, NULL);
+  LetNode* cascade = new LetNode(cascade_pos);
+  LocalVariable* cascade_receiver_var = cascade->AddInitializer(expr);
   while (CurrentToken() == Token::kCASCADE) {
     cascade_pos = TokenPos();
     LoadLocalNode* load_cascade_receiver =
@@ -7120,7 +7116,7 @@
                    "left hand side of '%s' is not assignable",
                    Token::Str(assignment_op));
         }
-        let_expr->set_body(assign_expr);
+        let_expr->AddNode(assign_expr);
         expr = let_expr;
       } else {
         right_expr =
@@ -7134,16 +7130,12 @@
         expr = assign_expr;
       }
     }
-    cascade->Add(expr);
+    cascade->AddNode(expr);
   }
-  // The result is a pair of the (side effects of the) cascade sequence
-  // followed by the (value of the) receiver temp variable load.
-  CommaNode* body = new CommaNode(
-      cascade_pos,
-      cascade,
-      new LoadLocalNode(cascade_pos, cascade_receiver_var));
-  result->set_body(body);
-  return result;
+  // The result is an expression with the (side effects of the) cascade
+  // sequence followed by the (value of the) receiver temp variable load.
+  cascade->AddNode(new LoadLocalNode(cascade_pos, cascade_receiver_var));
+  return cascade;
 }
 
 
@@ -7188,7 +7180,7 @@
                "left hand side of '%s' is not assignable",
                Token::Str(assignment_op));
     }
-    let_expr->set_body(assign_expr);
+    let_expr->AddNode(assign_expr);
     return let_expr;
   } else {
     AstNode* assigned_value =
@@ -7268,7 +7260,7 @@
         new LiteralNode(op_pos, Smi::ZoneHandle(Smi::New(1))));
     AstNode* store = CreateAssignmentNode(expr, add);
     ASSERT(store != NULL);
-    let_expr->set_body(store);
+    let_expr->AddNode(store);
     expr = let_expr;
   } else {
     expr = ParsePostfixExpr();
@@ -7764,10 +7756,8 @@
     ASSERT(store != NULL);
     // The result is a pair of the (side effects of the) store followed by
     // the (value of the) initial value temp variable load.
-    let_expr->set_body(new CommaNode(
-        postfix_expr_pos,
-        store,
-        new LoadLocalNode(postfix_expr_pos, temp)));
+    let_expr->AddNode(store);
+    let_expr->AddNode(new LoadLocalNode(postfix_expr_pos, temp));
     return let_expr;
   }
   return postfix_expr;
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 9d76bca..fab5eec 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -347,6 +347,9 @@
   bool IsDartInstance() {
     return (!IsHeapObject() || (GetClassId() >= kInstanceCid));
   }
+  bool IsFreeListElement() {
+    return ((GetClassId() == kFreeListElement));
+  }
 
   intptr_t Size() const {
     uword tags = ptr()->tags_;
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 741a96f..a1752a0 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -224,6 +224,7 @@
   V(NullThrownError, "NullThrownError")                                        \
   V(IsolateSpawnException, "IsolateSpawnException")                            \
   V(IsolateUnhandledException, "IsolateUnhandledException")                    \
+  V(FiftyThreeBitOverflowError, "FiftyThreeBitOverflowError")                  \
   V(_setupFullStackTrace, "_setupFullStackTrace")                              \
   V(BooleanExpression, "boolean expression")                                   \
   V(Malformed, "malformed")                                                    \
diff --git a/sdk/bin/dartanalyzer_developer b/sdk/bin/dartanalyzer_developer
index b522f56..9cf163d 100755
--- a/sdk/bin/dartanalyzer_developer
+++ b/sdk/bin/dartanalyzer_developer
@@ -38,4 +38,18 @@
 
 JAR_FILE="$JAR_DIR/dartanalyzer.jar"
 
-exec java -jar $JAR_FILE --dart-sdk "$SDK_DIR" "$@"
+EXTRA_JVMARGS="-Xss2M "
+OS=`uname | tr "[A-Z]" "[a-z]"`
+if [ "$OS" == "darwin" ] ; then
+  # Bump up the heap on Mac VMs, some of which default to 128M or less.
+  EXTRA_JVMARGS+=" -Xmx256M -client "
+else
+  # On other architectures
+  # -batch invocations will do better with a server vm
+  # invocations for analyzing a single file do better with a client vm
+  if [ $FOUND_BATCH = 0 ] ; then
+    EXTRA_JVMARGS+=" -client "
+  fi
+fi
+
+exec java $EXTRA_JVMARGS -jar $JAR_FILE --dart-sdk "$SDK_DIR" "$@"
diff --git a/sdk/bin/dartdoc b/sdk/bin/dartdoc
index 3f22367..f95cb16 100755
--- a/sdk/bin/dartdoc
+++ b/sdk/bin/dartdoc
@@ -18,9 +18,17 @@
 fi
 
 unset SNAPSHOT
-if test -f "$BIN_DIR/../lib/_internal/dartdoc/bin/dartdoc.dart.snapshot"; then
+
+SNAPSHOT="$BIN_DIR/snapshots/utils_wrapper.dart.snapshot"
+
+if test -f $SNAPSHOT; then
   # TODO(ahe): Remove the following line when we are relatively sure it works.
-  echo Using snapshot "$BIN_DIR/../lib/_internal/dartdoc/bin/dartdoc.dart.snapshot" 1>&2
-  SNAPSHOT="--use-script-snapshot=$BIN_DIR/../lib/_internal/dartdoc/bin/dartdoc.dart.snapshot"
+  echo Using snapshot $SNAPSHOT 1>&2
+  exec "$BIN_DIR"/dart --heap_growth_rate=32 \
+      "--package-root=$BIN_DIR/../packages/" $SNAPSHOT dartdoc $COLORS \
+      "--package-root=$BIN_DIR/../packages/" "--library-root=$BIN_DIR/.." "$@"
+else
+  exec "$BIN_DIR"/dart --heap_growth_rate=32 \
+      "--package-root=$BIN_DIR/../packages/" \
+      "$BIN_DIR/../lib/_internal/dartdoc/bin/dartdoc.dart" $COLORS "$@"
 fi
-exec "$BIN_DIR"/dart --heap_growth_rate=32 "--package-root=$BIN_DIR/../packages/" $SNAPSHOT "$BIN_DIR/../lib/_internal/dartdoc/bin/dartdoc.dart" "--package-root=$BIN_DIR/../packages/" $COLORS "$@"
diff --git a/sdk/bin/dartdoc.bat b/sdk/bin/dartdoc.bat
index 11911ef..c80ef95 100644
--- a/sdk/bin/dartdoc.bat
+++ b/sdk/bin/dartdoc.bat
@@ -3,15 +3,49 @@
 REM for details. All rights reserved. Use of this source code is governed by a
 REM BSD-style license that can be found in the LICENSE file.
 
-set SCRIPTPATH=%~dp0
+setlocal
+rem Handle the case where dart-sdk/bin has been symlinked to.
+set DIR_NAME_WITH_SLASH=%~dp0
+set DIR_NAME=%DIR_NAME_WITH_SLASH:~0,-1%%
+call :follow_links "%DIR_NAME%", RETURNED_BIN_DIR
+rem Get rid of surrounding quotes.
+for %%i in ("%RETURNED_BIN_DIR%") do set BIN_DIR=%%~fi
 
-REM Does the path have a trailing slash? If so, remove it.
-if %SCRIPTPATH:~-1%== set SCRIPTPATH=%SCRIPTPATH:~0,-1%
+rem Get absolute full name for SDK_DIR.
+for %%i in ("%BIN_DIR%\..\") do set SDK_DIR=%%~fi
 
-set arguments=%*
-rem set SNAPSHOTNAME="%SCRIPTPATH%dartdoc.snapshot"
-rem if exist %SNAPSHOTNAME% set SNAPSHOT=--use-script-snapshot=%SNAPSHOTNAME%
+rem Remove trailing backslash if there is one
+IF %SDK_DIR:~-1%==\ set SDK_DIR=%SDK_DIR:~0,-1%
 
-:: The trailing forward slash in --package-root is required because of issue
-:: 9499.
-"%SCRIPTPATH%dart" --heap_growth_rate=32 "--package-root=%SCRIPTPATH%..\packages/" %SNAPSHOT% "%SCRIPTPATH%..\lib\_internal\dartdoc\bin\dartdoc.dart" %arguments%
+set DARTDOC=%SDK_DIR%\lib\_internal\dartdoc\bin\dartdoc.dart
+set DART=%BIN_DIR%\dart
+set SNAPSHOT=%BIN_DIR%\snapshots\utils_wrapper.dart.snapshot
+
+if not defined DART_CONFIGURATION set DART_CONFIGURATION=ReleaseIA32
+
+set BUILD_DIR=%SDK_DIR%\..\build\%DART_CONFIGURATION%
+if exist "%SNAPSHOT%" (
+  "%DART%" "%SNAPSHOT%" "dartdoc" "--library-root=%SDK_DIR%" %*
+) else (
+  :: The trailing forward slash in --package-root is required because of issue
+  :: 9499.
+  "%BUILD_DIR%\dart-sdk\bin\dart" "--package-root=%BUILD_DIR%\packages/" "%DARTDOC%" %*
+)
+
+endlocal
+
+exit /b %errorlevel%
+
+:follow_links
+setlocal
+for %%i in (%1) do set result=%%~fi
+set current=
+for /f "tokens=2 delims=[]" %%i in ('dir /a:l ^"%~dp1^" 2^>nul ^
+                                     ^| find ">     %~n1 ["') do (
+  set current=%%i
+)
+if not "%current%"=="" call :follow_links "%current%", result
+endlocal & set %~2=%result%
+goto :eof
+
+:end
diff --git a/sdk/bin/pub b/sdk/bin/pub
index 76085ab..3643085 100755
--- a/sdk/bin/pub
+++ b/sdk/bin/pub
@@ -1,4 +1,8 @@
 #!/bin/bash
+# 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.
+
 # Run pub.dart on the Dart VM. This script assumes the Dart SDK's directory
 # structure.
 
@@ -6,6 +10,34 @@
 # dart-sdk/bin has been symlinked to. On MacOS, readlink doesn't work
 # with this case.
 BIN_DIR="$(cd "${0%/*}" ; pwd -P)"
-DART_SDK="$(cd "${BIN_DIR%/*}" ; pwd -P)"
+SDK_DIR="$(cd "${BIN_DIR}/.." ; pwd -P)"
 
-exec "$BIN_DIR"/dart "$DART_SDK"/bin/snapshots/pub.dart.snapshot $@
+SNAPSHOT="$BIN_DIR/snapshots/pub.dart.snapshot"
+
+if test -f "$SNAPSHOT"; then
+  # We are running the snapshot in the built SDK.
+  DART="$BIN_DIR/dart"
+  exec "$DART" "--checked" "$SNAPSHOT" "$@"
+else
+  # We are running pub from source in the development repo.
+  if [ -z "$DART_CONFIGURATION" ];
+  then
+    DART_CONFIGURATION="ReleaseIA32"
+  fi
+
+  if [[ `uname` == 'Darwin' ]];
+  then
+    BUILD_DIR="$SDK_DIR/../xcodebuild/$DART_CONFIGURATION"
+  else
+    BUILD_DIR="$SDK_DIR/../out/$DART_CONFIGURATION"
+  fi
+
+  # Use the Dart binary in the built SDK so pub can find the version file next
+  # to it.
+  DART="$BUILD_DIR/dart-sdk/bin/dart"
+  PACKAGES_DIR="$BUILD_DIR/packages/"
+
+  PUB="$SDK_DIR/lib/_internal/pub/bin/pub.dart"
+
+  exec "$DART" "--checked" "--package-root=$PACKAGES_DIR" "$PUB" "$@"
+fi
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index f71d6e6..671b02a 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -1094,6 +1094,13 @@
                   api.Diagnostic.WARNING);
   }
 
+  void reportInfo(Spannable node, MessageKind errorCode,
+                  [Map arguments = const {}]) {
+    reportMessage(spanFromSpannable(node),
+                  errorCode.error(arguments),
+                  api.Diagnostic.INFO);
+  }
+
   void reportMessage(SourceSpan span, Diagnostic message, api.Diagnostic kind) {
     // TODO(ahe): The names Diagnostic and api.Diagnostic are in
     // conflict. Fix it.
diff --git a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
index 6732b8c..b825f68 100644
--- a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
+++ b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
@@ -336,28 +336,28 @@
  * not return the correct values.
  */
 class DartConstantSystem extends ConstantSystem {
-  const add = const AddOperation();
-  const bitAnd = const BitAndOperation();
-  const bitNot = const BitNotOperation();
-  const bitOr = const BitOrOperation();
-  const bitXor = const BitXorOperation();
-  const booleanAnd = const BooleanAndOperation();
-  const booleanOr = const BooleanOrOperation();
-  const divide = const DivideOperation();
-  const equal = const EqualsOperation();
-  const greaterEqual = const GreaterEqualOperation();
-  const greater = const GreaterOperation();
-  const identity = const IdentityOperation();
-  const lessEqual = const LessEqualOperation();
-  const less = const LessOperation();
-  const modulo = const ModuloOperation();
-  const multiply = const MultiplyOperation();
-  const negate = const NegateOperation();
-  const not = const NotOperation();
-  const shiftLeft = const ShiftLeftOperation();
-  const shiftRight = const ShiftRightOperation();
-  const subtract = const SubtractOperation();
-  const truncatingDivide = const TruncatingDivideOperation();
+  final add = const AddOperation();
+  final bitAnd = const BitAndOperation();
+  final bitNot = const BitNotOperation();
+  final bitOr = const BitOrOperation();
+  final bitXor = const BitXorOperation();
+  final booleanAnd = const BooleanAndOperation();
+  final booleanOr = const BooleanOrOperation();
+  final divide = const DivideOperation();
+  final equal = const EqualsOperation();
+  final greaterEqual = const GreaterEqualOperation();
+  final greater = const GreaterOperation();
+  final identity = const IdentityOperation();
+  final lessEqual = const LessEqualOperation();
+  final less = const LessOperation();
+  final modulo = const ModuloOperation();
+  final multiply = const MultiplyOperation();
+  final negate = const NegateOperation();
+  final not = const NotOperation();
+  final shiftLeft = const ShiftLeftOperation();
+  final shiftRight = const ShiftRightOperation();
+  final subtract = const SubtractOperation();
+  final truncatingDivide = const TruncatingDivideOperation();
 
   const DartConstantSystem();
 
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
index a936b7d..ddc8571 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
@@ -9,9 +9,9 @@
 
 typedef String _Renamer(Renamable renamable);
 abstract class Renamable {
-  const int RENAMABLE_TYPE_ELEMENT = 1;
-  const int RENAMABLE_TYPE_MEMBER = 2;
-  const int RENAMABLE_TYPE_LOCAL = 3;
+  final int RENAMABLE_TYPE_ELEMENT = 1;
+  final int RENAMABLE_TYPE_MEMBER = 2;
+  final int RENAMABLE_TYPE_LOCAL = 3;
 
   final Set<Node> nodes;
   final _Renamer renamer;
diff --git a/sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart b/sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart
index 1d0c2b9..ff9595f 100644
--- a/sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart
@@ -23,6 +23,14 @@
   // TODO(ahe): Rename to reportError when that method has been removed.
   void reportErrorCode(Spannable node, MessageKind errorCode, [Map arguments]);
 
+  void reportInfo(Spannable node, MessageKind errorCode, [Map arguments]);
+
   /// Returns true if a diagnostic was emitted.
   bool onDeprecatedFeature(Spannable span, String feature);
+
+  // TODO(ahe): We should not expose this here.  Perhaps a
+  // [SourceSpan] should implement [Spannable], and we should have a
+  // way to construct a [SourceSpan] from a [Spannable] and an
+  // [Element].
+  withCurrentElement(Element element, f());
 }
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 3d7982b..ea72505 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -253,6 +253,8 @@
   /// the generative constructor that the forwarding constructor points to
   /// (possibly via other forwarding constructors).
   FunctionElement get targetConstructor;
+
+  void diagnose(Element context, DiagnosticListener listener);
 }
 
 class Elements {
@@ -626,7 +628,7 @@
 
   void addCompilationUnit(CompilationUnitElement element);
   void addTag(LibraryTag tag, DiagnosticListener listener);
-  void addImport(Element element, DiagnosticListener listener);
+  void addImport(Element element, Import import, DiagnosticListener listener);
 
   /// Record which element an import or export tag resolved to.
   /// (Belongs on builder object).
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 27b8fa6..732e44c 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -276,6 +276,8 @@
   bool isForeign(Compiler compiler) => getLibrary() == compiler.foreignLibrary;
 
   FunctionElement get targetConstructor => null;
+
+  void diagnose(Element context, DiagnosticListener listener) {}
 }
 
 /**
@@ -377,6 +379,36 @@
         super(existingElement.name, ElementKind.AMBIGUOUS, enclosingElement);
 
   bool isAmbiguous() => true;
+
+  Set flatten() {
+    Element element = this;
+    var set = new Set();
+    while (element.isAmbiguous()) {
+      AmbiguousElement ambiguous = element;
+      set.add(ambiguous.newElement);
+      element = ambiguous.existingElement;
+    }
+    set.add(element);
+    return set;
+  }
+
+  void diagnose(Element context, DiagnosticListener listener) {
+    Set ambiguousElements = flatten();
+    MessageKind code = (ambiguousElements.length == 1)
+        ? MessageKind.AMBIGUOUS_REEXPORT : MessageKind.AMBIGUOUS_LOCATION;
+    LibraryElementX importer = context.getLibrary();
+    for (Element element in ambiguousElements) {
+      var arguments = {'element': element};
+      listener.reportInfo(element, code, arguments);
+      Link<Import> importers = importer.importers[element];
+      listener.withCurrentElement(importer, () {
+        for (; !importers.isEmpty; importers = importers.tail) {
+          listener.reportInfo(
+              importers.head, MessageKind.IMPORTED_HERE, arguments);
+        }
+      });
+    }
+  }
 }
 
 class ScopeX {
@@ -566,6 +598,9 @@
    */
   final Map<SourceString, Element> importScope;
 
+  /// A mapping from an imported element to the "import" tag.
+  final Map<Element, Link<Import>> importers;
+
   /**
    * Link for elements exported either through export declarations or through
    * declaration. This field should not be accessed directly but instead through
@@ -582,6 +617,7 @@
   LibraryElementX(Script script, [Uri canonicalUri, LibraryElement this.origin])
     : this.canonicalUri = ((canonicalUri == null) ? script.uri : canonicalUri),
       importScope = new Map<SourceString, Element>(),
+      importers = new Map<Element, Link<Import>>(),
       super(new SourceString(script.name), ElementKind.LIBRARY, null) {
     entryCompilationUnit = new CompilationUnitElementX(script, this);
     if (isPatch) {
@@ -628,7 +664,10 @@
    * [ErroneousElement] will be put in the imported scope, allowing for the
    * detection of ambiguous uses of imported names.
    */
-  void addImport(Element element, DiagnosticListener listener) {
+  void addImport(Element element, Import import, DiagnosticListener listener) {
+    importers[element] =
+        importers.putIfAbsent(element, () => const Link<Import>())
+        .prepend(import);
     Element existing = importScope[element.name];
     if (existing != null) {
       // TODO(johnniwinther): Provide access to the import tags from which
@@ -1950,11 +1989,6 @@
 
   ClassElement mixin;
 
-  // TODO(kasperl): The analyzer complains when I don't have these two
-  // fields. This is pretty weird. I cannot replace them with getters.
-  final ClassElement patch = null;
-  final ClassElement origin = null;
-
   MixinApplicationElementX(SourceString name, Element enclosing, int id,
                            this.node, this.modifiers)
       : super(name, enclosing, id, STATE_NOT_STARTED);
@@ -1963,6 +1997,16 @@
   bool get hasConstructor => !constructors.isEmpty;
   bool get hasLocalScopeMembers => !constructors.isEmpty;
 
+  unsupported(message) {
+    throw new UnsupportedError('$message is not supported on $this');
+  }
+
+  get patch => null;
+  get origin => null;
+
+  set patch(value) => unsupported('set patch');
+  set origin(value) => unsupported('set origin');
+
   Token position() => node.getBeginToken();
 
   Node parseNode(DiagnosticListener listener) => node;
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
index 1b4a0ff..6437764 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
@@ -142,8 +142,8 @@
  * compiled to JavaScript.
  */
 class JavaScriptConstantSystem extends ConstantSystem {
-  const int BITS31 = 0x8FFFFFFF;
-  const int BITS32 = 0xFFFFFFFF;
+  final int BITS31 = 0x8FFFFFFF;
+  final int BITS32 = 0xFFFFFFFF;
 
   final add = const JavaScriptBinaryArithmeticOperation(const AddOperation());
   final bitAnd = const JavaScriptBinaryBitOperation(const BitAndOperation());
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index 6bbd6d5..494eebf 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -73,6 +73,7 @@
   final List<ClassElement> deferredClasses = <ClassElement>[];
   final List<ClassElement> nativeClasses = <ClassElement>[];
   final List<Selector> trivialNsmHandlers = <Selector>[];
+  final Map<String, String> mangledFieldNames = <String, String>{};
 
   // TODO(ngeoffray): remove this field.
   Set<ClassElement> instantiatedClasses;
@@ -361,12 +362,12 @@
     ];
   }
 
-  const MAX_MINIFIED_LENGTH_FOR_DIFF_ENCODING = 4;
+  static const MAX_MINIFIED_LENGTH_FOR_DIFF_ENCODING = 4;
 
   // If we need fewer than this many noSuchMethod handlers we can save space by
   // just emitting them in JS, rather than emitting the JS needed to generate
   // them at run time.
-  const VERY_FEW_NO_SUCH_METHOD_HANDLERS = 10;
+  static const VERY_FEW_NO_SUCH_METHOD_HANDLERS = 10;
 
   /**
    * Adds (at runtime) the handlers to the Object class which catch calls to
@@ -1460,6 +1461,21 @@
     /* Do nothing. */
   }
 
+  void recordMangledField(Element member,
+                          String accessorName,
+                          String memberName) {
+    String previousName = mangledFieldNames.putIfAbsent(
+        '${namer.getterPrefix}$accessorName',
+        () => memberName);
+    assert(invariant(member, previousName == memberName,
+                     message: '$previousName != ${memberName}'));
+    previousName = mangledFieldNames.putIfAbsent(
+        '${namer.setterPrefix}$accessorName',
+        () => '${memberName}=');
+    assert(invariant(member, previousName == '${memberName}=',
+                     message: '$previousName != ${memberName}='));
+  }
+
   /// Returns `true` if fields added.
   bool emitClassFields(ClassElement classElement,
                        ClassBuilder builder,
@@ -1502,6 +1518,9 @@
           }
           fieldMetadata.add(metadata);
         }
+        if (compiler.mirrorsEnabled) {
+          recordMangledField(member, accessorName, member.name.slowToString());
+        }
         if (!needsAccessor) {
           // Emit field for constructor generation.
           assert(!classIsNative);
@@ -3089,6 +3108,22 @@
         if (compiler.enableMinification) {
           mainBuffer.write(';');
         }
+        if (!mangledFieldNames.isEmpty) {
+          var keys = mangledFieldNames.keys.toList();
+          keys.sort();
+          var properties = [];
+          for (String key in keys) {
+            var value = js.string('${mangledFieldNames[key]}');
+            properties.add(new jsAst.Property(js.string(key), value));
+          }
+          var map = new jsAst.ObjectInitializer(properties);
+          mainBuffer.write(
+              jsAst.prettyPrint(
+                  js('init.mangledNames = #', map).toStatement(), compiler));
+          if (compiler.enableMinification) {
+            mainBuffer.write(';');
+          }
+        }
         mainBuffer
             ..write(getReflectionDataParser())
             ..write('([$n');
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart
index bfc844a..093a2d0 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart
@@ -19,8 +19,8 @@
   final String getterPrefix = 'g';
   final String setterPrefix = 's';
 
-  const ALPHABET_CHARACTERS = 52;  // a-zA-Z.
-  const ALPHANUMERIC_CHARACTERS = 62;  // a-zA-Z0-9.
+  static const ALPHABET_CHARACTERS = 52;  // a-zA-Z.
+  static const ALPHANUMERIC_CHARACTERS = 62;  // a-zA-Z0-9.
 
   // You can pass an invalid identifier to this and unlike its non-minifying
   // counterpart it will never return the proposedName as the new fresh name.
diff --git a/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart
index 2f85b44..3743ad0 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart
@@ -1010,7 +1010,7 @@
     if (x is _NativeJsSendPort) return visitNativeJsSendPort(x);
     if (x is _WorkerSendPort) return visitWorkerSendPort(x);
     if (x is _BufferingSendPort) return visitBufferingSendPort(x);
-    throw "Illegal underlying port $p";
+    throw "Illegal underlying port $x";
   }
 
   SendPort visitNativeJsSendPort(_NativeJsSendPort port) {
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart
index 2a50b31..c06e251 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart
@@ -291,14 +291,16 @@
   }
 
   InstanceMirror setField(Symbol fieldName, Object arg) {
-    _invoke(
-        fieldName, JSInvocationMirror.SETTER, 'set\$${n(fieldName)}', [arg]);
+    String reflectiveName = '${n(fieldName)}=';
+    String mangledName = JsMirrorSystem.reflectiveNames[reflectiveName];
+    _invoke(s(reflectiveName), JSInvocationMirror.SETTER, mangledName, [arg]);
     return reflect(arg);
   }
 
   InstanceMirror getField(Symbol fieldName) {
-    return _invoke(
-        fieldName, JSInvocationMirror.GETTER, 'get\$${n(fieldName)}', []);
+    String reflectiveName = n(fieldName);
+    String mangledName = JsMirrorSystem.reflectiveNames[reflectiveName];
+    return _invoke(fieldName, JSInvocationMirror.GETTER, mangledName, []);
   }
 
   delegate(Invocation invocation) {
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_string.dart b/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
index 610f7f8..92d7c67 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_string.dart
@@ -222,6 +222,9 @@
 
   bool contains(Pattern other, [int startIndex = 0]) {
     checkNull(other);
+    if (startIndex < 0 || startIndex > this.length) {
+      throw new RangeError.range(startIndex, 0, this.length);
+    }
     return stringContainsUnchecked(this, other, startIndex);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart
index f8243c5..45ab03c 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart
@@ -136,6 +136,10 @@
   bool moveNext() {
     // firstMatch actually acts as nextMatch because of
     // hidden global flag.
+    if (_current != null && _current.start == _current.end) {
+      // Advance implicit start-position if last match was empty.
+      JS("void", "#.lastIndex++", regExpGetNative(_re));
+    }
     _current = _re.firstMatch(_str);
     return _current != null;
   }
diff --git a/sdk/lib/_internal/compiler/implementation/lib/string_helper.dart b/sdk/lib/_internal/compiler/implementation/lib/string_helper.dart
index 1157f89..f321fbb 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/string_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/string_helper.dart
@@ -65,7 +65,7 @@
     return other.hasMatch(receiver.substring(startIndex));
   } else {
     var substr = receiver.substring(startIndex);
-    return other.allMatches(substr).iterator.moveNext();
+    return other.allMatches(substr).isNotEmpty;
   }
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/library_loader.dart b/sdk/lib/_internal/compiler/implementation/library_loader.dart
index 872aa58..0e70958 100644
--- a/sdk/lib/_internal/compiler/implementation/library_loader.dart
+++ b/sdk/lib/_internal/compiler/implementation/library_loader.dart
@@ -528,7 +528,7 @@
       importedLibrary.forEachExport((Element element) {
         compiler.withCurrentElement(element, () {
           if (combinatorFilter.exclude(element)) return;
-          importingLibrary.addImport(element, compiler);
+          importingLibrary.addImport(element, import, compiler);
         });
       });
     }
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index d409045..135da9d 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -422,6 +422,8 @@
             MessageKind.TOP_LEVEL_VARIABLE_DECLARED_STATIC);
     }
     ResolverVisitor visitor = visitorFor(element);
+    visitor.useElement(tree, element);
+
     // TODO(johnniwinther): Avoid analyzing initializers if
     // [Compiler.analyzeSignaturesOnly] is set.
     initializerDo(tree, visitor.visit);
@@ -1485,6 +1487,7 @@
       AmbiguousElement ambiguous = element;
       type = reportFailureAndCreateType(
           ambiguous.messageKind, ambiguous.messageArguments);
+      ambiguous.diagnose(visitor.mapping.currentElement, compiler);
     } else if (!element.impliesType()) {
       type = reportFailureAndCreateType(
           MessageKind.NOT_A_TYPE, {'node': node.typeName});
@@ -1721,6 +1724,7 @@
         AmbiguousElement ambiguous = result;
         compiler.reportErrorCode(
             node, ambiguous.messageKind, ambiguous.messageArguments);
+        ambiguous.diagnose(enclosingElement, compiler);
         return new ErroneousElementX(ambiguous.messageKind,
                                      ambiguous.messageArguments,
                                      name, enclosingElement);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 1c4f47d..1187969 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -1141,6 +1141,12 @@
     List<HInstruction> compiledArguments;
     bool isInstanceMember = function.isInstanceMember();
 
+    if (function.isGenerativeConstructor()) {
+      // The optimistic field type optimization requires
+      // to know all generative constructors seen in codegen.
+      backend.registerConstructor(function);
+    }
+
     if (currentNode == null
         || currentNode.asForIn() != null
         || !isInstanceMember
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
index e27ae59..5ea9e29 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
@@ -575,8 +575,7 @@
     if (right.isConstantNull() || instructionType.isPrimitiveOrNull()) {
       return newBuiltinVariant(instruction);
     }
-    TypeMask mask = instructionType.computeMask(compiler);
-    Selector selector = new TypedSelector(mask, instruction.selector);
+    Selector selector = instructionType.refine(instruction.selector, compiler);
     World world = compiler.world;
     JavaScriptBackend backend = compiler.backend;
     Iterable<Element> matches = world.allFunctions.filter(selector);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index ffcab4d..a0a6005 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -1469,8 +1469,7 @@
     // Don't handle fields defined in superclasses. Given that the field is
     // always added to the [allSetters] set, setting a field defined in a
     // superclass will get an inferred type of UNKNOWN.
-    if (identical(work.element.getEnclosingClass(), field.getEnclosingClass()) &&
-        !value.instructionType.isUnknown()) {
+    if (work.element.getEnclosingClass() == field.getEnclosingClass()) {
       currentFieldSetters[field] = type;
     }
   }
@@ -1481,6 +1480,7 @@
     if (!thisExposed) {
       // Register the known field types.
       currentFieldSetters.forEach((Element element, HType type) {
+        if (type.isUnknown()) return;
         backend.registerFieldConstructor(element, type);
         allSetters.remove(element);
       });
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/types.dart b/sdk/lib/_internal/compiler/implementation/ssa/types.dart
index faf1f08..06fa93d 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/types.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/types.dart
@@ -231,6 +231,7 @@
     // TODO(kasperl): Should we check if the refinement really is more
     // specialized than the starting point?
     TypeMask mask = computeMask(compiler);
+    if (selector.mask == mask) return selector;
     return new TypedSelector(mask, selector);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart
index cdd5f8c..49612a9 100644
--- a/sdk/lib/_internal/compiler/implementation/typechecker.dart
+++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart
@@ -335,16 +335,13 @@
       return currentClass.supertype;
     } else {
       Element element = elements[node];
-      if (element != null) {
-        assert(invariant(node, element.isVariable() || element.isParameter(),
-            message: 'Unexpected context element ${element}'));
-        return element.computeType(compiler);
-      }
-
-      assert(invariant(node, elements.currentElement.isField(),
-          message: 'Unexpected context element ${elements.currentElement}'));
-      // This is an identifier of a field declaration.
-      return types.dynamicType;
+      assert(invariant(node, element != null,
+          message: 'Missing element for identifier'));
+      assert(invariant(node, element.isVariable() ||
+                             element.isParameter() ||
+                             element.isField(),
+          message: 'Unexpected context element ${element}'));
+      return element.computeType(compiler);
     }
   }
 
@@ -553,8 +550,12 @@
    */
   ElementAccess computeResolvedAccess(Send node, SourceString name,
                                       Element element, MemberKind memberKind) {
-    if (Elements.isUnresolved(element)) {
+    if (element == null) {
       // foo() where foo is unresolved.
+      return lookupMember(node, currentClass.computeType(compiler),
+          name, memberKind);
+    } else if (element.isErroneous()) {
+      // foo() where foo is erroneous.
       return const DynamicAccess();
     } else if (element.isMember()) {
       // foo() where foo is an instance member.
diff --git a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
index f1e5291..ee5ccd5 100644
--- a/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart
@@ -307,15 +307,15 @@
   final ClassBaseType typeBaseType;
 
   BaseTypes(Compiler compiler) :
-    intBaseType = new ClassBaseType(compiler.intClass),
-    doubleBaseType = new ClassBaseType(compiler.doubleClass),
-    numBaseType = new ClassBaseType(compiler.numClass),
-    boolBaseType = new ClassBaseType(compiler.boolClass),
-    stringBaseType = new ClassBaseType(compiler.stringClass),
-    listBaseType = new ClassBaseType(compiler.listClass),
-    mapBaseType = new ClassBaseType(compiler.mapClass),
+    intBaseType = new ClassBaseType(compiler.backend.intImplementation),
+    doubleBaseType = new ClassBaseType(compiler.backend.doubleImplementation),
+    numBaseType = new ClassBaseType(compiler.backend.numImplementation),
+    boolBaseType = new ClassBaseType(compiler.backend.boolImplementation),
+    stringBaseType = new ClassBaseType(compiler.backend.stringImplementation),
+    listBaseType = new ClassBaseType(compiler.backend.listImplementation),
+    mapBaseType = new ClassBaseType(compiler.backend.mapImplementation),
     objectBaseType = new ClassBaseType(compiler.objectClass),
-    typeBaseType = new ClassBaseType(compiler.typeClass);
+    typeBaseType = new ClassBaseType(compiler.backend.typeImplementation);
 }
 
 /**
@@ -414,7 +414,7 @@
     return true;
   }
 
-  String toString() => "{ this: $typeOfThis, env: ${environment.toString()} }";
+  String toString() => "{ this: $typeOfThis, env: $environment }";
 }
 
 /**
@@ -434,6 +434,112 @@
 }
 
 /**
+ * A sentinel type mask class representing the dynamicType. It is absorbing
+ * for [:ConcreteTypesEnvironment.typeMaskUnion:].
+ */
+class DynamicTypeMask implements TypeMask {
+  const DynamicTypeMask();
+
+  String toString() => 'sentinel type mask';
+
+  TypeMask nullable() {
+    throw new UnsupportedError("");
+  }
+
+  TypeMask nonNullable() {
+    throw new UnsupportedError("");
+  }
+
+  TypeMask simplify(Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  bool get isEmpty {
+    throw new UnsupportedError("");
+  }
+
+  bool get isNullable {
+    throw new UnsupportedError("");
+  }
+
+  bool get isExact {
+    throw new UnsupportedError("");
+  }
+
+  bool get isUnion {
+    throw new UnsupportedError("");
+  }
+
+  bool containsOnlyInt(Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  bool containsOnlyDouble(Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  bool containsOnlyNum(Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  bool containsOnlyNull(Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  bool containsOnlyBool(Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  bool containsOnlyString(Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  bool containsOnly(ClassElement element) {
+    throw new UnsupportedError("");
+  }
+
+  bool satisfies(ClassElement cls, Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  bool contains(DartType type, Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  bool containsAll(Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  ClassElement singleClass(Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  Iterable<ClassElement> containedClasses(Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  TypeMask union(TypeMask other, Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  TypeMask intersection(TypeMask other, Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  bool willHit(Selector selector, Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  bool canHit(Element element, Selector selector, Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+
+  Element locateSingleElement(Selector selector, Compiler compiler) {
+    throw new UnsupportedError("");
+  }
+}
+
+/**
  * A task which conservatively infers a [ConcreteType] for each sub expression
  * of the program. The entry point is [analyzeMain].
  */
@@ -488,15 +594,6 @@
    */
   final Map<FunctionElement, Map<ConcreteTypesEnvironment, ConcreteType>> cache;
 
-  /**
-   * An ad-hoc cache that overrides the computed cache for very specific cases
-   * like [:int + {int}:] where we know better than the type annotations of
-   * [:int:] (which we trust as a special case already).
-   */
-  final Map<FunctionElement, Map<ConcreteTypesEnvironment, ConcreteType>>
-      adHocRules;
-
-
   /** A map from expressions to their inferred concrete types. */
   final Map<Node, ConcreteType> inferredTypes;
 
@@ -546,8 +643,6 @@
       : this.compiler = compiler,
         cache = new Map<FunctionElement,
             Map<ConcreteTypesEnvironment, ConcreteType>>(),
-        adHocRules = new Map<FunctionElement,
-            Map<ConcreteTypesEnvironment, ConcreteType>>(),
         inferredTypes = new Map<Node, ConcreteType>(),
         inferredFieldTypes = new Map<Element, ConcreteType>(),
         inferredParameterTypes = new Map<VariableElement, ConcreteType>(),
@@ -560,60 +655,6 @@
     unknownConcreteType = new ConcreteType.unknown();
   }
 
-  /**
-   * Populates [adHocRules] with ad hoc rules who know better than the corelib
-   * type annotations for types whose type annotations we trust, like:
-   *
-   *     {int}    + {int}    -> {int}
-   *     {double} + {double} -> {double}
-   *     ...
-   */
-  populateAdHocRules() {
-    // Builds the environment that would be looked up if we were to analyze
-    // o.method(arg) where o has concrete type {receiverType} and arg have
-    // concrete types {argumentTypes}.
-    ConcreteTypesEnvironment makeEnvironment(BaseType receiverType,
-                                             FunctionElement method,
-                                             List<BaseType> argumentTypes) {
-      ArgumentsTypes argumentsTypes = new ArgumentsTypes(
-          argumentTypes.map((type) => singletonConcreteType(type)).toList(),
-          new Map());
-      Map<Element, ConcreteType> argumentMap =
-          associateArguments(method, argumentsTypes);
-      return new ConcreteTypesEnvironment.of(this, argumentMap, receiverType);
-    }
-
-    // Adds the rule {receiverType}.method({arg1}, ..., {argn}) -> {returnType}
-    // to cache.
-    void rule(ClassBaseType receiverType, String method,
-              List<BaseType> argumentTypes, BaseType returnType) {
-      // The following line shouldn't be needed but the mock compiler doesn't
-      // resolve num for some reason.
-      receiverType.element.ensureResolved(compiler);
-      FunctionElement methodElement =
-          receiverType.element.lookupMember(new SourceString(method))
-              .implementation;
-      ConcreteTypesEnvironment environment =
-          makeEnvironment(receiverType, methodElement, argumentTypes);
-      Map<ConcreteTypesEnvironment, ConcreteType> map =
-          adHocRules.containsKey(methodElement)
-              ? adHocRules[methodElement]
-              : new Map<ConcreteTypesEnvironment, ConcreteType>();
-      map[environment] = singletonConcreteType(returnType);
-      adHocRules[methodElement] = map;
-    }
-
-    // The hardcoded typing rules.
-    final ClassBaseType int = baseTypes.intBaseType;
-    final ClassBaseType double = baseTypes.doubleBaseType;
-
-    for (String method in ['+', '*', '-']) {
-      for (ClassBaseType type in [int, double]) {
-        rule(type, method, [type], type);
-      }
-    }
-  }
-
   // --- utility methods ---
 
   /** The unknown concrete type */
@@ -632,6 +673,18 @@
   }
 
   /**
+   * Computes the union of [mask1] and [mask2] where [mask1] and [mask2] are
+   * possibly equal to [: DynamicTypeMask.instance :].
+   */
+  TypeMask typeMaskUnion(TypeMask mask1, TypeMask mask2) {
+    if (mask1 == const DynamicTypeMask()
+        || mask2 == const DynamicTypeMask()) {
+      return const DynamicTypeMask();
+    }
+    return mask1.union(mask2, compiler);
+  }
+
+  /**
    * Returns all the members with name [methodName].
    */
   List<Element> getMembersByName(SourceString methodName) {
@@ -664,6 +717,7 @@
    */
   void augmentInferredSelectorType(Selector selector, TypeMask typeOfThis,
                                    TypeMask returnType) {
+    assert(returnType != null);
     assert(typeOfThis != null);
     selector = selector.asUntyped;
     Map<TypeMask, TypeMask> currentMap = inferredSelectorTypes.putIfAbsent(
@@ -671,7 +725,7 @@
     TypeMask currentReturnType = currentMap[typeOfThis];
     currentMap[typeOfThis] = (currentReturnType == null)
         ? returnType
-        : currentReturnType.union(returnType, compiler);
+        : typeMaskUnion(currentReturnType, returnType);
   }
 
   /**
@@ -827,22 +881,20 @@
    */
   TypeMask baseTypeToTypeMask(BaseType baseType) {
     if (baseType.isUnknown()) {
-      return null;
+      return const DynamicTypeMask();
     } else if (baseType.isNull()) {
       return new TypeMask.empty();
     } else {
       ClassBaseType classBaseType = baseType;
       final element = classBaseType.element;
-      if (element != null) {
-        if (element == compiler.numClass) {
-          return new TypeMask.nonNullSubclass(compiler.numClass.rawType);
-        } else if (element == compiler.dynamicClass) {
-          return new TypeMask.nonNullSubclass(compiler.objectClass.rawType);
-        } else {
-          return new TypeMask.nonNullExact(element.rawType);
-        }
+      assert(element != null);
+      if (element == compiler.backend.numImplementation) {
+        return new TypeMask.nonNullSubclass(
+            compiler.backend.numImplementation.rawType);
+      } else if (element == compiler.dynamicClass) {
+        return new TypeMask.nonNullSubclass(compiler.objectClass.rawType);
       } else {
-        return null;
+        return new TypeMask.nonNullExact(element.rawType);
       }
     }
   }
@@ -854,9 +906,9 @@
     if (concreteType == null) return null;
     TypeMask typeMask = new TypeMask.nonNullEmpty();
     for (BaseType baseType in concreteType.baseTypes) {
-      TypeMask other = baseTypeToTypeMask(baseType);
-      if (other == null) return null;
-      typeMask = typeMask.union(baseTypeToTypeMask(baseType), compiler);
+      TypeMask baseMask = baseTypeToTypeMask(baseType);
+      if (baseMask == const DynamicTypeMask()) return baseMask;
+      typeMask = typeMask.union(baseMask, compiler);
     }
     return typeMask;
   }
@@ -865,19 +917,22 @@
    * Get the inferred concrete type of [node].
    */
   TypeMask getTypeOfNode(Element owner, Node node) {
-    return concreteTypeToTypeMask(inferredTypes[node]);
+    TypeMask result = concreteTypeToTypeMask(inferredTypes[node]);
+    return result == const DynamicTypeMask() ? null : result;
   }
 
   /**
    * Get the inferred concrete type of [element].
    */
   TypeMask getTypeOfElement(Element element) {
+    TypeMask result = null;
     if (element.isParameter()) {
-      return concreteTypeToTypeMask(inferredParameterTypes[element]);
+      result = concreteTypeToTypeMask(inferredParameterTypes[element]);
     } else if (element.isField()) {
-      return concreteTypeToTypeMask(inferredFieldTypes[element]);
+      result = concreteTypeToTypeMask(inferredFieldTypes[element]);
     }
     // TODO(polux): handle field parameters
+    return result == const DynamicTypeMask() ? null : result;
   }
 
   /**
@@ -891,7 +946,8 @@
     templates.forEach((_, concreteType) {
       returnType = returnType.union(concreteType);
     });
-    return concreteTypeToTypeMask(returnType);
+    TypeMask result = concreteTypeToTypeMask(returnType);
+    return result == const DynamicTypeMask() ? null : result;
   }
 
   /**
@@ -907,18 +963,18 @@
     TypeMask result = new TypeMask.nonNullEmpty();
     if (selector.mask == null) {
       candidates.forEach((TypeMask receiverType, TypeMask returnType) {
-        result = result.union(returnType, compiler);
+        result = typeMaskUnion(result, returnType);
       });
     } else {
       candidates.forEach((TypeMask receiverType, TypeMask returnType) {
         TypeMask intersection =
             receiverType.intersection(selector.mask, compiler);
         if (!intersection.isEmpty || intersection.isNullable) {
-          result = result.union(returnType, compiler);
+          result = typeMaskUnion(result, returnType);
         }
       });
     }
-    return result;
+    return result == const DynamicTypeMask() ? null : result;
   }
 
   // --- analysis ---
@@ -950,7 +1006,12 @@
     }
 
     if (selector != null && receiverType != null) {
-      TypeMask receiverMask = new TypeMask.nonNullExact(receiverType.rawType);
+      // TODO(polux): generalize to any abstract class if we ever handle other
+      // abstract classes than num.
+      TypeMask receiverMask =
+          (receiverType == compiler.backend.numImplementation)
+              ? new TypeMask.nonNullSubclass(receiverType.rawType)
+              : new TypeMask.nonNullExact(receiverType.rawType);
       TypeMask resultMask = concreteTypeToTypeMask(result);
       augmentInferredSelectorType(selector, receiverMask, resultMask);
     }
@@ -1048,22 +1109,19 @@
   ConcreteType getMonomorphicSendReturnType(
       FunctionElement function,
       ConcreteTypesEnvironment environment) {
-    ConcreteType specialType = getSpecialCaseReturnType(function, environment);
-    if (specialType != null) return specialType;
-
     Map<ConcreteTypesEnvironment, ConcreteType> template = cache[function];
     if (template == null) {
       template = new Map<ConcreteTypesEnvironment, ConcreteType>();
       cache[function] = template;
     }
     ConcreteType type = template[environment];
+    ConcreteType specialType = getSpecialCaseReturnType(function, environment);
     if (type != null) {
-      return type;
+      return specialType != null ? specialType : type;
     } else {
-      workQueue.addLast(
-        new InferenceWorkItem(function, environment));
+      workQueue.addLast(new InferenceWorkItem(function, environment));
       // in case of a constructor, optimize by returning the class
-      return emptyConcreteType;
+      return specialType != null ? specialType : emptyConcreteType;
     }
   }
 
@@ -1118,6 +1176,29 @@
     return result;
   }
 
+  /// Replaces native types by their backend implementation.
+  Element normalize(Element cls) {
+    if (cls == compiler.boolClass) {
+      return compiler.backend.boolImplementation;
+    }
+    if (cls == compiler.intClass) {
+      return compiler.backend.intImplementation;
+    }
+    if (cls == compiler.doubleClass) {
+      return compiler.backend.doubleImplementation;
+    }
+    if (cls == compiler.numClass) {
+      return compiler.backend.numImplementation;
+    }
+    if (cls == compiler.stringClass) {
+      return compiler.backend.stringImplementation;
+    }
+    if (cls == compiler.listClass) {
+      return compiler.backend.listImplementation;
+    }
+    return cls;
+  }
+
   /**
    * Handles external methods that cannot be cached because they depend on some
    * other state of [ConcreteTypesInferrer] like [:List#[]:] and
@@ -1126,20 +1207,30 @@
    */
   ConcreteType getSpecialCaseReturnType(FunctionElement function,
                                         ConcreteTypesEnvironment environment) {
-    Map<ConcreteTypesEnvironment, ConcreteType> template = adHocRules[function];
-    if (template != null) {
-      ConcreteType result = template[environment];
-      if (result != null) return result;
-    }
-    if (trustedClasses.contains(function.enclosingElement)) {
-      FunctionSignature signature = function.functionSignature;
-      if (environment.matches(signature)) {
-        return singletonConcreteType(
-            new ClassBaseType(signature.returnType.element));
-      } else {
-        return null;
+    // Handles int + int, double + double, int - int, ...
+    // We cannot compare function to int#+, int#-, etc. because int and double
+    // don't override these methods. So for 1+2, getSpecialCaseReturnType will
+    // be invoked with function = num#+. We use environment.typeOfThis instead.
+    BaseType baseType = environment.typeOfThis;
+    if (baseType != null && baseType.isClass()) {
+      ClassBaseType classBaseType = baseType;
+      ClassElement cls = classBaseType.element;
+      SourceString name = function.name;
+      if ((cls == baseTypes.intBaseType.element
+          || cls == baseTypes.doubleBaseType.element)
+          && (name == const SourceString('+')
+              || name == const SourceString('-')
+              || name == const SourceString('*'))) {
+        Link<Element> parameters =
+            function.functionSignature.requiredParameters;
+        ConcreteType argumentType = environment.lookupType(parameters.head);
+        if (argumentType.getUniqueType() == cls) {
+          return singletonConcreteType(new ClassBaseType(cls));
+        }
       }
-    } else if (function == listIndex) {
+    }
+
+    if (function == listIndex) {
       ConcreteType indexType = environment.lookupType(
           listIndex.functionSignature.requiredParameters.head);
       if (!indexType.baseTypes.contains(baseTypes.intBaseType)) {
@@ -1182,6 +1273,7 @@
                              ConcreteTypesEnvironment environment) {
     TreeElements elements =
         compiler.enqueuer.resolution.resolvedElements[element.declaration];
+    assert(elements != null);
     ConcreteType specialResult = handleSpecialMethod(element, environment);
     if (specialResult != null) return specialResult;
     FunctionExpression tree = element.parseNode(compiler);
@@ -1203,6 +1295,7 @@
   ConcreteType analyzeFieldInitialization(VariableElement element) {
     TreeElements elements =
         compiler.enqueuer.resolution.resolvedElements[element];
+    assert(elements != null);
     Visitor visitor = new TypeInferrerVisitor(elements, element, this,
         new ConcreteTypesEnvironment(this));
     Node tree = element.parseNode(compiler);
@@ -1241,7 +1334,8 @@
     // analyze initializers, including a possible call to super or a redirect
     FunctionExpression tree = compiler.parser.parse(element);
     TreeElements elements =
-        compiler.enqueuer.resolution.resolvedElements[element];
+        compiler.enqueuer.resolution.resolvedElements[element.declaration];
+    assert(elements != null);
     Visitor visitor =
         new TypeInferrerVisitor(elements, element, this, environment);
 
@@ -1285,8 +1379,7 @@
 
   /**
    * Hook that performs side effects on some special method calls (like
-   * [:List(length):]) and possibly returns a concrete type
-   * (like [:{JsArray}:]).
+   * [:List(length):]) and possibly returns a concrete type.
    */
   ConcreteType handleSpecialMethod(FunctionElement element,
                                    ConcreteTypesEnvironment environment) {
@@ -1299,7 +1392,6 @@
       if (lengthType.baseTypes.contains(baseTypes.intBaseType)) {
         augmentListElementType(nullConcreteType);
       }
-      return singletonConcreteType(baseTypes.listBaseType);
     }
   }
 
@@ -1310,14 +1402,15 @@
     baseTypes = new BaseTypes(compiler);
     ClassElement jsArrayClass = baseTypes.listBaseType.element;
     listIndex = jsArrayClass.lookupMember(const SourceString('[]'));
-    listIndexSet =
-        jsArrayClass.lookupMember(const SourceString('[]='));
+    listIndexSet = jsArrayClass.lookupMember(const SourceString('[]='));
+    List<SourceString> typePreservingOps = const [const SourceString('+'),
+                                                  const SourceString('-'),
+                                                  const SourceString('*')];
     listConstructor =
         compiler.listClass.lookupConstructor(
-            new Selector.callConstructor(const SourceString(''),
-                                         compiler.listClass.getLibrary()));
-    trustedClasses = new Set.from([compiler.intClass, compiler.doubleClass,
-                                  compiler.numClass]);
+            new Selector.callConstructor(
+                const SourceString(''),
+                compiler.listClass.getLibrary())).implementation;
     emptyConcreteType = new ConcreteType.empty(compiler.maxConcreteTypeSize,
                                                baseTypes);
     nullConcreteType = singletonConcreteType(const NullBaseType());
@@ -1331,7 +1424,6 @@
   bool analyzeMain(Element element) {
     initialize();
     cache[element] = new Map<ConcreteTypesEnvironment, ConcreteType>();
-    populateAdHocRules();
     try {
       workQueue.addLast(
           new InferenceWorkItem(element, new ConcreteTypesEnvironment(this)));
@@ -1424,14 +1516,35 @@
  */
 class TypeInferrerVisitor extends ResolvedVisitor<ConcreteType> {
   final ConcreteTypesInferrer inferrer;
+  /// Invariant: backend = inferrer.compiler.backend
+  final Backend backend;
 
   final Element currentMethodOrField;
   ConcreteTypesEnvironment environment;
   Node lastSeenNode;
 
   TypeInferrerVisitor(TreeElements elements, this.currentMethodOrField,
-                      this.inferrer, this.environment)
-      : super(elements);
+                      ConcreteTypesInferrer inferrer, this.environment)
+      : this.inferrer = inferrer
+      , this.backend = inferrer.compiler.backend
+      , super(elements) {
+        for (Element element in elements.otherDependencies) {
+          if (element.isClass()) {
+            inferrer.augmentSeenClasses(inferrer.normalize(element));
+          } else {
+            FunctionElement functionElement = element;
+            List<ConcreteType> unknowns = new List.filled(
+                functionElement.computeSignature(inferrer.compiler)
+                               .requiredParameterCount,
+                inferrer.unknownConcreteType);
+            inferrer.getSendReturnType(
+                null,
+                functionElement,
+                functionElement.getEnclosingClass(),
+                new ArgumentsTypes(unknowns, new Map()));
+          }
+        }
+      }
 
   ArgumentsTypes analyzeArguments(Link<Node> arguments) {
     final positional = new List<ConcreteType>();
@@ -1533,8 +1646,14 @@
     }
     Element element = elements[node];
     assert(element != null);
-    environment = environment.put(element, inferrer.nullConcreteType);
-    return inferrer.nullConcreteType;
+    ConcreteType result = environment.lookupType(element);
+    if (result != null) {
+      assert(element.isParameter());
+      return result;
+    } else {
+      environment = environment.put(element, inferrer.nullConcreteType);
+      return inferrer.nullConcreteType;
+    }
   }
 
   ConcreteType visitIf(If node) {
@@ -1680,19 +1799,19 @@
   }
 
   ConcreteType visitLiteralInt(LiteralInt node) {
-    inferrer.augmentSeenClasses(inferrer.compiler.intClass);
-    inferrer.augmentSeenClasses(inferrer.compiler.numClass);
+    inferrer.augmentSeenClasses(backend.intImplementation);
+    inferrer.augmentSeenClasses(backend.numImplementation);
     return inferrer.singletonConcreteType(inferrer.baseTypes.intBaseType);
   }
 
   ConcreteType visitLiteralDouble(LiteralDouble node) {
-    inferrer.augmentSeenClasses(inferrer.compiler.doubleClass);
-    inferrer.augmentSeenClasses(inferrer.compiler.numClass);
+    inferrer.augmentSeenClasses(backend.doubleImplementation);
+    inferrer.augmentSeenClasses(backend.numImplementation);
     return inferrer.singletonConcreteType(inferrer.baseTypes.doubleBaseType);
   }
 
   ConcreteType visitLiteralBool(LiteralBool node) {
-    inferrer.augmentSeenClasses(inferrer.compiler.boolClass);
+    inferrer.augmentSeenClasses(backend.boolImplementation);
     return inferrer.singletonConcreteType(inferrer.baseTypes.boolBaseType);
   }
 
@@ -1718,7 +1837,7 @@
   }
 
   ConcreteType visitNewExpression(NewExpression node) {
-    Element constructor = elements[node.send];
+    Element constructor = elements[node.send].implementation;
     inferrer.addCaller(constructor, currentMethodOrField);
     ClassElement cls = constructor.enclosingElement;
     return inferrer.getSendReturnType(null, constructor, cls,
@@ -1734,7 +1853,7 @@
       elementsType = elementsType.union(analyze(link.head));
     }
     inferrer.augmentListElementType(elementsType);
-    inferrer.augmentSeenClasses(inferrer.compiler.listClass);
+    inferrer.augmentSeenClasses(backend.listImplementation);
     return inferrer.singletonConcreteType(inferrer.baseTypes.listBaseType);
   }
 
@@ -1938,9 +2057,8 @@
         }
       }
     } else {
-      // node is a field of not(this)
-      assert(node.receiver != null);
-
+      // node is a field/getter which doesn't belong to the current class or
+      // the field/getter of a mixed-in class
       ConcreteType result = inferrer.emptyConcreteType;
       void augmentResult(ClassElement baseReceiverType, Element member) {
         if (member.isField()) {
@@ -1955,7 +2073,9 @@
         // since this is a get we ignore non-fields
       }
 
-      ConcreteType receiverType = analyze(node.receiver);
+      ConcreteType receiverType = node.receiver != null
+          ? analyze(node.receiver)
+          : environment.lookupTypeOfThis();
       if (receiverType.isUnknown()) {
         SourceString name = node.selector.asIdentifier().source;
         inferrer.addDynamicCaller(name, currentMethodOrField);
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index 764a4d4..8ee58d2b 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -95,13 +95,14 @@
 
 class SelectorKind {
   final String name;
-  const SelectorKind(this.name);
+  final int hashCode;
+  const SelectorKind(this.name, this.hashCode);
 
-  static const SelectorKind GETTER = const SelectorKind('getter');
-  static const SelectorKind SETTER = const SelectorKind('setter');
-  static const SelectorKind CALL = const SelectorKind('call');
-  static const SelectorKind OPERATOR = const SelectorKind('operator');
-  static const SelectorKind INDEX = const SelectorKind('index');
+  static const SelectorKind GETTER = const SelectorKind('getter', 0);
+  static const SelectorKind SETTER = const SelectorKind('setter', 1);
+  static const SelectorKind CALL = const SelectorKind('call', 2);
+  static const SelectorKind OPERATOR = const SelectorKind('operator', 3);
+  static const SelectorKind INDEX = const SelectorKind('index', 4);
 
   String toString() => name;
 }
@@ -116,6 +117,8 @@
   final List<SourceString> namedArguments;
   final List<SourceString> orderedNamedArguments;
 
+  int cachedHashCode;
+
   Selector(
       this.kind,
       SourceString name,
@@ -205,7 +208,6 @@
   /** Check whether this is a call to 'assert'. */
   bool isAssert() => isCall() && identical(name.stringValue, "assert");
 
-  int get hashCode => argumentCount + 1000 * namedArguments.length;
   int get namedArgumentCount => namedArguments.length;
   int get positionalArgumentCount => argumentCount - namedArgumentCount;
 
@@ -366,11 +368,13 @@
 
   bool operator ==(other) {
     if (other is !Selector) return false;
+    if (identical(this, other)) return true;
     return mask == other.mask && equalsUntyped(other);
   }
 
   bool equalsUntyped(Selector other) {
-    return name == other.name
+    return hashCode == other.hashCode  // Fast because it is cached.
+           && name == other.name
            && kind == other.kind
            && identical(library, other.library)
            && argumentCount == other.argumentCount
@@ -378,6 +382,43 @@
            && sameNames(namedArguments, other.namedArguments);
   }
 
+  int get hashCode {
+    // Check the hash code cache first.
+    if (cachedHashCode != null) return cachedHashCode;
+    // Add bits from name and kind.
+    int hash = mixHashCodeBits(name.hashCode, kind.hashCode);
+    // Add bits from the type mask.
+    if (mask != null) hash = mixHashCodeBits(hash, mask.hashCode);
+    // Add bits from the library.
+    if (library != null) hash = mixHashCodeBits(hash, library.hashCode);
+    // Add bits from the unnamed arguments.
+    hash = mixHashCodeBits(hash, argumentCount);
+    // Add bits from the named arguments.
+    int named = namedArguments.length;
+    hash = mixHashCodeBits(hash, named);
+    for (int i = 0; i < named; i++) {
+      hash = mixHashCodeBits(hash, namedArguments[i].hashCode);
+    }
+    return cachedHashCode = hash;
+  }
+
+  // TODO(kasperl): Move this out so it becomes useful in other places too?
+  static int mixHashCodeBits(int existing, int value) {
+    // Spread the bits of value. Try to stay in the 30-bit range to
+    // avoid overflowing into a more expensive integer representation.
+    int h = value & 0x1fffffff;
+    h += ((h & 0x3fff) << 15) ^ 0x1fffcd7d;
+    h ^= (h >> 10);
+    h += ((h & 0x3ffffff) << 3);
+    h ^= (h >> 6);
+    h += ((h & 0x7ffffff) << 2) + ((h & 0x7fff) << 14);
+    h ^= (h >> 16);
+    // Combine the two hash values.
+    int high = existing >> 15;
+    int low = existing & 0x7fff;
+    return (high * 13) ^ (low * 997) ^ h;
+  }
+
   List<SourceString> getOrderedNamedArguments() {
     if (namedArguments.isEmpty) return namedArguments;
     if (!orderedNamedArguments.isEmpty) return orderedNamedArguments;
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index 97b7cfa..5425bd1 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -428,6 +428,15 @@
  * a qualified non-private identifier optionally followed by "=", or
  * a qualified non-private identifier followed by "." and a user-defined operator.''');
 
+  static const AMBIGUOUS_REEXPORT = const MessageKind(
+    'Info: "#{element}" is (re)exported by multiple libraries.');
+
+  static const AMBIGUOUS_LOCATION = const MessageKind(
+    'Info: "#{element}" is defined here.');
+
+  static const IMPORTED_HERE = const MessageKind(
+    'Info: "#{element}" is imported here.');
+
   static const COMPILER_CRASHED = const MessageKind(
       "Error: The compiler crashed when compiling this element.");
 
diff --git a/sdk/lib/_internal/dartdoc/bin/dartdoc.dart b/sdk/lib/_internal/dartdoc/bin/dartdoc.dart
index d9fe3d9..c0fdf6e 100644
--- a/sdk/lib/_internal/dartdoc/bin/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/bin/dartdoc.dart
@@ -29,10 +29,18 @@
  * Run this from the `lib/_internal/dartdoc` directory.
  */
 main() {
+  mainWithOptions(new Options());
+}
+
+/**
+ * We use this to include dartdoc in a single snapshot with dart2js.
+ * (They share 90% of the code)
+ */
+mainWithOptions(Options options) {
   // Need this because ArgParser.getUsage doesn't show command invocation.
   final USAGE = 'Usage dartdoc [options] <entrypoint(s)>\n[options] include:';
 
-  final args = new Options().arguments;
+  final args = options.arguments;
 
   final dartdoc = new Dartdoc();
 
@@ -239,9 +247,10 @@
     // Prepare the dart2js script code and copy static resources.
     // TODO(amouravski): move compileScript out and pre-generate the client
     // scripts. This takes a long time and the js hardly ever changes.
-    .then((_) => compileScript(dartdoc.mode, dartdoc.outputDir, libPath))
-    .then((_) => copyDirectory(scriptDir.append('../static'),
-          dartdoc.outputDir))
+    .then((_) => compileScript(dartdoc.mode, dartdoc.outputDir, libPath,
+          dartdoc.tmpPath))
+    .then((_) => copyDirectory(libPath.append('lib/_internal/dartdoc/static'),
+                               dartdoc.outputDir))
     .then((_) {
       print(dartdoc.status);
       if (dartdoc.totals == 0) {
diff --git a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
index dfc0f45..f470414 100644
--- a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
@@ -103,6 +103,7 @@
   print('Copying static files...');
   final completer = new Completer();
   final fromDir = new Directory.fromPath(from);
+  var futureList = [];
   fromDir.list(recursive: false).listen(
       (FileSystemEntity entity) {
         if (entity is File) {
@@ -112,10 +113,10 @@
 
           File fromFile = entity;
           File toFile = new File.fromPath(to.append(name));
-          fromFile.openRead().pipe(toFile.openWrite());
+          futureList.add(fromFile.openRead().pipe(toFile.openWrite()));
         }
       },
-      onDone: () => completer.complete(),
+      onDone: () => Future.wait(futureList).then((_) => completer.complete()),
       onError: (e) => completer.completeError(e));
   return completer.future;
 }
@@ -123,42 +124,25 @@
 /**
  * Compiles the dartdoc client-side code to JavaScript using Dart2js.
  */
-Future compileScript(int mode, Path outputDir, Path libPath) {
+Future compileScript(int mode, Path outputDir, Path libPath, String tmpPath) {
   print('Compiling client JavaScript...');
+  var clientScript = (mode == MODE_STATIC) ?  'static' : 'live-nav';
+  var dartdocLibPath = pathos.join(libPath.toNativePath(),
+      'lib', '_internal', 'dartdoc', 'lib');
+  var dartPath = mode == MODE_STATIC ?
+    pathos.join(tmpPath, 'client.dart') :
+    pathos.join(dartdocLibPath, 'src', 'client', 'client-live-nav.dart');
 
-  // TODO(nweiz): don't run this in an isolate when issue 9815 is fixed.
-  return spawnFunction(_compileScript).call({
-    'mode': mode,
-    'outputDir': outputDir.toNativePath(),
-    'libPath': libPath.toNativePath()
-  }).then((result) {
-    if (result.first == 'success') return;
-    throw result[1] + (result[2] == null ? '' : '\n' + result[2]);
-  });
-}
+  var jsPath = pathos.join(outputDir.toNativePath(),
+    'client-$clientScript.js');
 
-void _compileScript() {
-  port.receive((message, replyTo) {
-    new Future.sync(() {
-      var clientScript = (message['mode'] == MODE_STATIC) ?
-          'static' : 'live-nav';
-      var dartPath = pathos.join(message['libPath'], 'lib', '_internal',
-          'dartdoc', 'lib', 'src', 'client', 'client-$clientScript.dart');
-      var jsPath = pathos.join(message['outputDir'], 'client-$clientScript.js');
-
-      return dart2js.compile(
-          new Path(dartPath), new Path(message['libPath']),
-          options: const <String>['--categories=Client,Server', '--minify'])
-      .then((jsCode) {
-        writeString(new File(jsPath), jsCode);
-      });
-    }).then((_) {
-      replyTo.send(['success']);
-    }).catchError((error) {
-      var trace = getAttachedStackTrace(error);
-      var traceString = trace == null ? null : trace.toString();
-      replyTo.send(['error', error.toString(), traceString]);
-    });
+  return dart2js.compile(
+      new Path(dartPath), libPath,
+      options: const <String>['--categories=Client,Server', '--minify'])
+  .then((jsCode) {
+    if (jsCode != null) {
+      writeString(new File(jsPath), jsCode);
+    }
   });
 }
 
@@ -286,6 +270,9 @@
   /** The map containing all the exports for each library. */
   ExportMap _exports;
 
+  /** The path to a temporary directory used by Dartdoc. */
+  String tmpPath;
+
   /**
    * This list contains the libraries sorted in by the library name.
    */
@@ -370,8 +357,8 @@
   List<md.InlineSyntax> dartdocSyntaxes =
     [new md.CodeSyntax(r'\[:\s?((?:.|\n)*?)\s?:\]')];
 
-
   Dartdoc() {
+    tmpPath = new Directory('').createTempSync().path;
     dartdocResolver = (String name) => resolveNameReference(name,
         currentLibrary: _currentLibrary, currentType: _currentType,
         currentMember: _currentMember);
@@ -782,34 +769,54 @@
     writeln(json.stringify(createNavigationInfo()));
     endFile();
   }
+  /// Whether dartdoc is running from within the Dart SDK or the
+  /// Dart source repository.
+  bool get runningFromSdk =>
+    pathos.extension(new Options().script) == '.snapshot';
+
+  /// Gets the path to the root directory of the SDK.
+  String get sdkDir =>
+    pathos.dirname(pathos.dirname(new Options().executable));
+
+  /// Gets the path to the dartdoc directory normalized for running in different
+  /// places.
+  String get normalizedDartdocPath => runningFromSdk ?
+      pathos.join(sdkDir, 'lib', '_internal', 'dartdoc') :
+      dartdocPath.toString();
 
   void docNavigationDart() {
-    final dir = new Directory.fromPath(tmpPath);
-    if (!dir.existsSync()) {
-      // TODO(3914): Hack to avoid 'file already exists' exception
-      // thrown due to invalid result from dir.existsSync() (probably due to
-      // race conditions).
-      try {
-        dir.createSync();
-      } on DirectoryIOException catch (e) {
-        // Ignore.
-      }
+    var tmpDir = new Directory(tmpPath);
+    if (!tmpDir.existsSync()) {
+        tmpDir.createSync();
     }
     String jsonString = json.stringify(createNavigationInfo());
     String dartString = jsonString.replaceAll(r"$", r"\$");
-    final filePath = tmpPath.append('nav.dart');
-    writeString(new File.fromPath(filePath),
-        '''part of client;
-           get json => $dartString;''');
+    var filePath = pathos.join(tmpPath, 'client.dart');
+    var clientDir = pathos.relative(
+        pathos.join(normalizedDartdocPath, 'lib', 'src', 'client'),
+        from: tmpPath);
+
+    writeString(new File(filePath),
+        '''library client;
+        import 'dart:html';
+        import 'dart:json';
+        import '${pathos.join(clientDir, 'client-shared.dart')}';
+        import '${pathos.join(clientDir, 'dropdown.dart')}';
+
+        main() {
+          setup();
+          setupSearch(json);
+        }
+
+        get json => $dartString;''');
   }
 
-  Path get tmpPath => dartdocPath.append('tmp');
-
   void cleanup() {
-    final dir = new Directory.fromPath(tmpPath);
-    if (dir.existsSync()) {
-      dir.deleteSync(recursive: true);
+    var tmpDir = new Directory(tmpPath);
+    if (tmpDir.existsSync()) {
+      tmpDir.deleteSync(recursive: true);
     }
+    tmpPath = null;
   }
 
   List createNavigationInfo() {
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 6d0948c..9d52c49 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
@@ -7,7 +7,6 @@
 
 import 'dart:html';
 import 'dart:json' as jsonlib;
-import '../../../../compiler/implementation/source_file.dart';
 // TODO(rnystrom): Use "package:" URL (#4968).
 import '../../classify.dart';
 import '../../markdown.dart' as md;
diff --git a/sdk/lib/_internal/dartdoc/lib/src/client/client-static.dart b/sdk/lib/_internal/dartdoc/lib/src/client/client-static.dart
deleted file mode 100644
index d76b21e..0000000
--- a/sdk/lib/_internal/dartdoc/lib/src/client/client-static.dart
+++ /dev/null
@@ -1,18 +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.
-
-/** Provides client-side behavior for generated docs using the static mode. */
-library client;
-
-import 'dart:html';
-import 'dart:json';
-import 'dropdown.dart';
-import 'client-shared.dart';
-
-part '../../../tmp/nav.dart';
-
-main() {
-  setup();
-  setupSearch(json);
-}
diff --git a/sdk/lib/_internal/pub/test/command_line_config.dart b/sdk/lib/_internal/pub/test/command_line_config.dart
index ed55aff..bdceafb 100644
--- a/sdk/lib/_internal/pub/test/command_line_config.dart
+++ b/sdk/lib/_internal/pub/test/command_line_config.dart
@@ -106,11 +106,8 @@
     return result.toString();
   }
 
-  String _indent(String str) {
-    // TODO(nweiz): Use this simpler code once issue 2980 is fixed.
-    // return str.replaceAll(new RegExp("^", multiLine: true), "  ");
-    return str.split("\n").map((line) => "  $line").join("\n");
-  }
+  String _indent(String str) =>
+    str.replaceAll(new RegExp("^", multiLine: true), "  ");
 }
 
 class _StackFrame {
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 43697ec..bff0435 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -1033,7 +1033,7 @@
  *
  * An example that duplicates all data events:
  *
- *     class DoubleTransformer<T> extends StreamEventTransformerBase<T, T> {
+ *     class DoubleTransformer<T> extends StreamEventTransformer<T, T> {
  *       void handleData(T data, EventSink<T> sink) {
  *         sink.add(value);
  *         sink.add(value);
diff --git a/sdk/lib/collection/hash_map.dart b/sdk/lib/collection/hash_map.dart
index 431c89f..2aea9c9 100644
--- a/sdk/lib/collection/hash_map.dart
+++ b/sdk/lib/collection/hash_map.dart
@@ -4,6 +4,17 @@
 
 part of dart.collection;
 
+/**
+ * A hash-table based implementation of [Map].
+ *
+ * The keys of a `HashMap` must have consistent [Object.operator==]
+ * and [Object.hashCode] implementations. This means that the `==` operator
+ * must define a stable equivalence relation on the keys (reflexive,
+ * anti-symmetric, transitive, and consistent over time), and that `hashCode`
+ * must be the same for objects that are considered equal by `==`.
+ *
+ * The map allows `null` as a key.
+ */
 class HashMap<K, V> implements Map<K, V> {
   external HashMap();
 
diff --git a/sdk/lib/collection/hash_set.dart b/sdk/lib/collection/hash_set.dart
index 8d484db..e2c797d 100644
--- a/sdk/lib/collection/hash_set.dart
+++ b/sdk/lib/collection/hash_set.dart
@@ -56,6 +56,20 @@
   String toString() => ToString.iterableToString(this);
 }
 
+/**
+ * A [HashSet] is a hash-table based [Set] implementation.
+ *
+ * The elements of a `HashSet` must have consistent [Object.operator==]
+ * and [Object.hashCode] implementations. This means that the `==` operator
+ * must define a stable equivalence relation on the elements (reflexive,
+ * anti-symmetric, transitive, and consistent over time), and that `hashCode`
+ * must be the same for objects that are considered equal by `==`.
+ *
+ * The set allows `null` as an element.
+ *
+ * Most simple operations on `HashSet` are done in constant time: [add],
+ * [contains], [remove], and [length].
+ */
 class HashSet<E> extends _HashSetBase<E> {
   external HashSet();
 
@@ -74,7 +88,7 @@
 
   external bool contains(Object object);
 
-  // Collection.
+  // Set.
   external void add(E element);
 
   external void addAll(Iterable<E> objects);
@@ -89,6 +103,5 @@
 
   external void clear();
 
-  // Set.
   Set<E> _newSet() => new HashSet<E>();
 }
diff --git a/sdk/lib/collection/linked_hash_map.dart b/sdk/lib/collection/linked_hash_map.dart
index d41cb40..8e6538c 100644
--- a/sdk/lib/collection/linked_hash_map.dart
+++ b/sdk/lib/collection/linked_hash_map.dart
@@ -5,7 +5,18 @@
 part of dart.collection;
 
 /**
- * A hash-based map that iterates keys and values in key insertion order.
+ * A hash-table based implementation of [Map].
+ *
+ * Keys insertion order is remembered, and keys are iterated in insertion order.
+ * Values are iterated in their corresponding key's order.
+ *
+ * The keys of a `HashMap` must have consistent [Object.operator==]
+ * and [Object.hashCode] implementations. This means that the `==` operator
+ * must define a stable equivalence relation on the keys (reflexive,
+ * anti-symmetric, transitive, and consistent over time), and that `hashCode`
+ * must be the same for objects that are considered equal by `==`.
+ *
+ * The map allows `null` as a key.
  */
 class LinkedHashMap<K, V> implements Map<K, V> {
   external LinkedHashMap();
@@ -32,7 +43,9 @@
 
   external void forEach(void action (K key, V value));
 
+  /** The keys of the map, in insertion order. */
   external Iterable<K> get keys;
+  /** The values of the map, in the order of their corresponding [keys].*/
   external Iterable<V> get values;
 
   external int get length;
diff --git a/sdk/lib/collection/linked_hash_set.dart b/sdk/lib/collection/linked_hash_set.dart
index ee9cdb1..28b7ce2 100644
--- a/sdk/lib/collection/linked_hash_set.dart
+++ b/sdk/lib/collection/linked_hash_set.dart
@@ -4,6 +4,23 @@
 
 part of dart.collection;
 
+/**
+ * A [LinkedHashSet] is a hash-table based [Set] implementation.
+ *
+ * The `LinkedHashSet` also keep track of the order that elements were inserted
+ * in, and iteration happens in first-to-last insertion order.
+ *
+ * The elements of a `LinkedHashSet` must have consistent [Object.operator==]
+ * and [Object.hashCode] implementations. This means that the `==` operator
+ * must define a stable equivalence relation on the elements (reflexive,
+ * anti-symmetric, transitive, and consistent over time), and that `hashCode`
+ * must be the same for objects that are considered equal by `==`.
+ *
+ * The set allows `null` as an element.
+ *
+ * Most simple operations on `HashSet` are done in constant time: [add],
+ * [contains], [remove], and [length].
+ */
 class LinkedHashSet<E> extends _HashSetBase<E> {
 
   external LinkedHashSet();
@@ -13,6 +30,8 @@
   }
 
   // Iterable.
+
+  /** Return an iterator that iterates over elements in insertion order. */
   external Iterator<E> get iterator;
 
   external int get length;
@@ -23,6 +42,7 @@
 
   external bool contains(Object object);
 
+  /** Perform an operation on each element in insertion order. */
   external void forEach(void action(E element));
 
   external E get first;
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 060eba7..245fc49 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -235,6 +235,13 @@
   String toString() => "Stack Overflow";
 }
 
+class FiftyThreeBitOverflowError implements Error {
+  final Object value;
+
+  const FiftyThreeBitOverflowError(this.value);
+  String toString() => "53-bit Overflow: $value";
+}
+
 /**
  * Error thrown when a lazily initialized variable cannot be initialized.
  *
diff --git a/sdk/lib/core/list.dart b/sdk/lib/core/list.dart
index 672c8b8..419527e 100644
--- a/sdk/lib/core/list.dart
+++ b/sdk/lib/core/list.dart
@@ -374,7 +374,8 @@
    * Returns an unmodifiable [Map] view of `this`.
    *
    * It has the indices of this list as keys, and the corresponding elements
-   * as values.
+   * as values. The [Map.keys] [Iterable] will iterate the indices of this list
+   * in numerical order.
    */
   Map<int, E> asMap();
 }
diff --git a/sdk/lib/core/num.dart b/sdk/lib/core/num.dart
index eb8f82c..19dbbe2 100644
--- a/sdk/lib/core/num.dart
+++ b/sdk/lib/core/num.dart
@@ -22,7 +22,7 @@
    *
    * Returns the remainder of the euclidean division. The euclidean division of
    * two integers `a` and `b` yields two integers `q` and `r` such that
-   * `a = b*q + r` and `0 <= r < |a|`.
+   * `a == b*q + r` and `0 <= r < a.abs()`.
    *
    * The euclidean division is only defined for integers, but can be easily
    * extended to work with doubles. In that case `r` may have a non-integer
@@ -51,10 +51,10 @@
   /** Negate operator. */
   num operator -();
 
-  /**
-   * Return the remainder of the truncating division of `this` by [other].
+ /**
+   * Returns the remainder of the truncating division of `this` by [other].
    *
-   * The result `r` of this operation satisfies: `this = this ~/ other + r`.
+   * The result `r` of this operation satisfies: `this == this ~/ other + r`.
    * As a consequence the remainder `r` has the same sign as the dividend
    * `this`.
    */
@@ -165,8 +165,8 @@
   double toDouble();
 
   /**
-   * Converts [this] to a string representation with [fractionDigits] digits
-   * after the decimal point.
+   * Converts [this] to a [double] and then gives string representation with
+   * [fractionDigits] digits after the decimal point.
    *
    * The parameter [fractionDigits] must be an integer satisfying:
    * [:0 <= fractionDigits <= 20:].
@@ -174,8 +174,8 @@
   String toStringAsFixed(int fractionDigits);
 
   /**
-   * Converts [this] to a string in decimal exponential notation with
-   * [fractionDigits] digits after the decimal point.
+   * Converts [this] to a [double] and then gives a string in decimal
+   * exponential notation with [fractionDigits] digits after the decimal point.
    *
    * If [fractionDigits] is given then it must be an integer satisfying:
    * [:0 <= fractionDigits <= 20:]. Without the parameter the returned string
@@ -184,13 +184,11 @@
   String toStringAsExponential([int fractionDigits]);
 
   /**
-   * Converts [this] to a string representation with [precision] significant
-   * digits.
+   * Converts [this] to a double and gives a string representation with
+   * [precision] significant digits.
    *
    * The parameter [precision] must be an integer satisfying:
    * [:1 <= precision <= 21:].
    */
   String toStringAsPrecision(int precision);
-
-
 }
diff --git a/sdk/lib/core/regexp.dart b/sdk/lib/core/regexp.dart
index c6db026..dd29d51 100644
--- a/sdk/lib/core/regexp.dart
+++ b/sdk/lib/core/regexp.dart
@@ -18,7 +18,7 @@
  *     for (Match m in matches) {
  *       String match = m.group(0);
  *       print(match);
- *     };
+ *     }
  *
  * The output of the example is:
  *
diff --git a/sdk/lib/core/set.dart b/sdk/lib/core/set.dart
index ff8d4b3..7b5980e 100644
--- a/sdk/lib/core/set.dart
+++ b/sdk/lib/core/set.dart
@@ -5,14 +5,37 @@
 part of dart.core;
 
 /**
- * This class is the public interface of a set. A set is a collection
- * without duplicates.
+ * A `Set` is a collection of elements where each element can occur only once.
+ *
+ * That is, for each object of the element type, the object is either considered
+ * to be in the set, or it is not in the set.
+ *
+ * Set implementations may consider some elements indistinguishable. These
+ * objects will be treated as being the same for any operation on the set.
+ *
+ * The default `Set` implementation, [HashSet], considers objects
+ * indistinguishable if they are equal with regard to [Object.operator==].
+ *
+ * Sets may be either ordered or unordered. [HashSet] is unordered and doesn't
+ * guarantee anything about the order that elements are accessed in by
+ * iteration. [LinkedHashSet] iterates in the insertion order of its elements.
  */
 abstract class Set<E> extends IterableBase<E> {
+  /**
+   * Creates an empty [Set].
+   *
+   * The created `Set` is a [HashSet]. As such, it considers elements that
+   * are equal (using `==`) to be undistinguishable, and requires them to
+   * have a compatible [Object.hashCode] implementation.
+   */
   factory Set() => new HashSet<E>();
 
   /**
    * Creates a [Set] that contains all elements of [other].
+   *
+   * The created `Set` is a [HashSet]. As such, it considers elements that
+   * are equal (using `==`) to be undistinguishable, and requires them to
+   * have a compatible [Object.hashCode] implementation.
    */
   factory Set.from(Iterable<E> other) => new HashSet<E>.from(other);
 
@@ -22,8 +45,9 @@
   bool contains(E value);
 
   /**
-   * Adds [value] into the set. The method has no effect if
-   * [value] was already in the set.
+   * Adds [value] into the set.
+   *
+   * The method has no effect if [value] is already in the set.
    */
   void add(E value);
 
@@ -43,13 +67,12 @@
   bool remove(Object value);
 
   /**
-   * Removes all of [elements] from this set.
+   * Removes each element of [elements] from this set.
    */
   void removeAll(Iterable elements);
 
   /**
-   * Removes all elements of this set that are not
-   * in [elements].
+   * Removes all elements of this set that are not elements in [elements].
    */
   void retainAll(Iterable elements);
 
@@ -64,22 +87,31 @@
   void retainWhere(bool test(E element));
 
   /**
-   * Returns true if this Set contains all the elements of [other].
+   * Returns whether this Set contains all the elements of [other].
    */
   bool containsAll(Iterable<E> other);
 
   /**
    * Returns a new set which is the intersection between this set and [other].
+   *
+   * That is, the returned set contains all the elements of this `Set` that
+   * are also elements of [other].
    */
   Set<E> intersection(Set<E> other);
 
   /**
    * Returns a new set which contains all the elements of this set and [other].
+   *
+   * That is, the returned set contains all the elements of this `Set` and
+   * all the elements of [other].
    */
   Set<E> union(Set<E> other);
 
   /**
    * Returns a new set with the the elements of this that are not in [other].
+   *
+   * That is, the returned set contains all the elements of this `Set` that
+   * are not elements of [other].
    */
   Set<E> difference(Set<E> other);
 
diff --git a/sdk/lib/core/string.dart b/sdk/lib/core/string.dart
index 3f0ad31..0b4fbd4 100644
--- a/sdk/lib/core/string.dart
+++ b/sdk/lib/core/string.dart
@@ -179,10 +179,14 @@
   String trim();
 
   /**
-   * Returns whether this string contains [other] starting
-   * at [startIndex] (inclusive).
+   * Returns whether this string contains a match of [other].
+   *
+   * If [startIndex] is provided, only matches at or after that index
+   * are considered.
+   *
+   * It is an error if [startIndex] is negative or greater than [length].
    */
-  bool contains(Pattern other, [int startIndex]);
+  bool contains(Pattern other, [int startIndex = 0]);
 
   /**
    * Returns a new string where the first occurence of [from] in this string
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index a7926dd..75bd214 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -9,6 +9,7 @@
  */
 class Uri {
   int _port;
+  String _path;
 
   /**
    * Returns the scheme component.
@@ -63,7 +64,7 @@
    *
    * Returns the empty string if there is no path component.
    */
-  final String path;
+  String get path => _path;
 
   /**
    * Returns the query component. The returned query is encoded. To get
@@ -137,7 +138,9 @@
    * is percent-encoded and joined using the forward slash
    * separator. The percent-encoding of the path segments encodes all
    * characters except for the unreserved characters and the following
-   * list of characters: `!$&'()*+,;=:@`.
+   * list of characters: `!$&'()*+,;=:@`. If the other components
+   * calls for an absolute path a leading slash `/` is prepended if
+   * not already there.
    *
    * The query component is set through either [query] or
    * [queryParameters]. When [query] is used the provided string is
@@ -160,7 +163,6 @@
        Map<String, String> queryParameters,
        fragment: ""}) :
       scheme = _makeScheme(scheme),
-      path = _makePath(path, pathSegments),
       query = _makeQuery(query, queryParameters),
       fragment = _makeFragment(fragment) {
     // Perform scheme specific normalization.
@@ -171,23 +173,29 @@
     } else {
       _port = port;
     }
+    // Fill the path.
+    _path = _makePath(path, pathSegments);
   }
 
   /*
    * Returns the URI path split into its segments. Each of the
    * segments in the returned list have been decoded. If the path is
-   * empty the empty list will be returned.
+   * empty the empty list will be returned. A leading slash `/` does
+   * not affect the segments returned.
    *
-   * The returned list is immutable and will throw [StateError] on any
+   * The returned list is unmodifiable and will throw [UnsupportedError] on any
    * calls that would mutate it.
    */
   List<String> get pathSegments {
     if (_pathSegments == null) {
+      var pathToSplit = !path.isEmpty && path.codeUnitAt(0) == _SLASH
+                        ? path.substring(1)
+                        : path;
       _pathSegments = new UnmodifiableListView(
-        path == "" ? const<String>[]
-                   : path.split("/")
-                         .map(Uri.decodeComponent)
-                         .toList(growable: false));
+        pathToSplit == "" ? const<String>[]
+                          : pathToSplit.split("/")
+                                       .map(Uri.decodeComponent)
+                                       .toList(growable: false));
     }
     return _pathSegments;
   }
@@ -198,7 +206,7 @@
    * and value in the returned map have been decoded. If there is no
    * query the empty map will be returned.
    *
-   * The returned map is immutable and will throw [StateError] on any
+   * The returned map is unmodifiable and will throw [UnsupportedError] on any
    * calls that would mutate it.
    */
   Map<String, String> get queryParameters {
@@ -247,14 +255,22 @@
     return allLowercase ? scheme : scheme.toLowerCase();
   }
 
-  static String _makePath(String path, List<String> pathSegments) {
+  String _makePath(String path, List<String> pathSegments) {
     if (path == null && pathSegments == null) return "";
     if (path != null && pathSegments != null) {
       throw new ArgumentError('Both path and pathSegments specified');
     }
-    if (path != null) return _normalize(path);
-
-    return pathSegments.map((s) => _uriEncode(_pathCharTable, s)).join("/");
+    var result;
+    if (path != null) {
+      result = _normalize(path);
+    } else {
+      result = pathSegments.map((s) => _uriEncode(_pathCharTable, s)).join("/");
+    }
+    if ((hasAuthority || (scheme == "file")) &&
+        result.isNotEmpty && !result.startsWith("/")) {
+      return "/$result";
+    }
+    return result;
   }
 
   static String _makeQuery(String query, Map<String, String> queryParameters) {
@@ -705,6 +721,7 @@
   // Frequently used character codes.
   static const int _PERCENT = 0x25;
   static const int _PLUS = 0x2B;
+  static const int _SLASH = 0x2F;
   static const int _ZERO = 0x30;
   static const int _NINE = 0x39;
   static const int _COLON = 0x3A;
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index e9de909..a3f0363 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -2058,13 +2058,10 @@
   @DocsEditable
   String name;
 
-  @JSName('None')
-  @DomName('WebKitCSSKeyframesRule')
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental
-  // http://www.w3.org/TR/css3-animations/#csskeyframesrule
-  CssKeyframeRule item(int index) native;
+  @DomName('WebKitCSSKeyframesRule.__getter__')
+  @DocsEditable
+  @Experimental // untriaged
+  CssKeyframeRule __getter__(int index) native;
 
   @DomName('WebKitCSSKeyframesRule.deleteRule')
   @DocsEditable
@@ -7129,9 +7126,10 @@
   @DocsEditable
   String value;
 
-  @JSName('None')
-  @DomName('DOMSettableTokenList')
-  String item(int index) native;
+  @DomName('DOMSettableTokenList.__getter__')
+  @DocsEditable
+  @Experimental // untriaged
+  String __getter__(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
@@ -7206,7 +7204,7 @@
 @DomName('DOMStringMap')
 abstract class DomStringMap {
 
-  String None(String name);
+  String __getter__(String name);
 }
 // 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
@@ -9099,6 +9097,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+@DomName('ElementTimeControl')
+@Unstable
+abstract class ElementTimeControl {
+
+  void beginElement();
+
+  void beginElementAt(num offset);
+
+  void endElement();
+
+  void endElementAt(num offset);
+}
+// 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('ElementTraversal')
 @Unstable
 abstract class ElementTraversal {
@@ -10599,9 +10614,10 @@
   @DocsEditable
   String target;
 
-  @JSName('None')
-  @DomName('HTMLFormElement')
-  Node item(int index) native;
+  @DomName('HTMLFormElement.__getter__')
+  @DocsEditable
+  @Experimental // untriaged
+  Node __getter__(int index) native;
 
   @DomName('HTMLFormElement.checkValidity')
   @DocsEditable
@@ -11283,9 +11299,10 @@
 @DomName('HTMLFormControlsCollection')
 class HtmlFormControlsCollection extends HtmlCollection native "HTMLFormControlsCollection" {
 
-  @JSName('None')
-  @DomName('HTMLFormControlsCollection')
-  Node item(int index) native;
+  @DomName('HTMLFormControlsCollection.__getter__')
+  @DocsEditable
+  @Experimental // untriaged
+  Node __getter__(int index) native;
 
   @DomName('HTMLFormControlsCollection.namedItem')
   @DocsEditable
@@ -11859,7 +11876,7 @@
 @DomName('XMLHttpRequestUpload')
 // http://xhr.spec.whatwg.org/#xmlhttprequestupload
 @Experimental
-class HttpRequestUpload extends EventTarget native "XMLHttpRequestUpload" {
+class HttpRequestUpload extends EventTarget native "XMLHttpRequestUpload,XMLHttpRequestEventTarget" {
 
   @DomName('XMLHttpRequestUpload.abortEvent')
   @DocsEditable
@@ -18862,7 +18879,8 @@
   // Override default options, since IE returns SelectElement itself and it
   // does not operate as a List.
   List<OptionElement> get options {
-    var options = this.children.where((e) => e is OptionElement).toList();
+    var options =
+        this.queryAll('option').where((e) => e is OptionElement).toList();
     return new UnmodifiableListView(options);
   }
 
@@ -19908,10 +19926,10 @@
   @DocsEditable
   final int $dom_length;
 
-  @JSName('None')
-  @DomName('Storage')
-  @Unstable
-  String anonymousIndexedGetter(index_OR_name) native;
+  @DomName('Storage.__getter__')
+  @DocsEditable
+  @Experimental // untriaged
+  String __getter__(index_OR_name) native;
 
   @JSName('clear')
   @DomName('Storage.clear')
@@ -22903,17 +22921,21 @@
   @Returns('Window|=Object')
   final dynamic _get_window;
 
-  @DomName('Window')
+  @DomName('Window.__getter__')
+  @DocsEditable
+  @Experimental // untriaged
   @Creates('Window|=Object')
   @Returns('Window|=Object')
-  WindowBase anonymousIndexedGetter(int index) {
-    return _convertNativeToDart_Window(_anonymousIndexedGetter_1(index));
+  WindowBase __getter__(int index) {
+    return _convertNativeToDart_Window(___getter___1(index));
   }
-  @JSName('None')
-  @DomName('Window')
+  @JSName('__getter__')
+  @DomName('Window.__getter__')
+  @DocsEditable
+  @Experimental // untriaged
   @Creates('Window|=Object')
   @Returns('Window|=Object')
-  _anonymousIndexedGetter_1(index) native;
+  ___getter___1(index) native;
 
   @JSName('addEventListener')
   @DomName('Window.addEventListener')
@@ -29139,7 +29161,7 @@
   int get _realCharCode => JS('int', '#.charCode', _parent);
 
   /** Accessor to the underlying altKey value is the parent event. */
-  bool get _realAltKey => JS('int', '#.altKey', _parent);
+  bool get _realAltKey => JS('bool', '#.altKey', _parent);
 
   /** Construct a KeyEvent with [parent] as the event we're emulating. */
   KeyEvent(KeyboardEvent parent): super(parent) {
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 1942b09..e8df740 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -2491,12 +2491,10 @@
   @DocsEditable
   void set name(String value) native "WebKitCSSKeyframesRule_name_Setter";
 
-  @DomName('WebKitCSSKeyframesRule')
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental
-  // http://www.w3.org/TR/css3-animations/#csskeyframesrule
-  CssKeyframeRule item(int index) native "WebKitCSSKeyframesRule_None_Callback";
+  @DomName('WebKitCSSKeyframesRule.__getter__')
+  @DocsEditable
+  @Experimental // untriaged
+  CssKeyframeRule __getter__(int index) native "WebKitCSSKeyframesRule___getter___Callback";
 
   @DomName('WebKitCSSKeyframesRule.deleteRule')
   @DocsEditable
@@ -7564,8 +7562,10 @@
   @DocsEditable
   void set value(String value) native "DOMSettableTokenList_value_Setter";
 
-  @DomName('DOMSettableTokenList')
-  String item(int index) native "DOMSettableTokenList_None_Callback";
+  @DomName('DOMSettableTokenList.__getter__')
+  @DocsEditable
+  @Experimental // untriaged
+  String __getter__(int index) native "DOMSettableTokenList___getter___Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7650,8 +7650,10 @@
 class DomStringMap extends NativeFieldWrapperClass1 {
   DomStringMap.internal();
 
-  @DomName('DOMStringMap')
-  String item(String name) native "DOMStringMap_None_Callback";
+  @DomName('DOMStringMap.__getter__')
+  @DocsEditable
+  @Experimental // untriaged
+  String __getter__(String name) native "DOMStringMap___getter___Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9387,6 +9389,36 @@
 
 
 @DocsEditable
+@DomName('ElementTimeControl')
+@Unstable
+class ElementTimeControl extends NativeFieldWrapperClass1 {
+  ElementTimeControl.internal();
+
+  @DomName('ElementTimeControl.beginElement')
+  @DocsEditable
+  void beginElement() native "ElementTimeControl_beginElement_Callback";
+
+  @DomName('ElementTimeControl.beginElementAt')
+  @DocsEditable
+  void beginElementAt(num offset) native "ElementTimeControl_beginElementAt_Callback";
+
+  @DomName('ElementTimeControl.endElement')
+  @DocsEditable
+  void endElement() native "ElementTimeControl_endElement_Callback";
+
+  @DomName('ElementTimeControl.endElementAt')
+  @DocsEditable
+  void endElementAt(num offset) native "ElementTimeControl_endElementAt_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('ElementTraversal')
 @Unstable
 class ElementTraversal extends NativeFieldWrapperClass1 {
@@ -11006,8 +11038,10 @@
   @DocsEditable
   void set target(String value) native "HTMLFormElement_target_Setter";
 
-  @DomName('HTMLFormElement')
-  Node item(int index) native "HTMLFormElement_None_Callback";
+  @DomName('HTMLFormElement.__getter__')
+  @DocsEditable
+  @Experimental // untriaged
+  Node __getter__(int index) native "HTMLFormElement___getter___Callback";
 
   @DomName('HTMLFormElement.checkValidity')
   @DocsEditable
@@ -11704,8 +11738,10 @@
 class HtmlFormControlsCollection extends HtmlCollection {
   HtmlFormControlsCollection.internal() : super.internal();
 
-  @DomName('HTMLFormControlsCollection')
-  Node item(int index) native "HTMLFormControlsCollection_None_Callback";
+  @DomName('HTMLFormControlsCollection.__getter__')
+  @DocsEditable
+  @Experimental // untriaged
+  Node __getter__(int index) native "HTMLFormControlsCollection___getter___Callback";
 
   @DomName('HTMLFormControlsCollection.namedItem')
   @DocsEditable
@@ -20178,7 +20214,8 @@
   // Override default options, since IE returns SelectElement itself and it
   // does not operate as a List.
   List<OptionElement> get options {
-    var options = this.children.where((e) => e is OptionElement).toList();
+    var options =
+        this.queryAll('option').where((e) => e is OptionElement).toList();
     return new UnmodifiableListView(options);
   }
 
@@ -21395,19 +21432,19 @@
   @DocsEditable
   int get $dom_length native "Storage_length_Getter";
 
-  String anonymousIndexedGetter(index_OR_name) {
+  String __getter__(index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return _None_1(index_OR_name);
+      return ___getter___1(index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return _None_2(index_OR_name);
+      return ___getter___2(index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  String _None_1(index_OR_name) native "Storage__None_1_Callback";
+  String ___getter___1(index_OR_name) native "Storage____getter___1_Callback";
 
-  String _None_2(index_OR_name) native "Storage__None_2_Callback";
+  String ___getter___2(index_OR_name) native "Storage____getter___2_Callback";
 
   @DomName('Storage.clear')
   @DocsEditable
@@ -24436,8 +24473,10 @@
   @DocsEditable
   WindowBase get window native "DOMWindow_window_Getter";
 
-  @DomName('Window')
-  WindowBase anonymousIndexedGetter(int index) native "DOMWindow_None_Callback";
+  @DomName('Window.__getter__')
+  @DocsEditable
+  @Experimental // untriaged
+  WindowBase __getter__(int index) native "DOMWindow___getter___Callback";
 
   @DomName('Window.addEventListener')
   @DocsEditable
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index 0a16be9..15d7ee8 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -1485,6 +1485,7 @@
   Future<HttpClientRequest> _openUrlFromRequest(String method,
                                                 Uri uri,
                                                 _HttpClientRequest previous) {
+    var u = uri;
     // If the new URI is relative (to either '/' or some sub-path),
     // construct a full URI from the previous one.
     // See http://tools.ietf.org/html/rfc3986#section-4.2
@@ -1497,17 +1498,24 @@
           query: uri.query,
           fragment: uri.fragment);
     }
+
+    var scheme;
+    var host;
+    var port;
+    var path;
     if (uri.host.isEmpty) {
-      replaceComponents(host: previous.uri.host, port: previous.uri.port);
+      host = previous.uri.host;
+      port = previous.uri.port;
     }
     if (uri.scheme.isEmpty) {
-      replaceComponents(scheme: previous.uri.scheme);
+      scheme = previous.uri.scheme;
     }
-    if (!uri.path.startsWith('/') && previous.uri.path.startsWith('/')) {
+    if (!uri.path.startsWith('/')) {
       var absolute = new Path.raw(previous.uri.path).directoryPath;
-      absolute = absolute.join(new Path.raw(uri.path));
-      replaceComponents(path: absolute.canonicalize().toString());
+      absolute = absolute.join(new Path.raw(u.path));
+      path = absolute.canonicalize().toString();
     }
+    replaceComponents(scheme: scheme, host: host, port: port, path: path);
     return openUrl(method, uri).then((_HttpClientRequest request) {
           // Only follow redirects if initial request did.
           request.followRedirects = previous.followRedirects;
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index 62fb74b..8a8ad6c 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -1243,23 +1243,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
-@DomName('ElementTimeControl')
-@Unstable
-abstract class ElementTimeControl {
-
-  void beginElement();
-
-  void beginElementAt(num offset);
-
-  void endElement();
-
-  void endElementAt(num offset);
-}
-// 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('SVGEllipseElement')
 @Unstable
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index 713e9ab..ee6484f 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -1357,36 +1357,6 @@
 
 
 @DocsEditable
-@DomName('ElementTimeControl')
-@Unstable
-class ElementTimeControl extends NativeFieldWrapperClass1 {
-  ElementTimeControl.internal();
-
-  @DomName('ElementTimeControl.beginElement')
-  @DocsEditable
-  void beginElement() native "ElementTimeControl_beginElement_Callback";
-
-  @DomName('ElementTimeControl.beginElementAt')
-  @DocsEditable
-  void beginElementAt(num offset) native "ElementTimeControl_beginElementAt_Callback";
-
-  @DomName('ElementTimeControl.endElement')
-  @DocsEditable
-  void endElement() native "ElementTimeControl_endElement_Callback";
-
-  @DomName('ElementTimeControl.endElementAt')
-  @DocsEditable
-  void endElementAt(num offset) native "ElementTimeControl_endElementAt_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('SVGEllipseElement')
 @Unstable
 class EllipseElement extends StyledElement implements Transformable, Tests, ExternalResourcesRequired, LangSpace {
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index c24c867..c3a7852 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -190,3 +190,23 @@
 # infinite loop
 Language/14_Types/4_Interface_Types_A11_t01: skip
 Language/14_Types/4_Interface_Types_A11_t02: skip
+
+# co19 issue #424, Uninitialized finals are warnings not errors
+Language/05_Variables/05_Variables_A05_t05: fail, OK
+Language/05_Variables/05_Variables_A05_t06: fail, OK
+Language/05_Variables/05_Variables_A05_t07: fail, OK
+Language/05_Variables/05_Variables_A05_t08: fail, OK
+Language/05_Variables/05_Variables_A05_t09: fail, OK
+Language/05_Variables/05_Variables_A05_t10: fail, OK
+Language/05_Variables/05_Variables_A07_t05: fail, OK
+Language/05_Variables/05_Variables_A07_t06: fail, OK
+Language/05_Variables/05_Variables_A07_t07: fail, OK
+Language/05_Variables/05_Variables_A07_t08: fail, OK
+Language/05_Variables/05_Variables_A08_t01: fail, OK
+Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: fail, OK
+
+# co19 issue #425, Only static fields can be declared as 'const'
+Language/05_Variables/05_Variables_A12_t01: fail, OK
+Language/05_Variables/05_Variables_A12_t06: fail, OK
+Language/05_Variables/05_Variables_A13_t01: fail, OK
+Language/07_Classes/07_Classes_A02_t11: fail, OK
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index ccd5242..7332f17 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -186,3 +186,23 @@
 # infinite loop
 Language/14_Types/4_Interface_Types_A11_t01: skip
 Language/14_Types/4_Interface_Types_A11_t02: skip
+
+# co19 issue #424, Uninitialized finals are warnings not errors
+Language/05_Variables/05_Variables_A05_t05: fail, OK
+Language/05_Variables/05_Variables_A05_t06: fail, OK
+Language/05_Variables/05_Variables_A05_t07: fail, OK
+Language/05_Variables/05_Variables_A05_t08: fail, OK
+Language/05_Variables/05_Variables_A05_t09: fail, OK
+Language/05_Variables/05_Variables_A05_t10: fail, OK
+Language/05_Variables/05_Variables_A07_t05: fail, OK
+Language/05_Variables/05_Variables_A07_t06: fail, OK
+Language/05_Variables/05_Variables_A07_t07: fail, OK
+Language/05_Variables/05_Variables_A07_t08: fail, OK
+Language/05_Variables/05_Variables_A08_t01: fail, OK
+Language/11_Expressions/11_Instance_Creation/2_Const_A01_t02: fail, OK
+
+# co19 issue #425, Only static fields can be declared as 'const'
+Language/05_Variables/05_Variables_A12_t01: fail, OK
+Language/05_Variables/05_Variables_A12_t06: fail, OK
+Language/05_Variables/05_Variables_A13_t01: fail, OK
+Language/07_Classes/07_Classes_A02_t11: fail, OK
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index b7f598d..7a856a4 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -360,6 +360,7 @@
 LibTest/core/Date/year_A01_t01: Fail, OK # inherited from VM
 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
@@ -371,6 +372,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.
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 51a0e35..960a6cb 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -67,6 +67,8 @@
 LibTest/core/double/toStringAsExponential_A02_t01: Fail # TODO(vm-team): Please triage this failure.
 LibTest/core/int/toStringAsExponential_A02_t01: Fail # TODO(vm-team): Please triage this failure.
 
+LibTest/core/Match/pattern_A01_t01: Fail # Issue 422
+LibTest/core/RegExp/allMatches_A01_t01: Fail # Issue 422
 
 [ $compiler == none && $runtime == vm && $checked ]
 LibTest/core/Strings/concatAll_A04_t01: Fail, OK # checks for ArgumentError. TypeError is ok too. co19 issue 366
@@ -90,7 +92,6 @@
 Language/11_Expressions/18_Assignment_A08_t04: Fail, OK # co19 issue 405
 
 
-
 [ $compiler == none && $runtime == vm ]
 Language/13_Libraries_and_Scripts/1_Imports_A02_t21: Crash # Dart issue 6060
 Language/13_Libraries_and_Scripts/1_Imports_A02_t22: Crash # Dart issue 6060
@@ -494,13 +495,11 @@
 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
-LibTest/collection/Queue/Queue.from_A01_t01: fail # Issue 400
-LibTest/collection/Queue/Queue.from_A01_t02: fail # Issue 400
-LibTest/core/List/List.from_A01_t01: fail # Issue 400
-LibTest/core/List/every_A01_t01: fail # Issue 400
-LibTest/core/Match/pattern_A01_t01: fail # Issue 400
-LibTest/core/Match/str_A01_t01: fail # Issue 400
-LibTest/core/RegExp/allMatches_A01_t01: fail # Issue 400
+LibTest/collection/Queue/Queue.from_A01_t01: Fail # Issue 400
+LibTest/collection/Queue/Queue.from_A01_t02: Fail # Issue 400
+LibTest/core/List/List.from_A01_t01: Fail # Issue 400
+LibTest/core/List/every_A01_t01: Fail # Issue 400
+LibTest/core/Match/str_A01_t01: Fail # Issue 400
 
 LibTest/async/Completer/completeError_A03_t02: Fail # No AsyncError anymore. Issue 407
 LibTest/async/Completer/complete_A02_t02: Fail # No AsyncError anymore. Issue 407
@@ -511,11 +510,12 @@
 LibTest/core/List/setRange_A05_t01: Fail # setRange now takes end-argument. Issue 402
 
 [ $compiler == none && $runtime == vm && $arch == arm ]
-LibTest/math/tan_A01_t01: Fail
-LibTest/math/Random/nextDouble_A01_t01: Pass, Crash
+LibTest/math/tan_A01_t01: Pass, Fail
+LibTest/math/cos_A01_t01: Pass, Fail
+LibTest/math/sin_A01_t01: Pass, Fail
+LibTest/math/Random/nextDouble_A01_t01: Pass, Crash, Fail
 LibTest/core/int/operator_left_shift_A01_t02: Fail
 LibTest/core/int/operator_unary_minus_A01_t01: Fail, Pass
-LibTest/math/cos_A01_t01: Pass, Fail
 
 [ $compiler == none && $runtime == vm && $arch == arm && $mode == debug ]
 LibTest/core/Expect/throws_A01_t04: Crash
@@ -529,11 +529,12 @@
 LibTest/core/int/operator_unary_minus_A01_t01: Fail, Pass
 
 [ $compiler == none && $runtime == vm && $arch == simarm ]
-LibTest/math/tan_A01_t01: Fail
-LibTest/math/Random/nextDouble_A01_t01: Pass, Crash
+LibTest/math/tan_A01_t01: Pass, Fail
+LibTest/math/cos_A01_t01: Pass, Fail
+LibTest/math/sin_A01_t01: Pass, Fail
+LibTest/math/Random/nextDouble_A01_t01: Pass, Crash, Fail
 LibTest/core/int/operator_left_shift_A01_t02: Fail
 LibTest/core/int/operator_unary_minus_A01_t01: Fail, Pass
-LibTest/math/cos_A01_t01: Pass, Fail
 
 [ $compiler == none && $runtime == vm && $arch == simarm && $mode == debug ]
 LibTest/core/Expect/throws_A01_t04: Crash
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart
index 2e69408..493a8b7 100644
--- a/tests/compiler/dart2js/cpa_inference_test.dart
+++ b/tests/compiler/dart2js/cpa_inference_test.dart
@@ -159,9 +159,7 @@
   class Object {}
   class Function {}
   abstract class List<E> {
-    factory List([int length]) {}
-    E operator [](int index);
-    void operator []=(int index, E value);
+    factory List([int length]) => JS('=List', r'new Array(#)', length);
   }
   abstract class Map<K, V> {}
   class Closure {}
@@ -1203,23 +1201,6 @@
   result.checkNodeHasType('foo', [result.int]);
 }
 
-testGoodGuys() {
-  final String source = r"""
-      main() {
-        var a = 1.isEven;
-        var b = 3.14.isNaN;
-        var c = 1.floor();
-        var d = 3.14.floor();
-        a; b; c; d;
-      }
-      """;
-  AnalysisResult result = analyze(source);
-  result.checkNodeHasType('a', [result.bool]);
-  result.checkNodeHasType('b', [result.bool]);
-  result.checkNodeHasType('c', [result.num]);
-  result.checkNodeHasType('d', [result.num]);
-}
-
 testIntDoubleNum() {
   final String source = r"""
       main() {
@@ -1354,6 +1335,32 @@
   Expect.isNull(inferredType(bar));
 }
 
+testMixins() {
+  final String source = r"""
+      class A {
+        foo() => "abc";
+        get x => 42;
+      }
+      class B extends Object with A {
+        bar() => foo();
+        baz() => x;
+      }
+      main() {
+        var b = new B();
+        var x = b.foo();
+        var y = b.bar();
+        var z = b.x;
+        var w = b.baz();
+        x; y; z; w;
+      }
+      """;
+  AnalysisResult result = analyze(source);
+  result.checkNodeHasType('x', [result.string]);
+  result.checkNodeHasType('y', [result.string]);
+  result.checkNodeHasType('z', [result.int]);
+  result.checkNodeHasType('w', [result.int]);
+}
+
 void main() {
   testDynamicBackDoor();
   testVariableDeclaration();
@@ -1402,8 +1409,8 @@
   testJsCall();
   testIsCheck();
   testSeenClasses();
-  testGoodGuys();
   testIntDoubleNum();
   testConcreteTypeToTypeMask();
   testSelectors();
+  testMixins();
 }
diff --git a/tests/compiler/dart2js/diagnose_ambiguous_test.dart b/tests/compiler/dart2js/diagnose_ambiguous_test.dart
new file mode 100644
index 0000000..cd10b1b
--- /dev/null
+++ b/tests/compiler/dart2js/diagnose_ambiguous_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.
+
+import 'package:expect/expect.dart';
+import 'memory_source_file_helper.dart';
+
+import '../../../sdk/lib/_internal/compiler/compiler.dart'
+       show Diagnostic;
+
+import 'dart:json';
+
+main() {
+  Uri script = currentDirectory.resolve(nativeToUriPath(new Options().script));
+  Uri libraryRoot = script.resolve('../../../sdk/');
+  Uri packageRoot = script.resolve('./packages/');
+
+  MemorySourceFileProvider.MEMORY_SOURCE_FILES = MEMORY_SOURCE_FILES;
+  var provider = new MemorySourceFileProvider();
+  var diagnostics = [];
+  void diagnosticHandler(Uri uri, int begin, int end,
+                         String message, Diagnostic kind) {
+    if (kind == Diagnostic.VERBOSE_INFO) {
+      return;
+    }
+    diagnostics.add('$uri:$begin:$end:$message:$kind');
+  }
+
+  Compiler compiler = new Compiler(provider.readStringFromUri,
+                                   (name, extension) => null,
+                                   diagnosticHandler,
+                                   libraryRoot,
+                                   packageRoot,
+                                   ['--analyze-only']);
+  compiler.run(Uri.parse('memory:main.dart'));
+  diagnostics.sort();
+  var expected = [
+      'memory:exporter.dart:43:47:Info: "function(hest)" is defined here.:info',
+      'memory:library.dart:14:19:Info: "class(Fisk)" is (re)exported by '
+      'multiple libraries.:info',
+      'memory:library.dart:30:34:Info: "function(fisk)" is (re)exported by '
+      'multiple libraries.:info',
+      'memory:library.dart:41:45:Info: "function(hest)" is defined here.'
+      ':info',
+      'memory:main.dart:0:22:Info: "class(Fisk)" is imported here.:info',
+      'memory:main.dart:0:22:Info: "function(fisk)" is imported here.:info',
+      'memory:main.dart:0:22:Info: "function(hest)" is imported here.:info',
+      'memory:main.dart:23:46:Info: "class(Fisk)" is imported here.:info',
+      'memory:main.dart:23:46:Info: "function(fisk)" is imported here.:info',
+      'memory:main.dart:23:46:Info: "function(hest)" is imported here.:info',
+      'memory:main.dart:59:63:Warning: duplicate import of Fisk:warning',
+      'memory:main.dart:76:80:duplicate import of fisk:error',
+      'memory:main.dart:86:90:duplicate import of hest:error'
+  ];
+  Expect.listEquals(expected, diagnostics);
+  Expect.isTrue(compiler.compilationFailed);
+}
+
+const Map MEMORY_SOURCE_FILES = const {
+  'main.dart': """
+import 'library.dart';
+import 'exporter.dart';
+
+main() {
+  Fisk x = null;
+  fisk();
+  hest();
+}
+""",
+  'library.dart': """
+library lib;
+
+class Fisk {
+}
+
+fisk() {}
+
+hest() {}
+""",
+  'exporter.dart': """
+library exporter;
+
+export 'library.dart';
+
+hest() {}
+""",
+};
diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/patch_test.dart
index b0cec7d..f476e1e 100644
--- a/tests/compiler/dart2js/patch_test.dart
+++ b/tests/compiler/dart2js/patch_test.dart
@@ -719,16 +719,33 @@
 }
 
 void testAnalyzeAllInjectedMembers() {
-  String patchText = """
-                     void method() {
-                       String s = 0;
-                     }
-                     """;
-  var compiler = applyPatch('', patchText, analyzeAll: true, analyzeOnly: true);
-  compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')];
-  compiler.runCompiler(null);
-  compareWarningKinds(patchText,
-      [MessageKind.NOT_ASSIGNABLE], compiler.warnings);
+  void expect(String patchText, [expectedWarnings]) {
+    if (expectedWarnings == null) expectedWarnings = [];
+    if (expectedWarnings is! List) expectedWarnings = [expectedWarnings];
+
+    var compiler = applyPatch('', patchText,
+                              analyzeAll: true, analyzeOnly: true);
+    compiler.librariesToAnalyzeWhenRun = [Uri.parse('dart:core')];
+    compiler.runCompiler(null);
+    compareWarningKinds(patchText, expectedWarnings, compiler.warnings);
+  }
+
+  expect('String s = 0;', MessageKind.NOT_ASSIGNABLE);
+  expect('void method() { String s = 0; }', MessageKind.NOT_ASSIGNABLE);
+  expect('''
+         class Class {
+           String s = 0;
+         }
+         ''',
+         MessageKind.NOT_ASSIGNABLE);
+  expect('''
+         class Class {
+           void method() {
+             String s = 0;
+           }
+         }
+         ''',
+         MessageKind.NOT_ASSIGNABLE);
 }
 
 void testTypecheckPatchedMembers() {
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index c9c0221..7102f8b 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -38,13 +38,15 @@
                 testConstructorInvocationArgumentTypes,
                 testMethodInvocationArgumentCount,
                 testMethodInvocations,
+                testMethodInvocationsInClass,
                 testControlFlow,
                 // testNewExpression,
                 testConditionalExpression,
                 testIfStatement,
                 testThis,
                 testSuper,
-                testOperatorsAssignability];
+                testOperatorsAssignability,
+                testFieldInitializers];
   for (Function test in tests) {
     setup();
     test();
@@ -433,8 +435,166 @@
   check("foo('string');");
   check("foo(a: 'string');");
   check("foo(a: localMethod(1));", MessageKind.NOT_ASSIGNABLE);
+}
 
-  // TODO(johnniwinther): Add tests of invocations using implicit this.
+testMethodInvocationsInClass() {
+  LibraryElement library = mockLibrary(compiler, CLASS_WITH_METHODS);
+  compiler.parseScript(CLASS_WITH_METHODS, library);
+  ClassElement ClassWithMethods =
+      library.find(const SourceString("ClassWithMethods"));
+  ClassWithMethods.ensureResolved(compiler);
+  Element c = ClassWithMethods.lookupLocalMember(const SourceString('method'));
+  assert(c != null);
+  ClassElement SubClass = library.find(const SourceString("SubClass"));
+  SubClass.ensureResolved(compiler);
+  Element d = SubClass.lookupLocalMember(const SourceString('method'));
+  assert(d != null);
+
+  check(Element element, String text, [expectedWarnings]){
+    analyzeIn(element,
+              """{
+                   var e;
+                   int i;
+                   int j;
+                   int localMethod(String str) { return 0; }
+                   $text
+                 }""",
+              expectedWarnings);
+  }
+
+
+  check(c, "int k = untypedNoArgumentMethod();");
+  check(c, "ClassWithMethods x = untypedNoArgumentMethod();");
+  check(d, "ClassWithMethods x = untypedNoArgumentMethod();");
+  check(d, "int k = intMethod();");
+  check(c, "int k = untypedOneArgumentMethod(this);");
+  check(c, "ClassWithMethods x = untypedOneArgumentMethod(1);");
+  check(c, "int k = untypedOneArgumentMethod('string');");
+  check(c, "int k = untypedOneArgumentMethod(i);");
+  check(d, "int k = untypedOneArgumentMethod(this);");
+  check(d, "ClassWithMethods x = untypedOneArgumentMethod(1);");
+  check(d, "int k = untypedOneArgumentMethod('string');");
+  check(d, "int k = untypedOneArgumentMethod(i);");
+
+  check(c, "int k = untypedTwoArgumentMethod(1, 'string');");
+  check(c, "int k = untypedTwoArgumentMethod(i, j);");
+  check(c, "ClassWithMethods x = untypedTwoArgumentMethod(i, this);");
+  check(d, "int k = untypedTwoArgumentMethod(1, 'string');");
+  check(d, "int k = untypedTwoArgumentMethod(i, j);");
+  check(d, "ClassWithMethods x = untypedTwoArgumentMethod(i, this);");
+
+  check(c, "int k = intNoArgumentMethod();");
+  check(c, "ClassWithMethods x = intNoArgumentMethod();",
+        MessageKind.NOT_ASSIGNABLE);
+
+  check(c, "int k = intOneArgumentMethod('');", MessageKind.NOT_ASSIGNABLE);
+  check(c, "ClassWithMethods x = intOneArgumentMethod(1);",
+        MessageKind.NOT_ASSIGNABLE);
+  check(c, "int k = intOneArgumentMethod('string');",
+        MessageKind.NOT_ASSIGNABLE);
+  check(c, "int k = intOneArgumentMethod(i);");
+
+  check(c, "int k = intTwoArgumentMethod(1, 'string');",
+        MessageKind.NOT_ASSIGNABLE);
+  check(c, "int k = intTwoArgumentMethod(i, j);");
+  check(c, "ClassWithMethods x = intTwoArgumentMethod(i, j);",
+        MessageKind.NOT_ASSIGNABLE);
+
+  check(c, "functionField();");
+  check(d, "functionField();");
+  check(c, "functionField(1);");
+  check(d, "functionField('string');");
+
+  check(c, "intField();", MessageKind.NOT_CALLABLE);
+  check(d, "intField();", MessageKind.NOT_CALLABLE);
+
+  check(c, "untypedField();");
+  check(d, "untypedField();");
+  check(c, "untypedField(1);");
+  check(d, "untypedField('string');");
+
+
+  check(c, "intOneArgumentOneOptionalMethod('');",
+        MessageKind.NOT_ASSIGNABLE);
+  check(c, "intOneArgumentOneOptionalMethod('', '');",
+        [MessageKind.NOT_ASSIGNABLE, MessageKind.NOT_ASSIGNABLE]);
+
+  check(c, "intTwoOptionalMethod('');", MessageKind.NOT_ASSIGNABLE);
+  check(c, "intTwoOptionalMethod('', '');",
+        [MessageKind.NOT_ASSIGNABLE, MessageKind.NOT_ASSIGNABLE]);
+
+  check(c, "intOneArgumentOneNamedMethod('');",
+        MessageKind.NOT_ASSIGNABLE);
+  check(c, "intOneArgumentOneNamedMethod('', b: '');",
+        [MessageKind.NOT_ASSIGNABLE, MessageKind.NOT_ASSIGNABLE]);
+
+  check(c, "intTwoNamedMethod(a: '');", MessageKind.NOT_ASSIGNABLE);
+  check(c, "intTwoNamedMethod(b: '');", MessageKind.NOT_ASSIGNABLE);
+  check(c, "intTwoNamedMethod(a: '', b: '');",
+        [MessageKind.NOT_ASSIGNABLE, MessageKind.NOT_ASSIGNABLE]);
+  check(c, "intTwoNamedMethod(b: '', a: '');",
+        [MessageKind.NOT_ASSIGNABLE, MessageKind.NOT_ASSIGNABLE]);
+
+  // Invocation of dynamic variable.
+  check(c, "e();");
+  check(c, "e(1);");
+  check(c, "e('string');");
+
+  // Invocation on local method.
+  check(c, "localMethod();", MessageKind.MISSING_ARGUMENT);
+  check(c, "localMethod(1);", MessageKind.NOT_ASSIGNABLE);
+  check(c, "localMethod('string');");
+  check(c, "int k = localMethod('string');");
+  check(c, "String k = localMethod('string');", MessageKind.NOT_ASSIGNABLE);
+
+  // Invocation on parenthesized expressions.
+  check(c, "(e)();");
+  check(c, "(e)(1);");
+  check(c, "(e)('string');");
+  check(c, "(foo)();", MessageKind.PROPERTY_NOT_FOUND);
+  check(c, "(foo)(1);", MessageKind.PROPERTY_NOT_FOUND);
+  check(c, "(foo)('string');", MessageKind.PROPERTY_NOT_FOUND);
+
+  // Invocations on function expressions.
+  check(c, "(foo){}();", MessageKind.MISSING_ARGUMENT);
+  check(c, "(foo){}(1);");
+  check(c, "(foo){}('string');");
+  check(c, "(int foo){}('string');", MessageKind.NOT_ASSIGNABLE);
+  check(c, "(String foo){}('string');");
+  check(c, "int k = int bar(String foo){ return 0; }('string');");
+  check(c, "int k = String bar(String foo){ return foo; }('string');",
+        MessageKind.NOT_ASSIGNABLE);
+
+  // Static invocations.
+  check(c, "staticMethod();",
+        MessageKind.MISSING_ARGUMENT);
+  check(c, "staticMethod(1);",
+        MessageKind.NOT_ASSIGNABLE);
+  check(c, "staticMethod('string');");
+  check(c, "int k = staticMethod('string');");
+  check(c, "String k = staticMethod('string');",
+        MessageKind.NOT_ASSIGNABLE);
+  check(d, "staticMethod();",
+        MessageKind.MISSING_ARGUMENT);
+  check(d, "staticMethod(1);",
+        MessageKind.NOT_ASSIGNABLE);
+  check(d, "staticMethod('string');");
+  check(d, "int k = staticMethod('string');");
+  check(d, "String k = staticMethod('string');",
+        MessageKind.NOT_ASSIGNABLE);
+
+  // Invocation on dynamic variable.
+  check(c, "e.foo();");
+  check(c, "e.foo(1);");
+  check(c, "e.foo('string');");
+
+  // Invocation on unresolved variable.
+  check(c, "foo();", MessageKind.METHOD_NOT_FOUND);
+  check(c, "foo(1);", MessageKind.METHOD_NOT_FOUND);
+  check(c, "foo('string');", MessageKind.METHOD_NOT_FOUND);
+  check(c, "foo(a: 'string');", MessageKind.METHOD_NOT_FOUND);
+  check(c, "foo(a: localMethod(1));",
+      [MessageKind.METHOD_NOT_FOUND, MessageKind.NOT_ASSIGNABLE]);
 }
 
 /** Tests analysis of returns (not required by the specification). */
@@ -544,13 +704,17 @@
 }
 
 testThis() {
-  String script = "class Foo {}";
+  String script = """class Foo {
+                       void method() {}
+                     }""";
   LibraryElement library = mockLibrary(compiler, script);
   compiler.parseScript(script, library);
   ClassElement foo = library.find(const SourceString("Foo"));
-  analyzeIn(foo, "{ int i = this; }", MessageKind.NOT_ASSIGNABLE);
-  analyzeIn(foo, "{ Object o = this; }");
-  analyzeIn(foo, "{ Foo f = this; }");
+  foo.ensureResolved(compiler);
+  Element method = foo.lookupLocalMember(const SourceString('method'));
+  analyzeIn(method, "{ int i = this; }", MessageKind.NOT_ASSIGNABLE);
+  analyzeIn(method, "{ Object o = this; }");
+  analyzeIn(method, "{ Foo f = this; }");
 }
 
 testSuper() {
@@ -561,14 +725,17 @@
     
     class B extends A {
       Object field = 42;
+      void method() {}
     }
     ''';
   LibraryElement library = mockLibrary(compiler, script);
   compiler.parseScript(script, library);
   ClassElement B = library.find(const SourceString("B"));
-  analyzeIn(B, "{ int i = super.field; }", MessageKind.NOT_ASSIGNABLE);
-  analyzeIn(B, "{ Object o = super.field; }");
-  analyzeIn(B, "{ String s = super.field; }");
+  B.ensureResolved(compiler);
+  Element method = B.lookupLocalMember(const SourceString('method'));
+  analyzeIn(method, "{ int i = super.field; }", MessageKind.NOT_ASSIGNABLE);
+  analyzeIn(method, "{ Object o = super.field; }");
+  analyzeIn(method, "{ String s = super.field; }");
 }
 
 const String CLASSES_WITH_OPERATORS = '''
@@ -846,6 +1013,19 @@
       [MessageKind.NOT_ASSIGNABLE, MessageKind.NOT_ASSIGNABLE]);
 }
 
+void testFieldInitializers() {
+  analyzeTopLevel("""int i = 0;""");
+  analyzeTopLevel("""int i = '';""", MessageKind.NOT_ASSIGNABLE);
+
+  analyzeTopLevel("""class Class {
+                       int i = 0;
+                     }""");
+  analyzeTopLevel("""class Class {
+                       int i = '';
+                     }""", MessageKind.NOT_ASSIGNABLE);
+}
+
+
 const CLASS_WITH_METHODS = '''
 class ClassWithMethods {
   untypedNoArgumentMethod() {}
@@ -866,11 +1046,15 @@
   int intField;
 
   static int staticMethod(String str) {}
+
+  void method() {}
 }
 class I {
   int intMethod();
 }
-class SubClass extends ClassWithMethods implements I {}''';
+class SubClass extends ClassWithMethods implements I {
+  void method() {}
+}''';
 
 Types types;
 MockCompiler compiler;
@@ -941,6 +1125,8 @@
   if (expectedWarnings == null) expectedWarnings = [];
   if (expectedWarnings is !List) expectedWarnings = [expectedWarnings];
 
+  compiler.diagnosticHandler = createHandler(text);
+
   LibraryElement library = mockLibrary(compiler, text);
 
   Link<Element> topLevelElements = parseUnit(text, compiler, library);
@@ -948,14 +1134,22 @@
   for (Link<Element> elements = topLevelElements;
        !elements.isEmpty;
        elements = elements.tail) {
-    Node node = elements.head.parseNode(compiler);
-    TreeElements mapping = compiler.resolver.resolve(elements.head);
+    Element element = elements.head;
+    if (element.isClass()) {
+      ClassElement classElement = element;
+      classElement.ensureResolved(compiler);
+      // Analyze last class member.
+      classElement.forEachLocalMember((Element e) => element = e);
+    }
+    Node node = element.parseNode(compiler);
+    TreeElements mapping = compiler.resolver.resolve(element);
     TypeCheckerVisitor checker =
         new TypeCheckerVisitor(compiler, mapping, types);
     compiler.clearWarnings();
     checker.analyze(node);
     compareWarningKinds(text, expectedWarnings, compiler.warnings);
   }
+  compiler.diagnosticHandler = null;
 }
 
 api.DiagnosticHandler createHandler(String text) {
@@ -1010,7 +1204,7 @@
   }
 }
 
-analyzeIn(ClassElement classElement, String text, [expectedWarnings]) {
+analyzeIn(Element element, String text, [expectedWarnings]) {
   if (expectedWarnings == null) expectedWarnings = [];
   if (expectedWarnings is !List) expectedWarnings = [expectedWarnings];
 
@@ -1019,8 +1213,7 @@
   Parser parser = new Parser(listener);
   parser.parseStatement(tokens);
   Node node = listener.popNode();
-  classElement.ensureResolved(compiler);
-  TreeElements elements = compiler.resolveNodeStatement(node, classElement);
+  TreeElements elements = compiler.resolveNodeStatement(node, element);
   TypeCheckerVisitor checker = new TypeCheckerVisitor(compiler, elements,
                                                                 types);
   compiler.clearWarnings();
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 037000c..44252e2 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -44,3 +44,4 @@
 
 [ $csp ]
 mirrors_test: Fail # http://dartbug.com/6490
+minified_mirrors_test: Fail # http://dartbug.com/6490
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index b728712..55913e5 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -83,12 +83,23 @@
 iterable_to_list_test: Fail
 iterable_to_set_test: Fail
 
-[ $compiler == dartc || $compiler == dartanalyzer ]
+[ $compiler == dartc ]
 symbol_test/01: Fail
 symbol_test/02: Fail
 symbol_test/03: Fail
 
 [ $compiler == dartanalyzer ]
+symbol_test/01: Fail
+symbol_test/02: Fail
+symbol_test/03: Fail
+int_parse_radix_test: fail
+list_insert_test: fail
+list_removeat_test: fail
+
+[ $compiler == dart2analyzer ]
+symbol_test/01: Fail
+symbol_test/02: Fail
+symbol_test/03: Fail
 int_parse_radix_test: fail
 list_insert_test: fail
 list_removeat_test: fail
diff --git a/tests/corelib/uri_path_test.dart b/tests/corelib/uri_path_test.dart
index e997ce3..058d912 100644
--- a/tests/corelib/uri_path_test.dart
+++ b/tests/corelib/uri_path_test.dart
@@ -8,18 +8,35 @@
 }
 
 void testPath() {
-  test(s, uri) {
+  void test(s, uri) {
     Expect.equals(s, uri.toString());
     Expect.equals(uri, Uri.parse(s));
   }
 
+  test("http:", new Uri(scheme: "http"));
+  test("http://host/xxx", new Uri(scheme: "http", host: "host", path: "xxx"));
+  test("http://host/xxx", new Uri(scheme: "http", host: "host", path: "/xxx"));
+  test("http://host/xxx",
+       new Uri(scheme: "http", host: "host", pathSegments: ["xxx"]));
+  test("http://host/xxx/yyy",
+       new Uri(scheme: "http", host: "host", path: "xxx/yyy"));
+  test("http://host/xxx/yyy",
+       new Uri(scheme: "http", host: "host", path: "/xxx/yyy"));
+  test("http://host/xxx/yyy",
+       new Uri(scheme: "http", host: "host", pathSegments: ["xxx", "yyy"]));
+
   test("urn:", new Uri(scheme: "urn"));
   test("urn:xxx", new Uri(scheme: "urn", path: "xxx"));
   test("urn:xxx:yyy", new Uri(scheme: "urn", path: "xxx:yyy"));
+
+  Expect.equals(3, new Uri(path: "xxx/yyy/zzz").pathSegments.length);
+  Expect.equals(3, new Uri(path: "/xxx/yyy/zzz").pathSegments.length);
+  Expect.equals(3, Uri.parse("http://host/xxx/yyy/zzz").pathSegments.length);
+  Expect.equals(3, Uri.parse("file:///xxx/yyy/zzz").pathSegments.length);
 }
 
 void testPathSegments() {
-  test(String path, List<String> segments) {
+  void test(String path, List<String> segments) {
     void check(uri) {
       Expect.equals(path, uri.path);
       Expect.equals(path, uri.toString());
@@ -72,11 +89,41 @@
   unencoded = unencoded.toString();
   test(encoded, [unencoded]);
   test(encoded + "/" + encoded, [unencoded, unencoded]);
+
+  Uri uri;
+  uri = new Uri(pathSegments: ["xxx", "yyy", "zzz"]);
+  Expect.equals(3, uri.pathSegments.length);
+  uri = new Uri(scheme: "http",
+                host: "host",
+                pathSegments: ["xxx", "yyy", "zzz"]);
+  Expect.equals(3, uri.pathSegments.length);
+  uri = new Uri(scheme: "file",
+                pathSegments: ["xxx", "yyy", "zzz"]);
+  Expect.equals(3, uri.pathSegments.length);
+}
+
+void testPathCompare() {
+  void test(Uri uri1, Uri uri2) {
+    Expect.equals(uri1, uri2);
+    Expect.equals(uri2, uri1);
+  }
+
+  test(new Uri(scheme: "http", host: "host", path: "xxx"),
+       new Uri(scheme: "http", host: "host", path: "/xxx"));
+  test(new Uri(scheme: "http", host: "host", pathSegments: ["xxx"]),
+       new Uri(scheme: "http", host: "host", path: "/xxx"));
+  test(new Uri(scheme: "http", host: "host", pathSegments: ["xxx"]),
+       new Uri(scheme: "http", host: "host", path: "xxx"));
+  test(new Uri(scheme: "file", path: "xxx"),
+       new Uri(scheme: "file", path: "/xxx"));
+  test(new Uri(scheme: "file", pathSegments: ["xxx"]),
+       new Uri(scheme: "file", path: "/xxx"));
+  test(new Uri(scheme: "file", pathSegments: ["xxx"]),
+       new Uri(scheme: "file", path: "xxx"));
 }
 
 testPathSegmentsUnmodifiableList() {
-
-  test(list) {
+  void test(list) {
     bool isUnsupported(e) => e is UnsupportedError;
 
     Expect.equals("a", list[0]);
@@ -118,5 +165,6 @@
   testInvalidArguments();
   testPath();
   testPathSegments();
+  testPathCompare();
   testPathSegmentsUnmodifiableList();
 }
diff --git a/tests/html/html.status b/tests/html/html.status
index 581755c..3e1588d 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -375,3 +375,6 @@
 
 [ $compiler == dartanalyzer ]
 path_observer_test: Fail
+
+[ $compiler == dart2analyzer ]
+path_observer_test: Fail
diff --git a/tests/html/selectelement_test.dart b/tests/html/selectelement_test.dart
index 300e29e..717502f 100644
--- a/tests/html/selectelement_test.dart
+++ b/tests/html/selectelement_test.dart
@@ -55,4 +55,22 @@
     // Use last to make sure that the list was correctly wrapped.
     expect(element.options.last, equals(options[3]));
   });
+
+  test('optgroup', () {
+    var element = new Element.html(
+      '<select>'
+        '<option>1</option>'
+        '<optgroup>'
+          '<option>2</option>'
+        '</optgroup>'
+      '</select>');
+
+    expect(element.options.length, 2);
+    element.selectedIndex = 1;
+
+    var optGroup = element.children[1];
+    expect(optGroup is OptGroupElement, isTrue);
+    expect(optGroup.children.single.selected, isTrue);
+    expect(element.selectedOptions, optGroup.children);
+  });
 }
diff --git a/tests/html/xhr_test.dart b/tests/html/xhr_test.dart
index 484b2e7..8ddae00 100644
--- a/tests/html/xhr_test.dart
+++ b/tests/html/xhr_test.dart
@@ -179,6 +179,31 @@
         HttpRequest.request(url, mimeType: 'application/binary');
       }, expectation);
     });
+
+    if (Platform.supportsTypedData) {
+      test('xhr upload', () {
+        var xhr = new HttpRequest();
+        var progressCalled = false;
+        xhr.upload.onProgress.listen((e) {
+          progressCalled = true;
+        });
+
+        xhr.open('POST',
+              '${window.location.protocol}//${window.location.host}/echo');
+
+        // 10MB of payload data w/ a bit of data to make sure it
+        // doesn't get compressed to nil.
+        var data = new Uint8List(1 * 1024 * 1024);
+        for (var i = 0; i < data.length; ++i) {
+          data[i] = i & 0xFF;
+        }
+        xhr.send(data);
+
+        return xhr.onLoad.first.then((_) {
+          expect(progressCalled, isTrue);
+        });
+      });
+    }
   });
 
   group('xhr_requestBlob', () {
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index b5f430c..1600565 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -13,10 +13,6 @@
 unresolved_ports_negative_test: Skip # See Issue 6839
 isolate_stress_test: Fail # TODO(ahe): This should be able to pass when we have wrapper-less tests.
 
-
-[ $runtime == vm && $system == windows ]
-timer_test: Pass, Fail # See Issue 5133
-
 [ $compiler == none && $runtime == drt ]
 isolate2_negative_test: Skip  # Inherited from VM.
 isolate3_negative_test: Skip  # Inherited from VM.
@@ -49,6 +45,19 @@
 global_error_handler_stream_test: fail, OK
 global_error_handler_test: fail, OK
 
+[ $compiler == dart2analyzer ]
+isolate2_negative_test: fail
+isolate_import_negative_test: fail
+isolate_negative_test: fail
+spawn_function_negative_test: fail
+spawn_uri_negative_test: fail
+spawn_uri_vm_negative_test: fail
+unresolved_ports_negative_test: fail
+
+# test issue 10888
+global_error_handler_stream_test: fail, OK
+global_error_handler_test: fail, OK
+
 [ $compiler == dart2js && ($runtime == d8 || $jscl) ]
 illegal_msg_stream_test: Fail # Issue 6750
 typed_data_message_test: Fail, OK # DataView only supported in browsers.
diff --git a/tests/language/compiler_annotations.dart b/tests/language/compiler_annotations.dart
new file mode 100644
index 0000000..c920add
--- /dev/null
+++ b/tests/language/compiler_annotations.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.
+
+library compiler_annotations;
+
+// This library contains annotations useful for testing.
+
+// TODO(ngeoffray): Implement in dart2js.
+class DontInline {
+  const DontInline();
+}
diff --git a/tests/language/extends_test.dart b/tests/language/extends_test.dart
new file mode 100644
index 0000000..35cbb2e6
--- /dev/null
+++ b/tests/language/extends_test.dart
@@ -0,0 +1,22 @@
+// 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 ExtendsTestMain;
+import "extends_test_lib.dart";
+import "package:expect/expect.dart";
+
+// S should extend class A from below, not the one imported
+// from the library.
+class S extends A {
+}
+
+class A {
+  var y = "class A from main script";
+}
+
+main() {
+  var s = new S();
+  Expect.equals("class A from main script", s.y);
+}
+
diff --git a/tests/language/extends_test_lib.dart b/tests/language/extends_test_lib.dart
new file mode 100644
index 0000000..d62ca8f
--- /dev/null
+++ b/tests/language/extends_test_lib.dart
@@ -0,0 +1,9 @@
+// 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 ExtendsTestLib;
+
+class A {
+  var y = "class A from library";
+}
diff --git a/tests/language/inferrer_constructor2_test.dart b/tests/language/inferrer_constructor2_test.dart
new file mode 100644
index 0000000..218723b
--- /dev/null
+++ b/tests/language/inferrer_constructor2_test.dart
@@ -0,0 +1,62 @@
+// 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 that used to optimistically infer the
+// wrong types for fields because of generative constructors being
+// inlined.
+
+import "package:expect/expect.dart";
+import "compiler_annotations.dart";
+
+class A {
+  var foo;
+  var bar;
+
+  @DontInline
+  A() {
+    // Currently defeat inlining by using a closure.
+    bar = () => 42;
+    foo = 54;
+  }
+  A.inline();
+}
+
+main() {
+  // Make sure A's constructor is analyzed first by surrounding the
+  // body by two allocations.
+  new A();
+  bar();
+  new A();
+}
+
+class B {
+  var bar;
+  var closure;
+  @DontInline
+  B() {
+    // Currently defeat inlining by using a closure.
+    closure = () => 42;
+    bar = new A().foo;
+  }
+}
+
+@DontInline
+bar() {
+  // Make sure B's constructor is analyzed first by surrounding the
+  // body by two allocations.
+  new B();
+  // Currently defeat inlining by using a closure.
+  Expect.throws(() => new A.inline().foo + 42, (e) => e is NoSuchMethodError);
+  codegenLast();
+  new B();
+}
+
+@DontInline
+codegenLast() {
+  // This assignment currently defeats simple type inference, but not
+  // the optimistic inferrer.
+  new A().foo = new B().bar;
+  // Currently defeat inlining by using a closure.
+  new B().closure = () => 42;
+}
diff --git a/tests/language/issue11087_vm_test.dart b/tests/language/issue11087_vm_test.dart
new file mode 100644
index 0000000..3dd71e1
--- /dev/null
+++ b/tests/language/issue11087_vm_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.
+
+// Regression test for VM's IfConverted pass not keeping graph structure and
+// use lists in sync.
+
+class A {
+  int x;
+}
+
+f() {
+  var a = new A();
+  a.x = (true ? 2 : 4);
+  return a.x;
+}
+
+main() {
+  for (var i = 0; i < 10000; i++) f();
+}
+
diff --git a/tests/language/language.status b/tests/language/language.status
index 60460aa..f988626 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -25,6 +25,7 @@
 closure_type_variable_test: Fail # Type variable used as expression (dartbug.com/6282)
 
 [ $compiler == none ]
+extends_test: Fail # issue 11023
 mixin_super_constructor_test: Fail
 mixin_super_constructor2_test: Fail
 mixin_super_constructor_default_test: Fail
@@ -305,6 +306,7 @@
 final_variable_assignment_test/02: Fail
 final_variable_assignment_test/03: Fail
 final_variable_assignment_test/04: Fail
+extends_test: Pass, Fail # issue 11023, may pass or fail depending on loading order
 
 
 [ $runtime == dartium ]
@@ -525,296 +527,32 @@
 invocation_mirror_test: Fail, OK # hardcoded names.
 super_call4_test: Fail, OK # hardcoded names.
 
-[ $compiler == dartanalyzer ]
-abstract_factory_constructor_test/00: fail
-assign_instance_method_negative_test: fail
-assign_static_type_test/06: fail
-bad_named_parameters2_test: fail
-bad_named_parameters_test: fail
-bad_override_test/01: fail
-bad_override_test/02: fail
-bad_override_test/03: fail
-bad_override_test/04: fail
-bad_override_test/05: fail
-black_listed_test/11: fail
-body_less_constructor_wrong_arg_negative_test: fail
-built_in_identifier_prefix_test: fail
-call_constructor_on_unresolvable_class_test/01: fail
-call_constructor_on_unresolvable_class_test/02: fail
-call_constructor_on_unresolvable_class_test/03: fail
-call_constructor_on_unresolvable_class_test/07: fail
-call_nonexistent_static_test/04: fail
-call_nonexistent_static_test/06: fail
-call_nonexistent_static_test/07: fail
-call_nonexistent_static_test/09: fail
-call_nonexistent_static_test/10: fail
-call_through_getter_test: fail
-callable_test/none: fail
-cast_test/04: fail
-cast_test/05: fail
-class_cycle_test/03: fail
-closure_call_wrong_argument_count_negative_test: fail
-compile_time_constant10_test/none: fail
-compile_time_constant8_test: fail
-compile_time_constant_b_test: fail
-compile_time_constant_c_test/01: fail
-compile_time_constant_c_test/02: fail
-compile_time_constant_checked2_test/02: fail
-compile_time_constant_checked2_test/03: fail
-compile_time_constant_checked2_test/04: fail
-compile_time_constant_checked2_test/06: fail
-compile_time_constant_checked3_test/02: fail
-compile_time_constant_checked3_test/03: fail
-compile_time_constant_checked3_test/04: fail
-compile_time_constant_checked3_test/06: fail
-compile_time_constant_d_test: fail
-compile_time_constant_e_test: fail
-compile_time_constant_test/02: fail
-const_syntax_test/06: fail
-constructor2_negative_test: fail
-constructor3_negative_test: fail
-constructor_call_wrong_argument_count_negative_test: fail
-constructor_negative_test: fail
-constructor_return_with_arrow_negative_test: fail
-constructor_return_with_init_and_arrow_negative_test: fail
-cyclic_type_variable_test/01: fail
-cyclic_type_variable_test/02: fail
-cyclic_type_variable_test/03: fail
-cyclic_type_variable_test/04: fail
-default_factory2_test/01: fail
-default_implementation2_test: fail
-dynamic2_test/00: fail
-dynamic_field_test: fail
-export_cyclic_test: fail
-f_bounded_quantification_test/01: fail
-f_bounded_quantification_test/02: fail
-factory2_test: fail
-factory5_test/00: fail
-factory_implementation_test/none: fail
-factory_redirection2_test/01: fail
-fauxverride_test/03: fail
-fauxverride_test/05: fail
-field_method4_negative_test: fail
-field_override_test/01: fail
-final_for_in_variable_test/01: fail
-final_param_negative_test: fail
-final_var_negative_test: fail
-final_variable_assignment_test/01: fail
-final_variable_assignment_test/02: fail
-final_variable_assignment_test/03: fail
-final_variable_assignment_test/04: fail
-first_class_types_constants_test: fail
-for_in2_test: fail
-function_type_alias5_test/00: fail
-function_type_alias5_test/01: fail
-function_type_alias5_test/02: fail
-getter_no_setter2_test/00: fail
-getter_no_setter2_test/03: fail
-getter_no_setter_test/00: fail
-getter_no_setter_test/01: fail
-getters_setters2_test/01: fail
-getters_setters_type_test/01: fail
-implicit_this_test/01: fail
-implicit_this_test/04: fail
-implicit_this_test/none: fail
-import_combinators_negative_test: fail
-inst_field_initializer1_negative_test: fail
-instance_call_wrong_argument_count_negative_test: fail
-instance_method2_negative_test: fail
-instance_method_negative_test: fail
-instantiate_type_variable_negative_test: fail
-interface_inherit_field_test: fail
-interface_static_non_final_fields_negative_test: fail
-interface_test/00: fail
-is_not_class2_negative_test: fail
-library_juxtaposition_test: fail
-licm_test: fail
-list_literal1_negative_test: fail
-list_literal_syntax_test/01: fail
-list_literal_syntax_test/02: fail
-list_literal_syntax_test/03: fail
-map_literal1_negative_test: fail
-map_literal3_test: fail
-method_override2_test/03: fail
-mixin_illegal_constructor_test/13: fail
-mixin_illegal_constructor_test/14: fail
-mixin_illegal_constructor_test/15: fail
-mixin_illegal_constructor_test/16: fail
-mixin_illegal_cycles_test/02: fail
-mixin_illegal_cycles_test/03: fail
-mixin_illegal_cycles_test/04: fail
-mixin_illegal_cycles_test/06: fail
-mixin_illegal_syntax_test/13: fail
-mixin_type_parameters_errors_test/01: fail
-mixin_type_parameters_errors_test/02: fail
-mixin_type_parameters_errors_test/03: fail
-mixin_type_parameters_errors_test/04: fail
-mixin_type_parameters_errors_test/05: fail
-named_parameters2_test: fail
-named_parameters_aggregated_test/03: fail
-named_parameters_aggregated_test/05: fail
-new_expression_type_args_test/00: fail
-new_expression_type_args_test/01: fail
-new_expression_type_args_test/02: fail
-no_such_method_negative_test: fail
-non_const_super_negative_test: fail
-number_identifier_negative_test: fail
-override_field_method1_negative_test: fail
-override_field_method2_negative_test: fail
-override_field_method4_negative_test: fail
-override_field_method5_negative_test: fail
-override_field_test/01: fail
-override_field_test/02: fail
-override_field_test/03: fail
-override_method_with_field_test/01: fail
-override_method_with_field_test/02: fail
-prefix10_negative_test: fail
-prefix11_negative_test: fail
-prefix12_negative_test: fail
-prefix1_negative_test: fail
-prefix22_test: fail
-prefix23_test: fail
-prefix2_negative_test: fail
-prefix4_negative_test: fail
-prefix5_negative_test: fail
-prefix6_negative_test: fail
-prefix8_negative_test: fail
-prefix9_negative_test: fail
-private_member1_negative_test: fail
-private_member2_negative_test: fail
-private_member3_negative_test: fail
-pseudo_kw_illegal_test/14: fail
-pseudo_kw_test: fail
-redirecting_factory_infinite_steps_test/01: fail
-redirecting_factory_infinite_steps_test/02: fail
-scope_negative_test: fail
-setter3_test/01: fail
-setter3_test/02: fail
-static_call_wrong_argument_count_negative_test: fail
-static_field3_test/01: fail
-static_field3_test/02: fail
-static_field3_test/04: fail
-static_field_test/01: fail
-static_field_test/02: fail
-static_field_test/03: fail
-static_final_field2_negative_test: fail
-static_final_field_negative_test: fail
-syntax_test/28: fail
-syntax_test/29: fail
-syntax_test/30: fail
-syntax_test/31: fail
-syntax_test/32: fail
-syntax_test/33: fail
-ternary_test: fail
-throw7_negative_test: fail
-type_error_test: fail
-type_parameter_test/01: fail
-type_parameter_test/02: fail
-type_parameter_test/03: fail
-type_parameter_test/04: fail
-type_variable_bounds2_test/00: fail
-type_variable_bounds2_test/01: fail
-type_variable_bounds2_test/02: fail
-type_variable_bounds2_test/03: fail
-type_variable_bounds2_test/04: fail
-type_variable_bounds2_test/06: fail
-type_variable_bounds_test/00: fail
-type_variable_bounds_test/01: fail
-type_variable_bounds_test/02: fail
-type_variable_bounds_test/03: fail
-type_variable_bounds_test/04: fail
-type_variable_bounds_test/06: fail
-type_variable_bounds_test/07: fail
-type_variable_bounds_test/09: fail
-type_variable_identifier_expression_negative_test: fail
-type_variable_static_context_negative_test: fail
-typed_equality_test: fail
-unary2_test: fail
-unary_test: fail
-unresolved_in_factory_negative_test: fail
-unresolved_top_level_method_negative_test: fail
-unresolved_top_level_var_negative_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, OK
-lazy_static3_test: fail, OK
-
-# test issue 10752, there are 'implicit' scopes for 'if', 'while' and 'do-while'
-implicit_scope_test: fail, OK
-
-# test issue 10889, "throw" requires expression, "rethrow" should be used instead
-execute_finally10_test: fail, OK
-execute_finally11_test: fail, OK
-final_used_in_try_test: fail, OK
-full_stacktrace2_test: fail, OK
-stack_trace_test: fail, OK
-throw3_test: fail, OK
-try_catch3_test: fail, OK
-
-# test issue 10890; on-catch UnknownType is a static warning, not error
-try_catch_on_syntax_test/01: fail, OK
-try_catch_on_syntax_test/07: fail, OK
-try_catch_syntax_test/08: fail, OK
-
-# test issue 10899; it is static warning, not error, to call methods of class literal
-class_literal_test/02: fail, OK
-class_literal_test/05: fail, OK
-class_literal_test/07: fail, OK
-class_literal_test/10: fail, OK
-class_literal_test/11: fail, OK
-class_literal_test/12: fail, OK
-class_literal_test/14: fail, OK
-class_literal_test/17: fail, OK
-class_literal_test/18: fail, OK
-class_literal_test/19: fail, OK
-class_literal_test/22: fail, OK
-class_literal_test/23: fail, OK
-class_literal_test/24: fail, OK
-class_literal_test/27: fail, OK
-class_literal_test/28: fail, OK
-class_literal_test/29: fail, OK
-class_literal_test/none: fail, OK
-
-[ $compiler == dartanalyzer && $checked ]
-factory1_test/00: fail
-factory1_test/01: fail
-field_type_check2_test/01: fail
-factory_implementation_test/00: fail
-factory_redirection_test/08: fail
-factory_redirection_test/09: fail
-factory_redirection_test/10: fail
-factory_redirection_test/11: fail
-factory_redirection_test/12: fail
-factory_redirection_test/13: fail
-factory_redirection_test/14: fail
-getters_setters2_test/03: fail
-type_variable_bounds3_test/00: fail
-type_variable_bounds2_test/05: fail
-type_variable_scope_test/00: fail
-type_variable_scope_test/01: fail
-type_variable_scope_test/02: fail
-type_variable_scope_test/03: fail
-type_variable_scope_test/04: fail
-type_variable_scope_test/05: fail
-
 [ $arch == simarm || $arch == arm ]
 arithmetic_test: Fail, Crash
 bit_operations_test: Crash, Fail
 char_escape_test: Pass, Crash
 deopt_smi_op_test: Fail
 div_with_power_of_two_test: Fail
-double_modulo_test: Fail
 gc_test: Crash
 invocation_mirror_test: Fail
-large_implicit_getter_test: Crash
-load_to_load_forwarding_test: Fail
-math_vm_test: Fail
+load_to_load_forwarding_vm_test: Fail
 named_parameters_with_conversions_test: Pass, Crash
-stack_overflow_stacktrace_test: Crash
-stack_overflow_test: Crash
 positive_bit_operations_test: Pass, Fail, Crash
 left_shift_test: Pass, Fail
 
+# large_implicit_getter_test Passes on ReleaseARM, Crashes in SIMARM and
+# DebugARM. Should crash on ReleaseARM, but there is no exception on an
+# unaligned access. stack_overflow_test and  _stacktrace_test have the same
+# problem.
+large_implicit_getter_test: Crash, Pass
+stack_overflow_test: Crash, Pass
+stack_overflow_stacktrace_test: Crash, Pass
+
+# math_vm_test and double_modulo test fail on SIMARM because the simulator
+# isn't implementing the softfp calling convention correctly.
+math_vm_test: Fail, Pass
+double_modulo_test: Fail, Pass
+
 [ $arch == mips ]
 *: Skip
 
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
new file mode 100644
index 0000000..ee8acc1
--- /dev/null
+++ b/tests/language/language_analyzer.status
@@ -0,0 +1,288 @@
+# 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.
+
+[ $compiler == dartanalyzer ]
+abstract_factory_constructor_test/00: fail
+assign_instance_method_negative_test: fail
+assign_static_type_test/06: fail
+bad_named_parameters2_test: fail
+bad_named_parameters_test: fail
+bad_override_test/01: fail
+bad_override_test/02: fail
+bad_override_test/03: fail
+bad_override_test/04: fail
+bad_override_test/05: fail
+black_listed_test/11: fail
+body_less_constructor_wrong_arg_negative_test: fail
+built_in_identifier_prefix_test: fail
+call_constructor_on_unresolvable_class_test/01: fail
+call_constructor_on_unresolvable_class_test/02: fail
+call_constructor_on_unresolvable_class_test/03: fail
+call_constructor_on_unresolvable_class_test/07: fail
+call_nonexistent_static_test/04: fail
+call_nonexistent_static_test/06: fail
+call_nonexistent_static_test/07: fail
+call_nonexistent_static_test/09: fail
+call_nonexistent_static_test/10: fail
+call_through_getter_test: fail
+callable_test/none: fail
+cast_test/04: fail
+cast_test/05: fail
+class_cycle_test/03: fail
+closure_call_wrong_argument_count_negative_test: fail
+compile_time_constant10_test/none: fail
+compile_time_constant8_test: fail
+compile_time_constant_b_test: fail
+compile_time_constant_c_test/01: fail
+compile_time_constant_c_test/02: fail
+compile_time_constant_checked2_test/02: fail
+compile_time_constant_checked2_test/03: fail
+compile_time_constant_checked2_test/04: fail
+compile_time_constant_checked2_test/06: fail
+compile_time_constant_checked3_test/02: fail
+compile_time_constant_checked3_test/03: fail
+compile_time_constant_checked3_test/04: fail
+compile_time_constant_checked3_test/06: fail
+compile_time_constant_d_test: fail
+compile_time_constant_e_test: fail
+const_syntax_test/06: fail
+constructor2_negative_test: fail
+constructor3_negative_test: fail
+constructor_call_wrong_argument_count_negative_test: fail
+constructor_negative_test: fail
+constructor_return_with_arrow_negative_test: fail
+constructor_return_with_init_and_arrow_negative_test: fail
+cyclic_type_variable_test/01: fail
+cyclic_type_variable_test/02: fail
+cyclic_type_variable_test/03: fail
+cyclic_type_variable_test/04: fail
+default_factory2_test/01: fail
+default_implementation2_test: fail
+dynamic2_test/00: fail
+dynamic_field_test: fail
+export_cyclic_test: fail
+f_bounded_quantification_test/01: fail
+f_bounded_quantification_test/02: fail
+factory2_test: fail
+factory5_test/00: fail
+factory_implementation_test/none: fail
+factory_redirection2_test/01: fail
+fauxverride_test/03: fail
+fauxverride_test/05: fail
+field_method4_negative_test: fail
+field_override_test/01: fail
+final_for_in_variable_test/01: fail
+final_param_negative_test: fail
+final_var_negative_test: fail
+final_variable_assignment_test/01: fail
+final_variable_assignment_test/02: fail
+final_variable_assignment_test/03: fail
+final_variable_assignment_test/04: fail
+first_class_types_constants_test: fail
+for_in2_test: fail
+function_type_alias5_test/00: fail
+function_type_alias5_test/01: fail
+function_type_alias5_test/02: fail
+getter_no_setter2_test/00: fail
+getter_no_setter2_test/03: fail
+getter_no_setter_test/00: fail
+getter_no_setter_test/01: fail
+getters_setters2_test/01: fail
+getters_setters_type_test/01: fail
+implicit_this_test/01: fail
+implicit_this_test/04: fail
+import_combinators_negative_test: fail
+inst_field_initializer1_negative_test: fail
+instance_call_wrong_argument_count_negative_test: fail
+instance_method2_negative_test: fail
+instance_method_negative_test: fail
+instantiate_type_variable_negative_test: fail
+interface_static_non_final_fields_negative_test: fail
+interface_test/00: fail
+is_not_class2_negative_test: fail
+library_juxtaposition_test: fail
+licm_test: fail
+list_literal1_negative_test: fail
+list_literal_syntax_test/01: fail
+list_literal_syntax_test/02: fail
+list_literal_syntax_test/03: fail
+map_literal1_negative_test: fail
+map_literal3_test: fail
+method_override2_test/03: fail
+mixin_illegal_constructor_test/13: fail
+mixin_illegal_constructor_test/14: fail
+mixin_illegal_constructor_test/15: fail
+mixin_illegal_constructor_test/16: fail
+mixin_illegal_cycles_test/02: fail
+mixin_illegal_cycles_test/03: fail
+mixin_illegal_cycles_test/04: fail
+mixin_illegal_cycles_test/06: fail
+mixin_illegal_syntax_test/13: fail
+mixin_type_parameters_errors_test/01: fail
+mixin_type_parameters_errors_test/02: fail
+mixin_type_parameters_errors_test/03: fail
+mixin_type_parameters_errors_test/04: fail
+mixin_type_parameters_errors_test/05: fail
+named_parameters2_test: fail
+named_parameters_aggregated_test/03: fail
+named_parameters_aggregated_test/05: fail
+new_expression_type_args_test/00: fail
+new_expression_type_args_test/01: fail
+new_expression_type_args_test/02: fail
+no_such_method_negative_test: fail
+non_const_super_negative_test: fail
+number_identifier_negative_test: fail
+override_field_method1_negative_test: fail
+override_field_method2_negative_test: fail
+override_field_method4_negative_test: fail
+override_field_method5_negative_test: fail
+override_field_test/01: fail
+override_field_test/02: fail
+override_field_test/03: fail
+override_method_with_field_test/01: fail
+override_method_with_field_test/02: fail
+prefix10_negative_test: fail
+prefix11_negative_test: fail
+prefix12_negative_test: fail
+prefix1_negative_test: fail
+prefix22_test: fail
+prefix23_test: fail
+prefix2_negative_test: fail
+prefix4_negative_test: fail
+prefix5_negative_test: fail
+prefix6_negative_test: fail
+prefix8_negative_test: fail
+prefix9_negative_test: fail
+private_member1_negative_test: fail
+private_member2_negative_test: fail
+private_member3_negative_test: fail
+pseudo_kw_illegal_test/14: fail
+pseudo_kw_test: fail
+redirecting_factory_infinite_steps_test/01: fail
+redirecting_factory_infinite_steps_test/02: fail
+scope_negative_test: fail
+setter3_test/01: fail
+setter3_test/02: fail
+static_call_wrong_argument_count_negative_test: fail
+static_field3_test/01: fail
+static_field3_test/02: fail
+static_field3_test/04: fail
+static_field_test/01: fail
+static_field_test/02: fail
+static_field_test/03: fail
+static_final_field2_negative_test: fail
+static_final_field_negative_test: fail
+syntax_test/28: fail
+syntax_test/29: fail
+syntax_test/30: fail
+syntax_test/31: fail
+syntax_test/32: fail
+syntax_test/33: fail
+ternary_test: fail
+throw7_negative_test: fail
+type_error_test: fail
+type_parameter_test/01: fail
+type_parameter_test/02: fail
+type_parameter_test/03: fail
+type_parameter_test/04: fail
+type_variable_bounds2_test/00: fail
+type_variable_bounds2_test/01: fail
+type_variable_bounds2_test/02: fail
+type_variable_bounds2_test/03: fail
+type_variable_bounds2_test/04: fail
+type_variable_bounds2_test/06: fail
+type_variable_bounds_test/00: fail
+type_variable_bounds_test/01: fail
+type_variable_bounds_test/02: fail
+type_variable_bounds_test/03: fail
+type_variable_bounds_test/04: fail
+type_variable_bounds_test/06: fail
+type_variable_bounds_test/07: fail
+type_variable_bounds_test/09: fail
+type_variable_identifier_expression_negative_test: fail
+type_variable_static_context_negative_test: fail
+typed_equality_test: fail
+unary2_test: fail
+unary_test: fail
+unresolved_in_factory_negative_test: fail
+unresolved_top_level_method_negative_test: fail
+unresolved_top_level_var_negative_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, OK
+lazy_static3_test: fail, OK
+
+# test issue 10752, there are 'implicit' scopes for 'if', 'while' and 'do-while'
+implicit_scope_test: fail, OK
+
+# test issue 10889, "throw" requires expression, "rethrow" should be used instead
+execute_finally10_test: fail, OK
+execute_finally11_test: fail, OK
+final_used_in_try_test: fail, OK
+full_stacktrace2_test: fail, OK
+stack_trace_test: fail, OK
+throw3_test: fail, OK
+try_catch3_test: fail, OK
+
+# test issue 10890; on-catch UnknownType is a static warning, not error
+try_catch_on_syntax_test/01: fail, OK
+try_catch_on_syntax_test/07: fail, OK
+try_catch_syntax_test/08: fail, OK
+
+# test issue 10899; it is static warning, not error, to call methods of class literal
+class_literal_test/02: fail, OK
+class_literal_test/05: fail, OK
+class_literal_test/07: fail, OK
+class_literal_test/10: fail, OK
+class_literal_test/11: fail, OK
+class_literal_test/12: fail, OK
+class_literal_test/14: fail, OK
+class_literal_test/17: fail, OK
+class_literal_test/18: fail, OK
+class_literal_test/19: fail, OK
+class_literal_test/22: fail, OK
+class_literal_test/23: fail, OK
+class_literal_test/24: fail, OK
+class_literal_test/27: fail, OK
+class_literal_test/28: fail, OK
+class_literal_test/29: fail, OK
+class_literal_test/none: fail, OK
+
+# Test issue 11124, Uninitialized finals are warnings not errors
+field3a_negative_test: fail, OK
+const_syntax_test/01: fail, OK
+const_syntax_test/04: fail, OK
+const_syntax_test/02: fail, OK
+const_syntax_test/03: fail, OK
+final_syntax_test/01: fail, OK
+final_syntax_test/04: fail, OK
+final_syntax_test/02: fail, OK
+final_syntax_test/03: fail, OK
+
+# Test issue 11123, Only static fields can be declared as 'const'
+const_escape_frog_test: fail, OK
+compile_time_constant_test/none: fail, OK
+
+[ $compiler == dartanalyzer && $checked ]
+factory1_test/00: fail
+factory1_test/01: fail
+field_type_check2_test/01: fail
+factory_implementation_test/00: fail
+factory_redirection_test/08: fail
+factory_redirection_test/09: fail
+factory_redirection_test/10: fail
+factory_redirection_test/11: fail
+factory_redirection_test/12: fail
+factory_redirection_test/13: fail
+factory_redirection_test/14: fail
+getters_setters2_test/03: fail
+type_variable_bounds3_test/00: fail
+type_variable_bounds2_test/05: fail
+type_variable_scope_test/00: fail
+type_variable_scope_test/01: fail
+type_variable_scope_test/02: fail
+type_variable_scope_test/03: fail
+type_variable_scope_test/04: fail
+type_variable_scope_test/05: fail
+
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
new file mode 100644
index 0000000..926d8e9
--- /dev/null
+++ b/tests/language/language_analyzer2.status
@@ -0,0 +1,288 @@
+# 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.
+
+[ $compiler == dart2analyzer ]
+abstract_factory_constructor_test/00: fail
+assign_instance_method_negative_test: fail
+assign_static_type_test/06: fail
+bad_named_parameters2_test: fail
+bad_named_parameters_test: fail
+bad_override_test/01: fail
+bad_override_test/02: fail
+bad_override_test/03: fail
+bad_override_test/04: fail
+bad_override_test/05: fail
+black_listed_test/11: fail
+body_less_constructor_wrong_arg_negative_test: fail
+built_in_identifier_prefix_test: fail
+call_constructor_on_unresolvable_class_test/01: fail
+call_constructor_on_unresolvable_class_test/02: fail
+call_constructor_on_unresolvable_class_test/03: fail
+call_constructor_on_unresolvable_class_test/07: fail
+call_nonexistent_static_test/04: fail
+call_nonexistent_static_test/06: fail
+call_nonexistent_static_test/07: fail
+call_nonexistent_static_test/09: fail
+call_nonexistent_static_test/10: fail
+call_through_getter_test: fail
+callable_test/none: fail
+cast_test/04: fail
+cast_test/05: fail
+class_cycle_test/03: fail
+closure_call_wrong_argument_count_negative_test: fail
+compile_time_constant10_test/none: fail
+compile_time_constant8_test: fail
+compile_time_constant_b_test: fail
+compile_time_constant_c_test/01: fail
+compile_time_constant_c_test/02: fail
+compile_time_constant_checked2_test/02: fail
+compile_time_constant_checked2_test/03: fail
+compile_time_constant_checked2_test/04: fail
+compile_time_constant_checked2_test/06: fail
+compile_time_constant_checked3_test/02: fail
+compile_time_constant_checked3_test/03: fail
+compile_time_constant_checked3_test/04: fail
+compile_time_constant_checked3_test/06: fail
+compile_time_constant_d_test: fail
+compile_time_constant_e_test: fail
+const_syntax_test/06: fail
+constructor2_negative_test: fail
+constructor3_negative_test: fail
+constructor_call_wrong_argument_count_negative_test: fail
+constructor_negative_test: fail
+constructor_return_with_arrow_negative_test: fail
+constructor_return_with_init_and_arrow_negative_test: fail
+cyclic_type_variable_test/01: fail
+cyclic_type_variable_test/02: fail
+cyclic_type_variable_test/03: fail
+cyclic_type_variable_test/04: fail
+default_factory2_test/01: fail
+default_implementation2_test: fail
+dynamic2_test/00: fail
+dynamic_field_test: fail
+export_cyclic_test: fail
+f_bounded_quantification_test/01: fail
+f_bounded_quantification_test/02: fail
+factory2_test: fail
+factory5_test/00: fail
+factory_implementation_test/none: fail
+factory_redirection2_test/01: fail
+fauxverride_test/03: fail
+fauxverride_test/05: fail
+field_method4_negative_test: fail
+field_override_test/01: fail
+final_for_in_variable_test/01: fail
+final_param_negative_test: fail
+final_var_negative_test: fail
+final_variable_assignment_test/01: fail
+final_variable_assignment_test/02: fail
+final_variable_assignment_test/03: fail
+final_variable_assignment_test/04: fail
+first_class_types_constants_test: fail
+for_in2_test: fail
+function_type_alias5_test/00: fail
+function_type_alias5_test/01: fail
+function_type_alias5_test/02: fail
+getter_no_setter2_test/00: fail
+getter_no_setter2_test/03: fail
+getter_no_setter_test/00: fail
+getter_no_setter_test/01: fail
+getters_setters2_test/01: fail
+getters_setters_type_test/01: fail
+implicit_this_test/01: fail
+implicit_this_test/04: fail
+import_combinators_negative_test: fail
+inst_field_initializer1_negative_test: fail
+instance_call_wrong_argument_count_negative_test: fail
+instance_method2_negative_test: fail
+instance_method_negative_test: fail
+instantiate_type_variable_negative_test: fail
+interface_static_non_final_fields_negative_test: fail
+interface_test/00: fail
+is_not_class2_negative_test: fail
+library_juxtaposition_test: fail
+licm_test: fail
+list_literal1_negative_test: fail
+list_literal_syntax_test/01: fail
+list_literal_syntax_test/02: fail
+list_literal_syntax_test/03: fail
+map_literal1_negative_test: fail
+map_literal3_test: fail
+method_override2_test/03: fail
+mixin_illegal_constructor_test/13: fail
+mixin_illegal_constructor_test/14: fail
+mixin_illegal_constructor_test/15: fail
+mixin_illegal_constructor_test/16: fail
+mixin_illegal_cycles_test/02: fail
+mixin_illegal_cycles_test/03: fail
+mixin_illegal_cycles_test/04: fail
+mixin_illegal_cycles_test/06: fail
+mixin_illegal_syntax_test/13: fail
+mixin_type_parameters_errors_test/01: fail
+mixin_type_parameters_errors_test/02: fail
+mixin_type_parameters_errors_test/03: fail
+mixin_type_parameters_errors_test/04: fail
+mixin_type_parameters_errors_test/05: fail
+named_parameters2_test: fail
+named_parameters_aggregated_test/03: fail
+named_parameters_aggregated_test/05: fail
+new_expression_type_args_test/00: fail
+new_expression_type_args_test/01: fail
+new_expression_type_args_test/02: fail
+no_such_method_negative_test: fail
+non_const_super_negative_test: fail
+number_identifier_negative_test: fail
+override_field_method1_negative_test: fail
+override_field_method2_negative_test: fail
+override_field_method4_negative_test: fail
+override_field_method5_negative_test: fail
+override_field_test/01: fail
+override_field_test/02: fail
+override_field_test/03: fail
+override_method_with_field_test/01: fail
+override_method_with_field_test/02: fail
+prefix10_negative_test: fail
+prefix11_negative_test: fail
+prefix12_negative_test: fail
+prefix1_negative_test: fail
+prefix22_test: fail
+prefix23_test: fail
+prefix2_negative_test: fail
+prefix4_negative_test: fail
+prefix5_negative_test: fail
+prefix6_negative_test: fail
+prefix8_negative_test: fail
+prefix9_negative_test: fail
+private_member1_negative_test: fail
+private_member2_negative_test: fail
+private_member3_negative_test: fail
+pseudo_kw_illegal_test/14: fail
+pseudo_kw_test: fail
+redirecting_factory_infinite_steps_test/01: fail
+redirecting_factory_infinite_steps_test/02: fail
+scope_negative_test: fail
+setter3_test/01: fail
+setter3_test/02: fail
+static_call_wrong_argument_count_negative_test: fail
+static_field3_test/01: fail
+static_field3_test/02: fail
+static_field3_test/04: fail
+static_field_test/01: fail
+static_field_test/02: fail
+static_field_test/03: fail
+static_final_field2_negative_test: fail
+static_final_field_negative_test: fail
+syntax_test/28: fail
+syntax_test/29: fail
+syntax_test/30: fail
+syntax_test/31: fail
+syntax_test/32: fail
+syntax_test/33: fail
+ternary_test: fail
+throw7_negative_test: fail
+type_error_test: fail
+type_parameter_test/01: fail
+type_parameter_test/02: fail
+type_parameter_test/03: fail
+type_parameter_test/04: fail
+type_variable_bounds2_test/00: fail
+type_variable_bounds2_test/01: fail
+type_variable_bounds2_test/02: fail
+type_variable_bounds2_test/03: fail
+type_variable_bounds2_test/04: fail
+type_variable_bounds2_test/06: fail
+type_variable_bounds_test/00: fail
+type_variable_bounds_test/01: fail
+type_variable_bounds_test/02: fail
+type_variable_bounds_test/03: fail
+type_variable_bounds_test/04: fail
+type_variable_bounds_test/06: fail
+type_variable_bounds_test/07: fail
+type_variable_bounds_test/09: fail
+type_variable_identifier_expression_negative_test: fail
+type_variable_static_context_negative_test: fail
+typed_equality_test: fail
+unary2_test: fail
+unary_test: fail
+unresolved_in_factory_negative_test: fail
+unresolved_top_level_method_negative_test: fail
+unresolved_top_level_var_negative_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, OK
+lazy_static3_test: fail, OK
+
+# test issue 10752, there are 'implicit' scopes for 'if', 'while' and 'do-while'
+implicit_scope_test: fail, OK
+
+# test issue 10889, "throw" requires expression, "rethrow" should be used instead
+execute_finally10_test: fail, OK
+execute_finally11_test: fail, OK
+final_used_in_try_test: fail, OK
+full_stacktrace2_test: fail, OK
+stack_trace_test: fail, OK
+throw3_test: fail, OK
+try_catch3_test: fail, OK
+
+# test issue 10890; on-catch UnknownType is a static warning, not error
+try_catch_on_syntax_test/01: fail, OK
+try_catch_on_syntax_test/07: fail, OK
+try_catch_syntax_test/08: fail, OK
+
+# test issue 10899; it is static warning, not error, to call methods of class literal
+class_literal_test/02: fail, OK
+class_literal_test/05: fail, OK
+class_literal_test/07: fail, OK
+class_literal_test/10: fail, OK
+class_literal_test/11: fail, OK
+class_literal_test/12: fail, OK
+class_literal_test/14: fail, OK
+class_literal_test/17: fail, OK
+class_literal_test/18: fail, OK
+class_literal_test/19: fail, OK
+class_literal_test/22: fail, OK
+class_literal_test/23: fail, OK
+class_literal_test/24: fail, OK
+class_literal_test/27: fail, OK
+class_literal_test/28: fail, OK
+class_literal_test/29: fail, OK
+class_literal_test/none: fail, OK
+
+# Test issue 11124, Uninitialized finals are warnings not errors
+field3a_negative_test: fail, OK
+const_syntax_test/01: fail, OK
+const_syntax_test/04: fail, OK
+const_syntax_test/02: fail, OK
+const_syntax_test/03: fail, OK
+final_syntax_test/01: fail, OK
+final_syntax_test/04: fail, OK
+final_syntax_test/02: fail, OK
+final_syntax_test/03: fail, OK
+
+# Test issue 11123, Only static fields can be declared as 'const'
+const_escape_frog_test: fail, OK
+compile_time_constant_test/none: fail, OK
+
+[ $compiler == dart2analyzer && $checked ]
+factory1_test/00: fail
+factory1_test/01: fail
+field_type_check2_test/01: fail
+factory_implementation_test/00: fail
+factory_redirection_test/08: fail
+factory_redirection_test/09: fail
+factory_redirection_test/10: fail
+factory_redirection_test/11: fail
+factory_redirection_test/12: fail
+factory_redirection_test/13: fail
+factory_redirection_test/14: fail
+getters_setters2_test/03: fail
+type_variable_bounds3_test/00: fail
+type_variable_bounds2_test/05: fail
+type_variable_scope_test/00: fail
+type_variable_scope_test/01: fail
+type_variable_scope_test/02: fail
+type_variable_scope_test/03: fail
+type_variable_scope_test/04: fail
+type_variable_scope_test/05: fail
+
diff --git a/tests/language/load_to_load_forwarding_test.dart b/tests/language/load_to_load_forwarding_vm_test.dart
similarity index 73%
rename from tests/language/load_to_load_forwarding_test.dart
rename to tests/language/load_to_load_forwarding_vm_test.dart
index cade3c6..b77854f 100644
--- a/tests/language/load_to_load_forwarding_test.dart
+++ b/tests/language/load_to_load_forwarding_vm_test.dart
@@ -4,6 +4,7 @@
 // Test correctness of side effects tracking used by load to load forwarding.
 
 import "package:expect/expect.dart";
+import "dart:typed_data";
 
 class A {
   var x, y;
@@ -50,6 +51,26 @@
   return arr.length;
 }
 
+
+testPhiRepresentation(f, arr) {
+  if (f) {
+    arr[0] = arr[0] + arr[1];
+  } else {
+    arr[0] = arr[0] - arr[1];
+  }
+  return arr[0];
+}
+
+
+testPhiConvertions(f, arr) {
+  if (f) {
+    arr[0] = arr[1];
+  } else {
+    arr[0] = arr[2];
+  }
+  return arr[0];
+}
+
 main() {
   final fixed = new List(10);
   final growable = [];
@@ -57,15 +78,30 @@
   testImmutableVMFields(growable, false);
   testImmutableVMFields(growable, false);
 
+  final f64List = new Float64List(2);
+  testPhiRepresentation(true, f64List);
+  testPhiRepresentation(false, f64List);
+
   for (var i = 0; i < 2000; i++) {
     Expect.listEquals([0x02010000, 0x03020100], foo(new A(0, 0)));
     Expect.listEquals([0x02010000, 0x03020100], bar(new A(0, 0), false));
     Expect.listEquals([0x04020000, 0x03020100], bar(new A(0, 0), true));
     testImmutableVMFields(fixed, true);
+    testPhiRepresentation(true, f64List);
   }
 
   Expect.equals(1, testImmutableVMFields([], false));
   Expect.equals(2, testImmutableVMFields([1], false));
   Expect.equals(2, testImmutableVMFields([1, 2], false));
   Expect.equals(3, testImmutableVMFields([1, 2, 3], false));
-}
\ No newline at end of file
+
+  final u32List = new Uint32List(3);
+  u32List[0] = 0;
+  u32List[1] = 0x3FFFFFFF;
+  u32List[2] = 0x7FFFFFFF;
+  
+  for (var i = 0; i < 4000; i++) {
+    testPhiConvertions(true, u32List);
+    testPhiConvertions(false, u32List);
+  }
+}
diff --git a/tests/language/multiple_field_assignment_constructor_test.dart b/tests/language/multiple_field_assignment_constructor_test.dart
new file mode 100644
index 0000000..9058c42
--- /dev/null
+++ b/tests/language/multiple_field_assignment_constructor_test.dart
@@ -0,0 +1,52 @@
+// 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 "compiler_annotations.dart";
+
+var a = [null];
+
+class A {
+  var foo;
+  var bar;
+
+  @DontInline
+  A() {
+    // Currently defeat inlining by using a closure.
+    bar = () => 42;
+    foo = 42;
+    foo = a[0];
+  }
+}
+
+class B {
+  var foo;
+  var bar;
+
+  @DontInline
+  B() {
+    // Currently defeat inlining by using a closure.
+    bar = () => 42;
+    foo = 42;
+    foo = a[0];
+    if (false) foo = 42;
+  }
+}
+
+main() {
+  // Surround the call to [bar] by allocations of [A] and [B] to
+  // ensure their constructors get analyzed first.
+  new A();
+  new B();
+  bar();
+  new A();
+  new B();
+}
+
+@DontInline
+bar() {
+  // Currently defeat inlining by using a closure.
+  Expect.throws(() => new A().foo + 42, (e) => e is NoSuchMethodError);
+  Expect.throws(() => new B().foo + 42, (e) => e is NoSuchMethodError);
+}
diff --git a/tests/language/reg_exp_test.dart b/tests/language/reg_exp_test.dart
index 631cfda..26826a9 100644
--- a/tests/language/reg_exp_test.dart
+++ b/tests/language/reg_exp_test.dart
@@ -5,22 +5,24 @@
 
 import "package:expect/expect.dart";
 
-class RegExpTest {
-  static test1() {
-    RegExp exp = new RegExp("(\\w+)");
-    String str = "Parse my string";
-    List<Match> matches = new List<Match>.from(exp.allMatches(str));
-    Expect.equals(3, matches.length);
-    Expect.equals("Parse", matches[0].group(0));
-    Expect.equals("my", matches[1].group(0));
-    Expect.equals("string", matches[2].group(0));
-  }
+void main() {
+  RegExp exp = new RegExp(r"(\w+)");
+  String str = "Parse my string";
+  List<Match> matches = exp.allMatches(str).toList();
+  Expect.equals(3, matches.length);
+  Expect.equals("Parse", matches[0].group(0));
+  Expect.equals("my", matches[1].group(0));
+  Expect.equals("string", matches[2].group(0));
 
-  static testMain() {
-    test1();
-  }
-}
+  // Check that allMatches progresses correctly for empty matches, and that
+  // it includes the empty match at the end position.
+  exp = new RegExp("a?");
+  str = "babba";
+  Expect.listEquals(["", "a", "", "", "a", ""],
+                    exp.allMatches(str).map((x)=>x[0]).toList());
 
-main() {
-  RegExpTest.testMain();
+  // Regression test for http://dartbug.com/2980
+  exp = new RegExp("^", multiLine: true);  // Any zero-length match will work.
+  str = "foo\nbar\nbaz";
+  Expect.equals(" foo\n bar\n baz", str.replaceAll(exp, " "));
 }
diff --git a/tests/lib/analyzer/analyze_tests.status b/tests/lib/analyzer/analyze_tests.status
index 90d7b8b..25abec6 100644
--- a/tests/lib/analyzer/analyze_tests.status
+++ b/tests/lib/analyzer/analyze_tests.status
@@ -36,5 +36,10 @@
 standalone/io/web_socket_protocol_processor_test: Fail
 standalone/io/url_encoding_test: Fail
 
+
 [ $compiler == dartanalyzer ]
 standalone/io/process_exit_negative_test: fail
+
+
+[ $compiler == dart2analyzer ]
+standalone/io/process_exit_negative_test: fail
diff --git a/tests/lib/crypto/base64_test.dart b/tests/lib/crypto/base64_test.dart
index efc438e..9a58e3b 100644
--- a/tests/lib/crypto/base64_test.dart
+++ b/tests/lib/crypto/base64_test.dart
@@ -81,16 +81,12 @@
 
 testDecoderForMalformedInput() {
   Expect.throws(() {
-      CryptoUtils.base64StringToBytes('AB~', ignoreInvalidCharacters: false);
+      CryptoUtils.base64StringToBytes('AB~');
     }, (e) => e is FormatException);
 
   Expect.throws(() {
     CryptoUtils.base64StringToBytes('A');
   }, (e) => e is FormatException);
-
-  Expect.listEquals('f'.codeUnits,
-      CryptoUtils.base64StringToBytes('~~Zg==@@@',
-          ignoreInvalidCharacters: true));
 }
 
 testUrlSafeEncodeDecode() {
diff --git a/tests/lib/crypto/sha1_test.dart b/tests/lib/crypto/sha1_test.dart
index 24a7271..7ce49c3 100644
--- a/tests/lib/crypto/sha1_test.dart
+++ b/tests/lib/crypto/sha1_test.dart
@@ -545,7 +545,7 @@
 void testInvalidUse() {
   var sha = new SHA1();
   sha.close();
-  Expect.throws(() => sha.add([0]), (e) => e is HashException);
+  Expect.throws(() => sha.add([0]), (e) => e is StateError);
 }
 
 void testRepeatedDigest() {
diff --git a/tests/lib/crypto/sha256_test.dart b/tests/lib/crypto/sha256_test.dart
index 528c831..01bb4b8 100644
--- a/tests/lib/crypto/sha256_test.dart
+++ b/tests/lib/crypto/sha256_test.dart
@@ -289,7 +289,7 @@
 void testInvalidUse() {
   var sha = new SHA256();
   sha.close();
-  Expect.throws(() => sha.add([0]), (e) => e is HashException);
+  Expect.throws(() => sha.add([0]), (e) => e is StateError);
 }
 
 void testRepeatedDigest() {
diff --git a/tests/lib/mirrors/mirrors_test.dart b/tests/lib/mirrors/mirrors_test.dart
index 310f57c..b044283 100644
--- a/tests/lib/mirrors/mirrors_test.dart
+++ b/tests/lib/mirrors/mirrors_test.dart
@@ -203,11 +203,12 @@
 mainWithArgument({bool isDart2js: false, bool isMinified: false}) {
   var mirrors = currentMirrorSystem();
   test("Test reflective method invocation", () { testInvoke(mirrors); });
-  if (isMinified) return;
   test("Test instance field access", () { testInstanceFieldAccess(mirrors); });
   test('Test intercepted objects', () { testIntercepted(mirrors); });
+  if (!isMinified) // TODO(ahe): Remove this line.
   test("Test field access", () { testFieldAccess(mirrors); });
   test("Test closure mirrors", () { testClosureMirrors(mirrors); });
+  if (!isMinified) // TODO(ahe): Remove this line.
   test("Test invoke constructor", () { testInvokeConstructor(mirrors); });
   test("Test current library uri", () {
     testLibraryUri(new Class(),
@@ -216,6 +217,7 @@
   test("Test dart library uri", () {
     testLibraryUri("test", (Uri uri) => uri == Uri.parse('dart:core'));
   });
+  if (!isMinified) // TODO(ahe): Remove this line.
   test("Test simple and qualifiedName", () { testNames(mirrors, isDart2js); });
   if (isDart2js) return; // TODO(ahe): Remove this line.
   test("Test reflect type", () { testReflectClass(mirrors); });
diff --git a/tests/standalone/53bit_overflow_test.dart b/tests/standalone/53bit_overflow_test.dart
new file mode 100644
index 0000000..1475cfd
--- /dev/null
+++ b/tests/standalone/53bit_overflow_test.dart
@@ -0,0 +1,47 @@
+// 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=--throw_on_javascript_int_overflow
+
+
+import "package:expect/expect.dart";
+import 'dart:typed_data';
+
+
+int double_to_int_throws() {
+  double d = 1.9e16;
+  return d.toInt();
+}
+
+
+int integer_add_throws() {
+  return (1 << 52) + (1 << 52);
+}
+
+
+int i64list_throws() {
+  var i64l = new Int64List(16);
+  i64l[0] = (1 << 54);
+  return i64l[0];
+}
+
+
+int double_to_int() {
+  double d = 1.9e14;
+  return d.toInt();
+}
+
+
+int integer_add() {
+  return (1 << 50) + (1 << 50);
+}
+
+
+main() {
+  Expect.throws(double_to_int_throws, (e) => e is FiftyThreeBitOverflowError);
+  Expect.throws(integer_add_throws, (e) => e is FiftyThreeBitOverflowError);
+  Expect.throws(i64list_throws, (e) => e is FiftyThreeBitOverflowError);
+  Expect.equals(190000000000000, double_to_int());
+  Expect.equals(1 << 51, integer_add());
+}
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 7bb7492..7d552d6 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -81,6 +81,7 @@
 
 io/process_exit_negative_test: Fail  # This is a compilation-time negative test.
 
+
 [ $compiler == dartanalyzer ]
 io/file_constructor_test: fail
 io/http_date_test: fail
@@ -95,6 +96,20 @@
 io/skipping_dart2js_compilations_test: fail, OK
 
 
+[ $compiler == dart2analyzer ]
+io/file_constructor_test: fail
+io/http_date_test: fail
+io/http_headers_test: fail
+io/http_parser_test: fail
+io/process_exit_negative_test: fail
+io/url_encoding_test: fail
+io/web_socket_protocol_processor_test: fail
+
+# Fails because checked-in dart executable is not up to date.
+io/test_runner_test: fail, OK
+io/skipping_dart2js_compilations_test: fail, OK
+
+
 [ $compiler == dart2js ]
 number_identity_test: Skip # Bigints and int/double diff. not supported.
 typed_data_test: Skip # dart:typed_data support needed.
@@ -117,6 +132,7 @@
 io/test_runner_test: Fail # Library dart:uri removed.
 io/skipping_dart2js_compilations_test: Skip # Library dart:uri removed.
 http_launch_test: Skip
+53bit_overflow_test: Skip
 
 [ $compiler == dart2js && $jscl ]
 assert_test: Fail, OK # Assumes unspecified fields on the AssertionError.
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index 79344f3..7bc1414 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -20,10 +20,6 @@
 [ $system == macos || $system == windows ]
 *_layout_test: Skip
 
-[ $compiler == dart2dart ]
-# Skip until we stabilize language tests.
-*: Skip
-
 [ $arch == arm ]
 *: Skip
 
diff --git a/tools/VERSION b/tools/VERSION
index 49da9c5..080e489 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 5
-BUILD 14
-PATCH 3
+BUILD 15
+PATCH 0
diff --git a/tools/bots/cross-vm.py b/tools/bots/cross-vm.py
index 3671f20..ea992a5 100644
--- a/tools/bots/cross-vm.py
+++ b/tools/bots/cross-vm.py
@@ -132,7 +132,7 @@
       run([GSUTIL, 'cp', uri, checked_recording])
       run(['python', execute_testcases_py, checked_recording,
            checked_recording_out])
-      run([GSUTIL, 'cp', recording_out, uri_out])
+      run([GSUTIL, 'cp', checked_recording_out, uri_out])
       run([GSUTIL, 'setacl', 'public-read', uri_out])
   finally:
     for path in temporary_files:
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index c938e92..6c10830 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -40,14 +40,6 @@
 # ......mirrors/
 # ......utf/
 # ......typed_data/
-# ....packages/
-# ......args/
-# ......intl/
-# ......logging/
-# ......meta/
-# ......serialization
-# ......unittest/
-# ......(more will come here)
 # ....util/
 # ......dartanalyzer/
 # ........dartanalyzer.jar
@@ -219,20 +211,6 @@
   copyfile(join(HOME, 'sdk', 'lib', '_internal', 'libraries.dart'),
            join(LIB, '_internal', 'libraries.dart'))
 
-  # Create and copy packages.
-  PACKAGES = join(SDK_tmp, 'packages')
-  os.makedirs(PACKAGES)
-
-  #
-  # Create and populate packages/{args, intl, logging, meta, unittest, ...}
-  #
-
-  for library in ['args', 'http', 'intl', 'logging', 'meta', 'oauth2', 'pathos',
-                  'serialization', 'unittest', 'yaml', 'analyzer_experimental']:
-
-    copytree(join(HOME, 'pkg', library, 'lib'), join(PACKAGES, library),
-             ignore=ignore_patterns('*.svn'))
-
   # Create and copy tools.
   UTIL = join(SDK_tmp, 'util')
   os.makedirs(UTIL)
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index c0f2c2c..e9292c2 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -1086,6 +1086,9 @@
   "DOMSettableTokenList": {
     "comment": "http://dev.w3.org/html5/spec-LC/common-dom-interfaces.html#domsettabletokenlist-0",
     "members": {
+      "__getter__": {
+        "support_level": "untriaged"
+      },
       "value": {}
     },
     "support_level": "stable"
@@ -1101,7 +1104,11 @@
   },
   "DOMStringMap": {
     "comment": "http://dev.w3.org/html5/spec-LC/common-dom-interfaces.html#domstringmap-0",
-    "members": {},
+    "members": {
+      "__getter__": {
+        "support_level": "untriaged"
+      }
+    },
     "support_level": "stable"
   },
   "DOMTokenList": {
@@ -1128,6 +1135,9 @@
         "comment": "http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem",
         "support_level": "experimental"
       },
+      "__getter__": {
+        "support_level": "untriaged"
+      },
       "addEventListener": {},
       "alert": {},
       "applicationCache": {},
@@ -3402,6 +3412,9 @@
   "HTMLFormControlsCollection": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection-0",
     "members": {
+      "__getter__": {
+        "support_level": "untriaged"
+      },
       "namedItem": {}
     },
     "support_level": "stable"
@@ -3410,6 +3423,9 @@
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#the-form-element",
     "members": {
       "HTMLFormElement": {},
+      "__getter__": {
+        "support_level": "untriaged"
+      },
       "acceptCharset": {},
       "action": {},
       "autocomplete": {
@@ -10108,6 +10124,9 @@
     "comment": "http://www.w3.org/TR/webstorage/#the-storage-interface",
     "dart_action": "unstable",
     "members": {
+      "__getter__": {
+        "support_level": "untriaged"
+      },
       "clear": {},
       "getItem": {},
       "key": {},
@@ -11194,6 +11213,9 @@
   "WebKitCSSKeyframesRule": {
     "comment": "http://www.w3.org/TR/css3-animations/#csskeyframesrule",
     "members": {
+      "__getter__": {
+        "support_level": "untriaged"
+      },
       "cssRules": {},
       "deleteRule": {},
       "findRule": {},
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 7912543..c08f2e0 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -105,6 +105,8 @@
 
     'WheelEvent': 'WheelEvent,MouseWheelEvent,MouseScrollEvent',
 
+    'XMLHttpRequestUpload': 'XMLHttpRequestUpload,XMLHttpRequestEventTarget',
+
 }, dart2jsOnly=True)
 
 def IsRegisteredType(type_name):
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index cd1d45c..18e5949 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -727,18 +727,19 @@
       return 'indexed_db'
     if interface.id.startswith("SQL"):
       return 'web_sql'
+    if interface.id.startswith("SVG"):
+      return 'svg'
+    if interface.id.startswith("WebGL") or interface.id.startswith("OES") \
+        or interface.id.startswith("EXT"):
+      return 'web_gl'
 
     if 'Conditional' in interface.ext_attrs:
       if 'WEB_AUDIO' in interface.ext_attrs['Conditional']:
         return 'web_audio'
-      if 'SVG' in interface.ext_attrs['Conditional']:
-        return 'svg'
       if 'INDEXED_DATABASE' in interface.ext_attrs['Conditional']:
         return 'indexed_db'
       if 'SQL_DATABASE' in interface.ext_attrs['Conditional']:
         return 'web_sql'
-      if 'WEBGL' in interface.ext_attrs['Conditional']:
-        return 'web_gl'
 
     if interface.id in typed_array_renames:
       return 'typed_data'
diff --git a/tools/dom/scripts/idlnode.py b/tools/dom/scripts/idlnode.py
index ea6d78d..5fc3d22 100755
--- a/tools/dom/scripts/idlnode.py
+++ b/tools/dom/scripts/idlnode.py
@@ -478,6 +478,21 @@
     self.arguments = self._convert_all(ast, 'Argument', IDLArgument)
     self.specials = self._find_all(ast, 'Special')
     self.is_stringifier = self._has(ast, 'Stringifier')
+    # Special case: there are getters of the form
+    # getter <ReturnType>(args).  For now force the name to be __getter__,
+    # but it should be operator[] later.
+    if self.id is None:
+      if self.specials == ['getter']:
+        self.id = '__getter__'
+      elif self.specials == ['setter']:
+        self.id = '__setter__'
+        # Special case: if it's a setter, ignore 'declared' return type
+        self.type = IDLType([('VoidType', None)])
+      elif self.specials == ['deleter']:
+        self.id = '__delete__'
+      else:
+        raise Exception('Cannot handle %s: operation has no id' % ast)
+
   def _extra_repr(self):
     return [self.arguments]
 
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index c016b7e..648f2eb 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -576,10 +576,12 @@
           'static ' if operation.is_static else '',
           self.SecureOutputType(operation.type.id),
           overload_name, argument_list)
+      is_custom = 'Custom' in operation.ext_attrs
       cpp_callback_name = self._GenerateNativeBinding(
           overload_name, (0 if operation.is_static else 1) + argument_count,
-          dart_declaration, 'Callback', False, False)
-      self._GenerateOperationNativeCallback(operation, operation.arguments[:argument_count], cpp_callback_name)
+          dart_declaration, 'Callback', is_custom, emit_metadata=False)
+      if not is_custom:
+        self._GenerateOperationNativeCallback(operation, operation.arguments[:argument_count], cpp_callback_name)
 
     self._GenerateDispatcherBody(
         info,
@@ -787,6 +789,7 @@
     start_index = 1 if needs_receiver else 0
     for i, argument in enumerate(arguments):
       type_info = self._TypeInfo(argument.type.id)
+      self._cpp_impl_includes |= set(type_info.conversion_includes())
       argument_expression_template, type, cls, function = \
           type_info.to_native_info(argument, self._interface.id)
 
diff --git a/tools/dom/src/dart2js_KeyEvent.dart b/tools/dom/src/dart2js_KeyEvent.dart
index a81d842..15a7153 100644
--- a/tools/dom/src/dart2js_KeyEvent.dart
+++ b/tools/dom/src/dart2js_KeyEvent.dart
@@ -42,7 +42,7 @@
   int get _realCharCode => JS('int', '#.charCode', _parent);
 
   /** Accessor to the underlying altKey value is the parent event. */
-  bool get _realAltKey => JS('int', '#.altKey', _parent);
+  bool get _realAltKey => JS('bool', '#.altKey', _parent);
 
   /** Construct a KeyEvent with [parent] as the event we're emulating. */
   KeyEvent(KeyboardEvent parent): super(parent) {
diff --git a/tools/dom/templates/html/impl/impl_HTMLSelectElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLSelectElement.darttemplate
index 2f1b90a..4099cd1 100644
--- a/tools/dom/templates/html/impl/impl_HTMLSelectElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLSelectElement.darttemplate
@@ -10,7 +10,8 @@
   // Override default options, since IE returns SelectElement itself and it
   // does not operate as a List.
   List<OptionElement> get options {
-    var options = this.children.where((e) => e is OptionElement).toList();
+    var options =
+        this.queryAll('option').where((e) => e is OptionElement).toList();
     return new UnmodifiableListView(options);
   }
 
diff --git a/tools/make_links.py b/tools/make_links.py
index e47d02f..965d04f 100644
--- a/tools/make_links.py
+++ b/tools/make_links.py
@@ -21,14 +21,6 @@
 
 
 def make_link(source, target):
-  # TODO(ahe): Remove this code when the build bots are green again.
-  bug_cleanup = os.path.join(target, 'lib')
-  if os.path.islink(bug_cleanup):
-    print 'Removing %s' % bug_cleanup
-    sys.stdout.flush()
-    os.unlink(bug_cleanup)
-  # End of temporary code.
-
   if os.path.islink(target):
     print 'Removing %s' % target
     sys.stdout.flush()
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 8570f35..52679e6 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -50,8 +50,9 @@
   /** Print everything (stdout, stderr, usageLog) whenever we add to it */
   bool debugPrint = false;
 
-  // We use this to gracefully handle double calls to close.
-  bool underTermination = false;
+  // This future will be lazily set when calling close() and will complete once
+  // the process did exit.
+  Future browserTerminationFuture;
 
   Browser();
 
@@ -95,75 +96,31 @@
     _stderr.write(output);
   }
 
-  // Kill the underlying process using the supplied kill function
-  // If there is a alternativeKillFunction we will use that after trying
-  // the default killFunction.
-  Future _killIt(killFunction, retries, [alternativeKillFunction = null]) {
-    Completer<bool> completer = new Completer<bool>();
-
-    // To capture non successfull attempts we set up a timer that will
-    // trigger a retry (using the alternativeKillFunction if supplied).
-    Timer timer =  new Timer(killRepeatInternal, () {
-      // Remove the handler, we will set this again in the call to killIt
-      // below
-      if (retries <= 0) {
-        _logEvent("Could not kill the process, not trying anymore");
-        // TODO(ricow): Should we crash the test script here and
-        // write out all our log. This is basically not a situation
-        // that we want to ignore. We could potentially have a handler we
-        // can call if this happens, which will shutdown the main process
-        // with info that people should contact [ricow,kustermann,?]
-        completer.complete(false);
-      }
-      _logEvent("Could not kill the process, retrying");
-      var nextKillFunction = killFunction;
-      if (alternativeKillFunction != null) {
-        nextKillFunction = alternativeKillFunction;
-      }
-      _killIt(nextKillFunction, retries - 1).then((success) {
-        completer.complete(success);
-      });
-    });
-
-    // Make sure we intercept onExit calls and eliminate the timer.
-    _processClosed = () {
-      timer.cancel();
-      _logEvent("Proccess exited, cancel timer in kill loop");
-      _processClosed = null;
-      process = null;
-      completer.complete(true);
-    };
-
-
-    _logEvent("calling kill function");
-    if (process != null && killFunction()) {
-      // We successfully sent the signal.
-      _logEvent("killing signal sent");
-    } else {
-      _logEvent("The process is already dead, kill signal could not be send");
-      completer.complete(true);
-    }
-    return completer.future;
-  }
-
-
-  /** Close the browser */
-  Future<bool> close() {
+  Future close() {
     _logEvent("Close called on browser");
-    if (underTermination) {
-      _logEvent("Browser already under termination.");
-      return new Future.immediate(true);
+    if (browserTerminationFuture == null) {
+      var completer = new Completer();
+      browserTerminationFuture = completer.future;
+
+      if (process != null) {
+        // Make sure we intercept onExit calls and complete.
+        _processClosed = () {
+          _processClosed = null;
+          process = null;
+          completer.complete(true);
+        };
+
+        if (process.kill(ProcessSignal.SIGKILL)) {
+          _logEvent("Successfully sent kill signal to process.");
+        } else {
+          _logEvent("Sending kill signal failed.");
+        }
+      } else {
+        _logEvent("The process is already dead.");
+        completer.complete(true);
+      }
     }
-    underTermination = true;
-    if (process == null) {
-      _logEvent("No process open, nothing to kill.");
-      return new Future.immediate(true);
-    }
-    var killFunction = process.kill;
-    // We use a SIGKILL signal if we don't kill the process in the first go.
-    var alternativeKillFunction =
-        () { return process.kill(ProcessSignal.SIGKILL);};
-    return _killIt(killFunction, killRetries, alternativeKillFunction);
+    return browserTerminationFuture;
   }
 
   /**
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 0546964..40cccd2 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -478,7 +478,8 @@
 
     return new StandardTestSuite(configuration,
         name, directory,
-        ['$directory/$name.status', '$directory/${name}_dart2js.status'],
+        ['$directory/$name.status', '$directory/${name}_dart2js.status',
+         '$directory/${name}_analyzer.status', '$directory/${name}_analyzer2.status'],
         isTestFilePredicate: (filename) => filename.endsWith('_test.dart'),
         recursive: true);
   }
@@ -564,9 +565,11 @@
     }
 
     for (var statusFilePath in statusFilePaths) {
-      // [forDirectory] adds name_dart2js.status for all tests suites. Use it
+      // [forDirectory] adds name_$compiler.status for all tests suites. Use it
       // if it exists, but otherwise skip it and don't fail.
-      if (statusFilePath.endsWith('_dart2js.status')) {
+      if (statusFilePath.endsWith('_dart2js.status') ||
+          statusFilePath.endsWith('_analyzer.status') ||
+          statusFilePath.endsWith('_analyzer2.status')) {
         var file = new File.fromPath(dartDir.append(statusFilePath));
         if (!file.existsSync()) {
           filesRead++;
@@ -1834,6 +1837,9 @@
     if (compiler == "dart2js" && configuration["csp"]) {
       args.add("--disallow-unsafe-eval");
     }
+    if (compiler == "dartanalyzer" || compiler == "dart2analyzer") {
+      args.add("--show-package-warnings");
+    }
     return args;
   }
 
diff --git a/utils/apidoc/apidoc.dart b/utils/apidoc/apidoc.dart
index bc20887c..ef6bae5 100644
--- a/utils/apidoc/apidoc.dart
+++ b/utils/apidoc/apidoc.dart
@@ -180,7 +180,7 @@
     Future.wait([copiedStatic, copiedApiDocStatic, htmlDiff])
       .then((_) => apidoc.documentLibraries(apidocLibraries, libPath,
             packageRoot))
-      .then((_) => compileScript(mode, outputDir, libPath))
+      .then((_) => compileScript(mode, outputDir, libPath, apidoc.tmpPath))
       .then((_) => print(apidoc.status))
       .catchError((e) {
         print('Error: generation failed: ${e}');
diff --git a/utils/compiler/compiler.gyp b/utils/compiler/compiler.gyp
index 1755ce2..8c95316 100644
--- a/utils/compiler/compiler.gyp
+++ b/utils/compiler/compiler.gyp
@@ -19,7 +19,8 @@
           'inputs': [
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
             '../../sdk/lib/_internal/libraries.dart',
-            '<!@(["python", "../../tools/list_files.py", "\\.dart$", "../../sdk/lib/_internal/compiler", "../../runtime/lib"])',
+            '<!@(["python", "../../tools/list_files.py", "\\.dart$", "../../sdk/lib/_internal/compiler", "../../runtime/lib", "../../sdk/lib/_internal/dartdoc"])',
+            'create_snapshot.dart',
           ],
           'outputs': [
             '<(SHARED_INTERMEDIATE_DIR)/utils_wrapper.dart.snapshot',
@@ -29,6 +30,8 @@
             'create_snapshot.dart',
             '--output_dir=<(SHARED_INTERMEDIATE_DIR)',
             '--dart2js_main=sdk/lib/_internal/compiler/implementation/dart2js.dart',
+            '--dartdoc_main=sdk/lib/_internal/dartdoc/bin/dartdoc.dart',
+            '--package_root=<(PRODUCT_DIR)/packages/',
           ],
         },
       ],
diff --git a/utils/compiler/create_snapshot.dart b/utils/compiler/create_snapshot.dart
index c5a8af4..d3a460e 100644
--- a/utils/compiler/create_snapshot.dart
+++ b/utils/compiler/create_snapshot.dart
@@ -22,11 +22,13 @@
 
 Future<String> getSnapshotGenerationFile(var options, var args, var rootPath) {
   var dart2js = rootPath.append(args["dart2js_main"]);
+  var dartdoc = rootPath.append(args["dartdoc_main"]);
 
   return getVersion(options, rootPath).then((version) {
     var snapshotGenerationText =
 """
 import '${dart2js}' as dart2jsMain;
+import '${dartdoc}' as dartdocMain;
 import 'dart:io';
 
 void main() {
@@ -36,6 +38,8 @@
   if (tool == "dart2js") {
     dart2jsMain.BUILD_ID = "$version";
     dart2jsMain.mainWithErrorHandler(options);
+  } else if (tool == "dartdoc") {
+    dartdocMain.mainWithOptions(options);
   }
 }
 
@@ -51,9 +55,10 @@
     writer.close();
 }
 
-Future createSnapshot(var options, var dart_file) {
+Future createSnapshot(var options, var dart_file, var packageRoot) {
   return Process.run(options.executable,
-                     ["--generate-script-snapshot=$dart_file.snapshot",
+                     ["--package-root=$packageRoot",
+                      "--generate-script-snapshot=$dart_file.snapshot",
                       dart_file])
       .then((result) {
         if (result.exitCode != 0) {
@@ -69,7 +74,8 @@
  */
 void main() {
   Options options = new Options();
-  var validArguments = ["--output_dir", "--dart2js_main"];
+  var validArguments = ["--output_dir", "--dart2js_main", "--dartdoc_main",
+                        "--package_root"];
   var args = {};
   for (var argument in options.arguments) {
     var argumentSplit = argument.split("=");
@@ -80,7 +86,9 @@
     args[argumentSplit[0].substring(2)] = argumentSplit[1];
   }
   if (!args.containsKey("dart2js_main")) throw "Please specify dart2js_main";
+  if (!args.containsKey("dartdoc_main")) throw "Please specify dartdoc_main";
   if (!args.containsKey("output_dir")) throw "Please specify output_dir";
+  if (!args.containsKey("package_root")) throw "Please specify package_root";
 
   var scriptFile = new File(new File(options.script).fullPathSync());
   var path = new Path(scriptFile.directory.path);
@@ -88,6 +96,6 @@
   getSnapshotGenerationFile(options, args, rootPath).then((result) {
     var wrapper = "${args['output_dir']}/utils_wrapper.dart";
     writeSnapshotFile(wrapper, result);
-    createSnapshot(options, wrapper);
+    createSnapshot(options, wrapper, args["package_root"]);
   });
 }
