diff --git a/client/tools/buildbot_annotated_steps.py b/client/tools/buildbot_annotated_steps.py
index 347b483..4a2d187 100755
--- a/client/tools/buildbot_annotated_steps.py
+++ b/client/tools/buildbot_annotated_steps.py
@@ -13,13 +13,12 @@
 chromium and headless dartium.
 """
 
+import imp
 import os
 import re
 import socket
 import subprocess
 import sys
-import shutil
-import glob
 
 BUILDER_NAME = 'BUILDBOT_BUILDERNAME'
 BUILDER_CLOBBER = 'BUILDBOT_CLOBBER'
@@ -30,6 +29,13 @@
 DARTIUM_V_MATCHER = (
     'gs://dartium-archive/[^/]*/dartium-\w*-inc-([0-9]*).([0-9]*).zip')
 
+def GetUtils():
+  '''Dynamically load the tools/utils.py python module.'''
+  dart_dir = os.path.abspath(os.path.join(__file__, '..', '..', '..'))
+  return imp.load_source('utils', os.path.join(dart_dir, 'tools', 'utils.py'))
+
+utils = GetUtils()
+
 def GetBuildInfo():
   """Returns a tuple (name, version, mode) where:
     - name: A name for the build - the buildbot host if a buildbot.
@@ -58,21 +64,7 @@
       version = 'unknown'
   return (name, version)
 
-
-def GetUtils():
-  '''
-  dynamically get the utils module
-  We use a dynamic import for tools/util.py because we derive its location
-  dynamically using sys.argv[0]. This allows us to run this script from
-  different directories.
-
-  args:
-  '''
-  sys.path.append(os.path.abspath(os.path.join('.', 'tools')))
-  utils = __import__('utils')
-  return utils
-
-def GetOutDir(utils, mode):
+def GetOutDir(mode):
   '''
   get the location to place the output
 
@@ -99,8 +91,7 @@
   # get the latest changed revision from the current repository sub-tree
   version = GetLatestChangedRevision()
 
-  utils = GetUtils()
-  outdir = GetOutDir(utils, mode)
+  outdir = GetOutDir(mode)
   cmds = [sys.executable, toolsBuildScript,
           '--mode=' + mode, '--revision=' + version,
           '--name=' + name, '--out=' + outdir]
@@ -162,32 +153,11 @@
 def GetShouldClobber():
   return os.environ.get(BUILDER_CLOBBER) == "1"
 
-def RunDart(scriptPath):
-  if sys.platform == 'darwin':
-    pipe = subprocess.Popen(
-          ['./tools/testing/bin/macos/dart', scriptPath],
-          stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-  elif os.name == 'posix':
-    pipe = subprocess.Popen(
-          ['./tools/testing/bin/linux/dart', scriptPath],
-          stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-  else:
-    pipe = subprocess.Popen(
-          ['tools\\testing\\bin\\windows\\dart.exe', scriptPath],
-          stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
-
-  output = pipe.communicate()
-  return output[0]
-
 def GetLatestChangedRevision():
-  # 0.1.2.0_r13661
-  # 0.1.2.0_r13661_username
-  fullVersion = RunDart("tools/version.dart")
-
-  m = re.search('._r(\d+)', fullVersion)
-  svnRev = m.group(1)
-
-  return svnRev
+  revision = utils.GetSVNRevision()
+  if not revision:
+    raise Exception("Couldn't determine last changed revision.")
+  return revision
 
 def main():
   if len(sys.argv) == 0:
diff --git a/pkg/analyzer_experimental/bin/analyzer.dart b/pkg/analyzer_experimental/bin/analyzer.dart
index 805e960..5fed0a8 100644
--- a/pkg/analyzer_experimental/bin/analyzer.dart
+++ b/pkg/analyzer_experimental/bin/analyzer.dart
@@ -10,14 +10,8 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:analyzer_experimental/src/generated/java_io.dart';
 import 'package:analyzer_experimental/src/generated/engine.dart';
 import 'package:analyzer_experimental/src/generated/error.dart';
-import 'package:analyzer_experimental/src/generated/source_io.dart';
-import 'package:analyzer_experimental/src/generated/sdk.dart';
-import 'package:analyzer_experimental/src/generated/sdk_io.dart';
-import 'package:analyzer_experimental/src/generated/ast.dart';
-import 'package:analyzer_experimental/src/generated/element.dart';
 import 'package:analyzer_experimental/options.dart';
 
 import 'package:analyzer_experimental/src/analyzer_impl.dart';
diff --git a/pkg/analyzer_experimental/lib/src/analyzer_impl.dart b/pkg/analyzer_experimental/lib/src/analyzer_impl.dart
index 4e46d61..40b436c 100644
--- a/pkg/analyzer_experimental/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_experimental/lib/src/analyzer_impl.dart
@@ -4,7 +4,6 @@
 
 library analyzer_impl;
 
-import 'dart:async';
 import 'dart:io';
 
 import 'generated/java_io.dart';
@@ -13,7 +12,6 @@
 import 'generated/source_io.dart';
 import 'generated/sdk.dart';
 import 'generated/sdk_io.dart';
-import 'generated/ast.dart';
 import 'generated/element.dart';
 import '../options.dart';
 
diff --git a/pkg/analyzer_experimental/lib/src/error.dart b/pkg/analyzer_experimental/lib/src/error.dart
index d3df0e1..5deee45 100644
--- a/pkg/analyzer_experimental/lib/src/error.dart
+++ b/pkg/analyzer_experimental/lib/src/error.dart
@@ -4,7 +4,6 @@
 library error;
 
 import 'dart:collection';
-import 'dart:io';
 import 'dart:math' as math;
 
 import 'generated/error.dart';
diff --git a/pkg/analyzer_experimental/lib/src/error_formatter.dart b/pkg/analyzer_experimental/lib/src/error_formatter.dart
index fb4b10f..47d718d 100644
--- a/pkg/analyzer_experimental/lib/src/error_formatter.dart
+++ b/pkg/analyzer_experimental/lib/src/error_formatter.dart
@@ -4,17 +4,9 @@
 
 library error_formatter;
 
-import 'dart:async';
-import 'dart:io';
-
-import 'generated/java_io.dart';
 import 'generated/engine.dart';
 import 'generated/error.dart';
 import 'generated/source_io.dart';
-import 'generated/sdk.dart';
-import 'generated/sdk_io.dart';
-import 'generated/ast.dart';
-import 'generated/element.dart';
 import '../options.dart';
 
 /**
diff --git a/pkg/analyzer_experimental/lib/src/generated/ast.dart b/pkg/analyzer_experimental/lib/src/generated/ast.dart
index 42a3cc7..8fc097e 100644
--- a/pkg/analyzer_experimental/lib/src/generated/ast.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/ast.dart
@@ -51,8 +51,11 @@
   accept(ASTVisitor visitor);
 
   /**
-   * @return the [ASTNode] of given [Class] which is [ASTNode] itself, or one of
-   *         its parents.
+   * Return the node of the given class that most immediately encloses this node, or `null` if
+   * there is no enclosing node of the given class.
+   *
+   * @param nodeClass the class of the node to be returned
+   * @return the node of the given type that encloses this node
    */
   ASTNode getAncestor(Type enclosingClass) {
     ASTNode node = this;
@@ -946,7 +949,7 @@
    *
    * @param parameters the parameter elements corresponding to the arguments
    */
-  void set correspondingParameters(List<ParameterElement> parameters) {
+  void set correspondingPropagatedParameters(List<ParameterElement> parameters) {
     if (parameters.length != _arguments.length) {
       throw new IllegalArgumentException("Expected ${_arguments.length} parameters, not ${parameters.length}");
     }
@@ -996,7 +999,7 @@
    * element representing the parameter to which the value of the given expression will be bound.
    * Otherwise, return `null`.
    *
-   * This method is only intended to be used by [Expression#getParameterElement].
+   * This method is only intended to be used by [Expression#getPropagatedParameterElement].
    *
    * @param expression the expression corresponding to the parameter to be returned
    * @return the parameter element representing the parameter to which the value of the expression
@@ -1088,9 +1091,9 @@
   accept(ASTVisitor visitor) => visitor.visitAsExpression(this);
 
   /**
-   * Return the is operator being applied.
+   * Return the as operator being applied.
    *
-   * @return the is operator being applied
+   * @return the as operator being applied
    */
   Token get asOperator => _asOperator;
   Token get beginToken => _expression.beginToken;
@@ -1358,14 +1361,20 @@
   Token get beginToken => _leftHandSide.beginToken;
 
   /**
-   * Return the element associated with the operator based on the propagated type of the
-   * left-hand-side, or `null` if the AST structure has not been resolved, if the operator is
-   * not a compound operator, or if the operator could not be resolved. One example of the latter
-   * case is an operator that is not defined for the type of the left-hand operand.
+   * Return the best element available for this operator. If resolution was able to find a better
+   * element based on type propagation, that element will be returned. Otherwise, the element found
+   * using the result of static analysis will be returned. If resolution has not been performed,
+   * then `null` will be returned.
    *
-   * @return the element associated with the operator
+   * @return the best element available for this operator
    */
-  MethodElement get element => _propagatedElement;
+  MethodElement get bestElement {
+    MethodElement element = propagatedElement;
+    if (element == null) {
+      element = staticElement;
+    }
+    return element;
+  }
   Token get endToken => _rightHandSide.endToken;
 
   /**
@@ -1383,6 +1392,16 @@
   Token get operator => _operator;
 
   /**
+   * Return the element associated with the operator based on the propagated type of the
+   * left-hand-side, or `null` if the AST structure has not been resolved, if the operator is
+   * not a compound operator, or if the operator could not be resolved. One example of the latter
+   * case is an operator that is not defined for the type of the left-hand operand.
+   *
+   * @return the element associated with the operator
+   */
+  MethodElement get propagatedElement => _propagatedElement;
+
+  /**
    * Return the expression used to compute the right hand side.
    *
    * @return the expression used to compute the right hand side
@@ -1400,16 +1419,6 @@
   MethodElement get staticElement => _staticElement;
 
   /**
-   * Set the element associated with the operator based on the propagated type of the left-hand-side
-   * to the given element.
-   *
-   * @param element the element to be associated with the operator
-   */
-  void set element(MethodElement element2) {
-    _propagatedElement = element2;
-  }
-
-  /**
    * Return the expression used to compute the left hand side.
    *
    * @param expression the expression used to compute the left hand side
@@ -1428,6 +1437,16 @@
   }
 
   /**
+   * Set the element associated with the operator based on the propagated type of the left-hand-side
+   * to the given element.
+   *
+   * @param element the element to be associated with the operator
+   */
+  void set propagatedElement(MethodElement element) {
+    _propagatedElement = element;
+  }
+
+  /**
    * Set the expression used to compute the left hand side to the given expression.
    *
    * @param expression the expression used to compute the left hand side
@@ -1449,6 +1468,48 @@
     safelyVisitChild(_leftHandSide, visitor);
     safelyVisitChild(_rightHandSide, visitor);
   }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is known based on
+   * propagated type information, then return the parameter element representing the parameter to
+   * which the value of the right operand will be bound. Otherwise, return `null`.
+   *
+   * This method is only intended to be used by [Expression#getPropagatedParameterElement].
+   *
+   * @return the parameter element representing the parameter to which the value of the right
+   *         operand will be bound
+   */
+  ParameterElement get propagatedParameterElementForRightHandSide {
+    if (_propagatedElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = _propagatedElement.parameters;
+    if (parameters.length < 1) {
+      return null;
+    }
+    return parameters[0];
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is known based on static
+   * type information, then return the parameter element representing the parameter to which the
+   * value of the right operand will be bound. Otherwise, return `null`.
+   *
+   * This method is only intended to be used by [Expression#getStaticParameterElement].
+   *
+   * @return the parameter element representing the parameter to which the value of the right
+   *         operand will be bound
+   */
+  ParameterElement get staticParameterElementForRightHandSide {
+    if (_staticElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = _staticElement.parameters;
+    if (parameters.length < 1) {
+      return null;
+    }
+    return parameters[0];
+  }
 }
 /**
  * Instances of the class `BinaryExpression` represent a binary (infix) expression.
@@ -1516,14 +1577,20 @@
   Token get beginToken => _leftOperand.beginToken;
 
   /**
-   * Return the element associated with the operator based on the propagated type of the left
-   * operand, or `null` if the AST structure has not been resolved, if the operator is not
-   * user definable, or if the operator could not be resolved. One example of the latter case is an
-   * operator that is not defined for the type of the left-hand operand.
+   * Return the best element available for this operator. If resolution was able to find a better
+   * element based on type propagation, that element will be returned. Otherwise, the element found
+   * using the result of static analysis will be returned. If resolution has not been performed,
+   * then `null` will be returned.
    *
-   * @return the element associated with the operator
+   * @return the best element available for this operator
    */
-  MethodElement get element => _propagatedElement;
+  MethodElement get bestElement {
+    MethodElement element = propagatedElement;
+    if (element == null) {
+      element = staticElement;
+    }
+    return element;
+  }
   Token get endToken => _rightOperand.endToken;
 
   /**
@@ -1541,6 +1608,16 @@
   Token get operator => _operator;
 
   /**
+   * Return the element associated with the operator based on the propagated type of the left
+   * operand, or `null` if the AST structure has not been resolved, if the operator is not
+   * user definable, or if the operator could not be resolved. One example of the latter case is an
+   * operator that is not defined for the type of the left-hand operand.
+   *
+   * @return the element associated with the operator
+   */
+  MethodElement get propagatedElement => _propagatedElement;
+
+  /**
    * Return the expression used to compute the right operand.
    *
    * @return the expression used to compute the right operand
@@ -1558,16 +1635,6 @@
   MethodElement get staticElement => _staticElement;
 
   /**
-   * Set the element associated with the operator based on the propagated type of the left operand
-   * to the given element.
-   *
-   * @param element the element to be associated with the operator
-   */
-  void set element(MethodElement element2) {
-    _propagatedElement = element2;
-  }
-
-  /**
    * Set the expression used to compute the left operand to the given expression.
    *
    * @param expression the expression used to compute the left operand
@@ -1586,6 +1653,16 @@
   }
 
   /**
+   * Set the element associated with the operator based on the propagated type of the left operand
+   * to the given element.
+   *
+   * @param element the element to be associated with the operator
+   */
+  void set propagatedElement(MethodElement element) {
+    _propagatedElement = element;
+  }
+
+  /**
    * Set the expression used to compute the right operand to the given expression.
    *
    * @param expression the expression used to compute the right operand
@@ -1613,7 +1690,7 @@
    * propagated type information, then return the parameter element representing the parameter to
    * which the value of the right operand will be bound. Otherwise, return `null`.
    *
-   * This method is only intended to be used by [Expression#getParameterElement].
+   * This method is only intended to be used by [Expression#getPropagatedParameterElement].
    *
    * @return the parameter element representing the parameter to which the value of the right
    *         operand will be bound
@@ -2108,12 +2185,14 @@
   SimpleIdentifier _exceptionParameter;
 
   /**
-   * The comma separating the exception parameter from the stack trace parameter.
+   * The comma separating the exception parameter from the stack trace parameter, or `null` if
+   * there is no stack trace parameter.
    */
   Token _comma;
 
   /**
-   * The parameter whose value will be the stack trace associated with the exception.
+   * The parameter whose value will be the stack trace associated with the exception, or
+   * `null` if there is no stack trace parameter.
    */
   SimpleIdentifier _stackTraceParameter;
 
@@ -2190,7 +2269,7 @@
   Token get catchKeyword => _catchKeyword;
 
   /**
-   * Return the comma.
+   * Return the comma, or `null` if there is no stack trace parameter.
    *
    * @return the comma
    */
@@ -2234,7 +2313,8 @@
   Token get rightParenthesis => _rightParenthesis;
 
   /**
-   * Return the parameter whose value will be the stack trace associated with the exception.
+   * Return the parameter whose value will be the stack trace associated with the exception, or
+   * `null` if there is no stack trace parameter.
    *
    * @return the parameter whose value will be the stack trace associated with the exception
    */
@@ -2629,6 +2709,7 @@
     safelyVisitChild(_extendsClause, visitor);
     safelyVisitChild(_withClause, visitor);
     safelyVisitChild(_implementsClause, visitor);
+    safelyVisitChild(_nativeClause, visitor);
     members.accept(visitor);
   }
   Token get firstTokenAfterCommentAndMetadata {
@@ -3077,7 +3158,7 @@
  * The enumeration `CommentType` encodes all the different types of comments that are
  * recognized by the parser.
  */
-class CommentType implements Comparable<CommentType> {
+class CommentType implements Enum<CommentType> {
 
   /**
    * An end-of-line comment.
@@ -3247,7 +3328,7 @@
   CompilationUnitElement _element;
 
   /**
-   * The [LineInfo] for this [CompilationUnit].
+   * The line information for this compilation unit.
    */
   LineInfo _lineInfo;
 
@@ -3317,11 +3398,10 @@
   Token get endToken => _endToken;
 
   /**
-   * Return an array containing all of the errors associated with the receiver. If the receiver has
-   * not been resolved, then return `null`.
+   * Return an array containing all of the errors associated with the receiver. The array will be
+   * empty if the receiver has not been resolved and there were no parse errors.
    *
-   * @return an array of errors (contains no `null`s) or `null` if the receiver has not
-   *         been resolved
+   * @return the errors associated with the receiver
    */
   List<AnalysisError> get errors {
     List<AnalysisError> parserErrors = parsingErrors;
@@ -3346,9 +3426,9 @@
   }
 
   /**
-   * Get the [LineInfo] object for this compilation unit.
+   * Return the line information for this compilation unit.
    *
-   * @return the associated [LineInfo]
+   * @return the line information for this compilation unit
    */
   LineInfo get lineInfo => _lineInfo;
   int get offset => 0;
@@ -3356,16 +3436,15 @@
   /**
    * Return an array containing all of the parsing errors associated with the receiver.
    *
-   * @return an array of errors (not `null`, contains no `null`s).
+   * @return the parsing errors associated with the receiver
    */
   List<AnalysisError> get parsingErrors => _parsingErrors;
 
   /**
-   * Return an array containing all of the resolution errors associated with the receiver. If the
-   * receiver has not been resolved, then return `null`.
+   * Return an array containing all of the resolution errors associated with the receiver. The array
+   * will be empty if the receiver has not been resolved.
    *
-   * @return an array of errors (contains no `null`s) or `null` if the receiver has not
-   *         been resolved
+   * @return the resolution errors associated with the receiver
    */
   List<AnalysisError> get resolutionErrors => _resolutionErrors;
 
@@ -3387,29 +3466,27 @@
   }
 
   /**
-   * Set the [LineInfo] object for this compilation unit.
+   * Set the line information for this compilation unit to the given line information.
    *
-   * @param errors LineInfo to associate with this compilation unit
+   * @param errors the line information to associate with this compilation unit
    */
   void set lineInfo(LineInfo lineInfo2) {
     this._lineInfo = lineInfo2;
   }
 
   /**
-   * Called to cache the parsing errors when the unit is parsed.
+   * Set the parse errors associated with this compilation unit to the given errors.
    *
-   * @param errors an array of parsing errors, if `null` is passed, the error array is set to
-   *          an empty array, [AnalysisError#NO_ERRORS]
+   * @param the parse errors to be associated with this compilation unit
    */
   void set parsingErrors(List<AnalysisError> errors) {
     _parsingErrors = errors == null ? AnalysisError.NO_ERRORS : errors;
   }
 
   /**
-   * Called to cache the resolution errors when the unit is resolved.
+   * Set the resolution errors associated with this compilation unit to the given errors.
    *
-   * @param errors an array of resolution errors, if `null` is passed, the error array is set
-   *          to an empty array, [AnalysisError#NO_ERRORS]
+   * @param the resolution errors to be associated with this compilation unit
    */
   void set resolutionErrors(List<AnalysisError> errors) {
     _resolutionErrors = errors == null ? AnalysisError.NO_ERRORS : errors;
@@ -3721,19 +3798,13 @@
   SimpleIdentifier _name;
 
   /**
-   * The element associated with this constructor, or `null` if the AST structure has not been
-   * resolved or if this constructor could not be resolved.
-   */
-  ConstructorElement _element;
-
-  /**
    * The parameters associated with the constructor.
    */
   FormalParameterList _parameters;
 
   /**
-   * The token for the separator (colon or equals) before the initializers, or `null` if there
-   * are no initializers.
+   * The token for the separator (colon or equals) before the initializer list or redirection, or
+   * `null` if there are no initializers.
    */
   Token _separator;
 
@@ -3754,6 +3825,12 @@
   FunctionBody _body;
 
   /**
+   * The element associated with this constructor, or `null` if the AST structure has not been
+   * resolved or if this constructor could not be resolved.
+   */
+  ConstructorElement _element;
+
+  /**
    * Initialize a newly created constructor declaration.
    *
    * @param externalKeyword the token for the 'external' keyword
@@ -3893,10 +3970,10 @@
   Identifier get returnType => _returnType;
 
   /**
-   * Return the token for the separator (colon or equals) before the initializers, or `null`
-   * if there are no initializers.
+   * Return the token for the separator (colon or equals) before the initializer list or
+   * redirection, or `null` if there are no initializers.
    *
-   * @return the token for the separator (colon or equals) before the initializers
+   * @return the token for the separator before the initializer list or redirection
    */
   Token get separator => _separator;
 
@@ -4585,7 +4662,8 @@
   SimpleIdentifier get identifier => _identifier;
 
   /**
-   * Return the token representing either the 'final', 'const' or 'var' keyword.
+   * Return the token representing either the 'final', 'const' or 'var' keyword, or `null` if
+   * no keyword was used.
    *
    * @return the token representing either the 'final', 'const' or 'var' keyword
    */
@@ -5328,6 +5406,23 @@
   Type2 _propagatedType;
 
   /**
+   * Return the best type information available for this expression. If type propagation was able to
+   * find a better type than static analysis, that type will be returned. Otherwise, the result of
+   * static analysis will be returned. If no type analysis has been performed, then the type
+   * 'dynamic' will be returned.
+   *
+   * @return the best type information available for this expression
+   */
+  Type2 get bestType {
+    if (_propagatedType != null) {
+      return _propagatedType;
+    } else if (_staticType != null) {
+      return _staticType;
+    }
+    return DynamicTypeImpl.instance;
+  }
+
+  /**
    * If this expression is an argument to an invocation, and the AST structure has been resolved,
    * and the function being invoked is known based on propagated type information, and this
    * expression corresponds to one of the parameters of the function being invoked, then return the
@@ -5337,7 +5432,7 @@
    * @return the parameter element representing the parameter to which the value of this expression
    *         will be bound
    */
-  ParameterElement get parameterElement {
+  ParameterElement get propagatedParameterElement {
     ASTNode parent = this.parent;
     if (parent is ArgumentList) {
       return ((parent as ArgumentList)).getPropagatedParameterElementFor(this);
@@ -5351,6 +5446,11 @@
       if (identical(binaryExpression.rightOperand, this)) {
         return binaryExpression.propagatedParameterElementForRightOperand;
       }
+    } else if (parent is AssignmentExpression) {
+      AssignmentExpression assignmentExpression = parent as AssignmentExpression;
+      if (identical(assignmentExpression.rightHandSide, this)) {
+        return assignmentExpression.propagatedParameterElementForRightHandSide;
+      }
     } else if (parent is PrefixExpression) {
       return ((parent as PrefixExpression)).propagatedParameterElementForOperand;
     } else if (parent is PostfixExpression) {
@@ -5391,6 +5491,11 @@
       if (identical(binaryExpression.rightOperand, this)) {
         return binaryExpression.staticParameterElementForRightOperand;
       }
+    } else if (parent is AssignmentExpression) {
+      AssignmentExpression assignmentExpression = parent as AssignmentExpression;
+      if (identical(assignmentExpression.rightHandSide, this)) {
+        return assignmentExpression.staticParameterElementForRightHandSide;
+      }
     } else if (parent is PrefixExpression) {
       return ((parent as PrefixExpression)).staticParameterElementForOperand;
     } else if (parent is PostfixExpression) {
@@ -5564,7 +5669,7 @@
 
   /**
    * The semicolon terminating the statement, or `null` if the expression is a function
-   * expression and isn't followed by a semicolon.
+   * expression and therefore isn't followed by a semicolon.
    */
   Token _semicolon;
 
@@ -5603,7 +5708,8 @@
   Expression get expression => _expression;
 
   /**
-   * Return the semicolon terminating the statement.
+   * Return the semicolon terminating the statement, or `null` if the expression is a function
+   * expression and therefore isn't followed by a semicolon.
    *
    * @return the semicolon terminating the statement
    */
@@ -5869,7 +5975,8 @@
   Token _period;
 
   /**
-   * The parameters of the function-typed parameter.
+   * The parameters of the function-typed parameter, or `null` if this is not a function-typed
+   * field formal parameter.
    */
   FormalParameterList _parameters;
 
@@ -5920,7 +6027,8 @@
   Token get endToken => identifier.endToken;
 
   /**
-   * Return the token representing either the 'final', 'const' or 'var' keyword.
+   * Return the token representing either the 'final', 'const' or 'var' keyword, or `null` if
+   * no keyword was used.
    *
    * @return the token representing either the 'final', 'const' or 'var' keyword
    */
@@ -6258,7 +6366,8 @@
   Token _leftSeparator;
 
   /**
-   * The condition used to determine when to terminate the loop.
+   * The condition used to determine when to terminate the loop, or `null` if there is no
+   * condition.
    */
   Expression _condition;
 
@@ -6336,7 +6445,8 @@
   Statement get body => _body;
 
   /**
-   * Return the condition used to determine when to terminate the loop.
+   * Return the condition used to determine when to terminate the loop, or `null` if there is
+   * no condition.
    *
    * @return the condition used to determine when to terminate the loop
    */
@@ -6590,12 +6700,14 @@
   NodeList<FormalParameter> _parameters;
 
   /**
-   * The left square bracket ('[') or left curly brace ('{') introducing the optional parameters.
+   * The left square bracket ('[') or left curly brace ('{') introducing the optional parameters, or
+   * `null` if there are no optional parameters.
    */
   Token _leftDelimiter;
 
   /**
-   * The right square bracket (']') or right curly brace ('}') introducing the optional parameters.
+   * The right square bracket (']') or right curly brace ('}') introducing the optional parameters,
+   * or `null` if there are no optional parameters.
    */
   Token _rightDelimiter;
 
@@ -6634,26 +6746,11 @@
   FormalParameterList({Token leftParenthesis, List<FormalParameter> parameters, Token leftDelimiter, Token rightDelimiter, Token rightParenthesis}) : this.full(leftParenthesis, parameters, leftDelimiter, rightDelimiter, rightParenthesis);
   accept(ASTVisitor visitor) => visitor.visitFormalParameterList(this);
   Token get beginToken => _leftParenthesis;
-
-  /**
-   * Return an array containing the elements representing the parameters in this list. The array
-   * will contain `null`s if the parameters in this list have not been resolved.
-   *
-   * @return the elements representing the parameters in this list
-   */
-  List<ParameterElement> get elements {
-    int count = _parameters.length;
-    List<ParameterElement> types = new List<ParameterElement>(count);
-    for (int i = 0; i < count; i++) {
-      types[i] = _parameters[i].element;
-    }
-    return types;
-  }
   Token get endToken => _rightParenthesis;
 
   /**
    * Return the left square bracket ('[') or left curly brace ('{') introducing the optional
-   * parameters.
+   * parameters, or `null` if there are no optional parameters.
    *
    * @return the left square bracket ('[') or left curly brace ('{') introducing the optional
    *         parameters
@@ -6668,6 +6765,21 @@
   Token get leftParenthesis => _leftParenthesis;
 
   /**
+   * Return an array containing the elements representing the parameters in this list. The array
+   * will contain `null`s if the parameters in this list have not been resolved.
+   *
+   * @return the elements representing the parameters in this list
+   */
+  List<ParameterElement> get parameterElements {
+    int count = _parameters.length;
+    List<ParameterElement> types = new List<ParameterElement>(count);
+    for (int i = 0; i < count; i++) {
+      types[i] = _parameters[i].element;
+    }
+    return types;
+  }
+
+  /**
    * Return the parameters associated with the method.
    *
    * @return the parameters associated with the method
@@ -6676,7 +6788,7 @@
 
   /**
    * Return the right square bracket (']') or right curly brace ('}') introducing the optional
-   * parameters.
+   * parameters, or `null` if there are no optional parameters.
    *
    * @return the right square bracket (']') or right curly brace ('}') introducing the optional
    *         parameters
@@ -7174,14 +7286,20 @@
   Token get beginToken => _function.beginToken;
 
   /**
-   * Return the element associated with the function being invoked based on propagated type
-   * information, or `null` if the AST structure has not been resolved or the function could
-   * not be resolved. One common example of the latter case is an expression whose value can change
-   * over time.
+   * Return the best element available for the function being invoked. If resolution was able to
+   * find a better element based on type propagation, that element will be returned. Otherwise, the
+   * element found using the result of static analysis will be returned. If resolution has not been
+   * performed, then `null` will be returned.
    *
-   * @return the element associated with the function being invoked
+   * @return the best element available for this function
    */
-  ExecutableElement get element => _propagatedElement;
+  ExecutableElement get bestElement {
+    ExecutableElement element = propagatedElement;
+    if (element == null) {
+      element = staticElement;
+    }
+    return element;
+  }
   Token get endToken => _argumentList.endToken;
 
   /**
@@ -7192,6 +7310,16 @@
   Expression get function => _function;
 
   /**
+   * Return the element associated with the function being invoked based on propagated type
+   * information, or `null` if the AST structure has not been resolved or the function could
+   * not be resolved. One common example of the latter case is an expression whose value can change
+   * over time.
+   *
+   * @return the element associated with the function being invoked
+   */
+  ExecutableElement get propagatedElement => _propagatedElement;
+
+  /**
    * Return the element associated with the function being invoked based on static type information,
    * or `null` if the AST structure has not been resolved or the function could not be
    * resolved. One common example of the latter case is an expression whose value can change over
@@ -7211,16 +7339,6 @@
   }
 
   /**
-   * Set the element associated with the function being invoked based on propagated type information
-   * to the given element.
-   *
-   * @param element the element to be associated with the function being invoked
-   */
-  void set element(ExecutableElement element2) {
-    _propagatedElement = element2;
-  }
-
-  /**
    * Set the expression producing the function being invoked to the given expression.
    *
    * @param function the expression producing the function being invoked
@@ -7230,6 +7348,16 @@
   }
 
   /**
+   * Set the element associated with the function being invoked based on propagated type information
+   * to the given element.
+   *
+   * @param element the element to be associated with the function being invoked
+   */
+  void set propagatedElement(ExecutableElement element) {
+    _propagatedElement = element;
+  }
+
+  /**
    * Set the element associated with the function being invoked based on static type information to
    * the given element.
    *
@@ -7625,7 +7753,7 @@
   Statement _thenStatement;
 
   /**
-   * The token representing the 'else' keyword.
+   * The token representing the 'else' keyword, or `null` if there is no else statement.
    */
   Token _elseKeyword;
 
@@ -7679,7 +7807,8 @@
   Expression get condition => _condition;
 
   /**
-   * Return the token representing the 'else' keyword.
+   * Return the token representing the 'else' keyword, or `null` if there is no else
+   * statement.
    *
    * @return the token representing the 'else' keyword
    */
@@ -8074,15 +8203,6 @@
    */
   IndexExpression.forCascade({Token period, Token leftBracket, Expression index, Token rightBracket}) : this.forCascade_full(period, leftBracket, index, rightBracket);
   accept(ASTVisitor visitor) => visitor.visitIndexExpression(this);
-
-  /**
-   * Return the expression used to compute the object being indexed, or `null` if this index
-   * expression is part of a cascade expression.
-   *
-   * @return the expression used to compute the object being indexed
-   * @see #getRealTarget()
-   */
-  Expression get array => _target;
   Token get beginToken {
     if (_target != null) {
       return _target.beginToken;
@@ -8091,14 +8211,20 @@
   }
 
   /**
-   * Return the element associated with the operator based on the propagated type of the target, or
-   * `null` if the AST structure has not been resolved or if the operator could not be
-   * resolved. One example of the latter case is an operator that is not defined for the type of the
-   * target.
+   * Return the best element available for this operator. If resolution was able to find a better
+   * element based on type propagation, that element will be returned. Otherwise, the element found
+   * using the result of static analysis will be returned. If resolution has not been performed,
+   * then `null` will be returned.
    *
-   * @return the element associated with this operator
+   * @return the best element available for this operator
    */
-  MethodElement get element => _propagatedElement;
+  MethodElement get bestElement {
+    MethodElement element = propagatedElement;
+    if (element == null) {
+      element = staticElement;
+    }
+    return element;
+  }
   Token get endToken => _rightBracket;
 
   /**
@@ -8124,13 +8250,23 @@
   Token get period => _period;
 
   /**
+   * Return the element associated with the operator based on the propagated type of the target, or
+   * `null` if the AST structure has not been resolved or if the operator could not be
+   * resolved. One example of the latter case is an operator that is not defined for the type of the
+   * target.
+   *
+   * @return the element associated with this operator
+   */
+  MethodElement get propagatedElement => _propagatedElement;
+
+  /**
    * Return the expression used to compute the object being indexed. If this index expression is not
-   * part of a cascade expression, then this is the same as [getArray]. If this index
+   * part of a cascade expression, then this is the same as [getTarget]. If this index
    * expression is part of a cascade expression, then the target expression stored with the cascade
    * expression is returned.
    *
    * @return the expression used to compute the object being indexed
-   * @see #getArray()
+   * @see #getTarget()
    */
   Expression get realTarget {
     if (isCascaded) {
@@ -8164,6 +8300,15 @@
   MethodElement get staticElement => _staticElement;
 
   /**
+   * Return the expression used to compute the object being indexed, or `null` if this index
+   * expression is part of a cascade expression.
+   *
+   * @return the expression used to compute the object being indexed
+   * @see #getRealTarget()
+   */
+  Expression get target => _target;
+
+  /**
    * Return `true` if this expression is computing a right-hand value.
    *
    * Note that [inGetterContext] and [inSetterContext] are not opposites, nor are
@@ -8216,25 +8361,6 @@
   bool get isCascaded => _period != null;
 
   /**
-   * Set the expression used to compute the object being indexed to the given expression.
-   *
-   * @param expression the expression used to compute the object being indexed
-   */
-  void set array(Expression expression) {
-    _target = becomeParentOf(expression);
-  }
-
-  /**
-   * Set the element associated with the operator based on the propagated type of the target to the
-   * given element.
-   *
-   * @param element the element to be associated with this operator
-   */
-  void set element(MethodElement element2) {
-    _propagatedElement = element2;
-  }
-
-  /**
    * Set the expression used to compute the index to the given expression.
    *
    * @param expression the expression used to compute the index
@@ -8262,6 +8388,16 @@
   }
 
   /**
+   * Set the element associated with the operator based on the propagated type of the target to the
+   * given element.
+   *
+   * @param element the element to be associated with this operator
+   */
+  void set propagatedElement(MethodElement element) {
+    _propagatedElement = element;
+  }
+
+  /**
    * Set the right square bracket to the given token.
    *
    * @param bracket the right square bracket
@@ -8279,6 +8415,15 @@
   void set staticElement(MethodElement element) {
     _staticElement = element;
   }
+
+  /**
+   * Set the expression used to compute the object being indexed to the given expression.
+   *
+   * @param expression the expression used to compute the object being indexed
+   */
+  void set target(Expression expression) {
+    _target = becomeParentOf(expression);
+  }
   void visitChildren(ASTVisitor<Object> visitor) {
     safelyVisitChild(_target, visitor);
     safelyVisitChild(_index, visitor);
@@ -8289,7 +8434,7 @@
    * propagated type information, then return the parameter element representing the parameter to
    * which the value of the index expression will be bound. Otherwise, return `null`.
    *
-   * This method is only intended to be used by [Expression#getParameterElement].
+   * This method is only intended to be used by [Expression#getPropagatedParameterElement].
    *
    * @return the parameter element representing the parameter to which the value of the index
    *         expression will be bound
@@ -10313,7 +10458,9 @@
   Token get keyword => _keyword;
 
   /**
-   * @return the name of the native object that implements the class.
+   * Return the name of the native object that implements the class.
+   *
+   * @return the name of the native object that implements the class
    */
   StringLiteral get name => _name;
 
@@ -10983,14 +11130,20 @@
   Token get beginToken => _operand.beginToken;
 
   /**
-   * Return the element associated with the operator based on the propagated type of the operand, or
-   * `null` if the AST structure has not been resolved, if the operator is not user definable,
-   * or if the operator could not be resolved. One example of the latter case is an operator that is
-   * not defined for the type of the operand.
+   * Return the best element available for this operator. If resolution was able to find a better
+   * element based on type propagation, that element will be returned. Otherwise, the element found
+   * using the result of static analysis will be returned. If resolution has not been performed,
+   * then `null` will be returned.
    *
-   * @return the element associated with the operator
+   * @return the best element available for this operator
    */
-  MethodElement get element => _propagatedElement;
+  MethodElement get bestElement {
+    MethodElement element = propagatedElement;
+    if (element == null) {
+      element = staticElement;
+    }
+    return element;
+  }
   Token get endToken => _operator;
 
   /**
@@ -11008,6 +11161,16 @@
   Token get operator => _operator;
 
   /**
+   * Return the element associated with the operator based on the propagated type of the operand, or
+   * `null` if the AST structure has not been resolved, if the operator is not user definable,
+   * or if the operator could not be resolved. One example of the latter case is an operator that is
+   * not defined for the type of the operand.
+   *
+   * @return the element associated with the operator
+   */
+  MethodElement get propagatedElement => _propagatedElement;
+
+  /**
    * Return the element associated with the operator based on the static type of the operand, or
    * `null` if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved. One example of the latter case is an operator that is
@@ -11018,16 +11181,6 @@
   MethodElement get staticElement => _staticElement;
 
   /**
-   * Set the element associated with the operator based on the propagated type of the operand to the
-   * given element.
-   *
-   * @param element the element to be associated with the operator
-   */
-  void set element(MethodElement element2) {
-    _propagatedElement = element2;
-  }
-
-  /**
    * Set the expression computing the operand for the operator to the given expression.
    *
    * @param expression the expression computing the operand for the operator
@@ -11046,6 +11199,16 @@
   }
 
   /**
+   * Set the element associated with the operator based on the propagated type of the operand to the
+   * given element.
+   *
+   * @param element the element to be associated with the operator
+   */
+  void set propagatedElement(MethodElement element) {
+    _propagatedElement = element;
+  }
+
+  /**
    * Set the element associated with the operator based on the static type of the operand to the
    * given element.
    *
@@ -11063,7 +11226,7 @@
    * propagated type information, then return the parameter element representing the parameter to
    * which the value of the operand will be bound. Otherwise, return `null`.
    *
-   * This method is only intended to be used by [Expression#getParameterElement].
+   * This method is only intended to be used by [Expression#getPropagatedParameterElement].
    *
    * @return the parameter element representing the parameter to which the value of the right
    *         operand will be bound
@@ -11158,14 +11321,20 @@
   Token get beginToken => _operator;
 
   /**
-   * Return the element associated with the operator based on the propagated type of the operand, or
-   * `null` if the AST structure has not been resolved, if the operator is not user definable,
-   * or if the operator could not be resolved. One example of the latter case is an operator that is
-   * not defined for the type of the operand.
+   * Return the best element available for this operator. If resolution was able to find a better
+   * element based on type propagation, that element will be returned. Otherwise, the element found
+   * using the result of static analysis will be returned. If resolution has not been performed,
+   * then `null` will be returned.
    *
-   * @return the element associated with the operator
+   * @return the best element available for this operator
    */
-  MethodElement get element => _propagatedElement;
+  MethodElement get bestElement {
+    MethodElement element = propagatedElement;
+    if (element == null) {
+      element = staticElement;
+    }
+    return element;
+  }
   Token get endToken => _operand.endToken;
 
   /**
@@ -11183,6 +11352,16 @@
   Token get operator => _operator;
 
   /**
+   * Return the element associated with the operator based on the propagated type of the operand, or
+   * `null` if the AST structure has not been resolved, if the operator is not user definable,
+   * or if the operator could not be resolved. One example of the latter case is an operator that is
+   * not defined for the type of the operand.
+   *
+   * @return the element associated with the operator
+   */
+  MethodElement get propagatedElement => _propagatedElement;
+
+  /**
    * Return the element associated with the operator based on the static type of the operand, or
    * `null` if the AST structure has not been resolved, if the operator is not user definable,
    * or if the operator could not be resolved. One example of the latter case is an operator that is
@@ -11193,16 +11372,6 @@
   MethodElement get staticElement => _staticElement;
 
   /**
-   * Set the element associated with the operator based on the propagated type of the operand to the
-   * given element.
-   *
-   * @param element the element to be associated with the operator
-   */
-  void set element(MethodElement element2) {
-    _propagatedElement = element2;
-  }
-
-  /**
    * Set the expression computing the operand for the operator to the given expression.
    *
    * @param expression the expression computing the operand for the operator
@@ -11221,6 +11390,16 @@
   }
 
   /**
+   * Set the element associated with the operator based on the propagated type of the operand to the
+   * given element.
+   *
+   * @param element the element to be associated with the operator
+   */
+  void set propagatedElement(MethodElement element) {
+    _propagatedElement = element;
+  }
+
+  /**
    * Set the element associated with the operator based on the static type of the operand to the
    * given element.
    *
@@ -11238,7 +11417,7 @@
    * propagated type information, then return the parameter element representing the parameter to
    * which the value of the operand will be bound. Otherwise, return `null`.
    *
-   * This method is only intended to be used by [Expression#getParameterElement].
+   * This method is only intended to be used by [Expression#getPropagatedParameterElement].
    *
    * @return the parameter element representing the parameter to which the value of the right
    *         operand will be bound
@@ -13191,7 +13370,7 @@
  *
  * <pre>
  * symbolLiteral ::=
- *     '#' [SimpleIdentifier] ('.' [SimpleIdentifier])*
+ *     '#' (operator | (identifier ('.' identifier)*))
  * </pre>
  *
  * @coverage dart.engine.ast
@@ -13206,7 +13385,7 @@
   /**
    * The components of the literal.
    */
-  NodeList<SimpleIdentifier> _components;
+  List<Token> _components;
 
   /**
    * Initialize a newly created symbol literal.
@@ -13214,10 +13393,9 @@
    * @param poundSign the token introducing the literal
    * @param components the components of the literal
    */
-  SymbolLiteral.full(Token poundSign, List<SimpleIdentifier> components) {
-    this._components = new NodeList<SimpleIdentifier>(this);
+  SymbolLiteral.full(Token poundSign, List<Token> components) {
     this._poundSign = poundSign;
-    this._components.addAll(components);
+    this._components = components;
   }
 
   /**
@@ -13226,7 +13404,7 @@
    * @param poundSign the token introducing the literal
    * @param components the components of the literal
    */
-  SymbolLiteral({Token poundSign, List<SimpleIdentifier> components}) : this.full(poundSign, components);
+  SymbolLiteral({Token poundSign, List<Token> components}) : this.full(poundSign, components);
   accept(ASTVisitor visitor) => visitor.visitSymbolLiteral(this);
   Token get beginToken => _poundSign;
 
@@ -13235,8 +13413,8 @@
    *
    * @return the components of the literal
    */
-  NodeList<SimpleIdentifier> get components => _components;
-  Token get endToken => _components.endToken;
+  List<Token> get components => _components;
+  Token get endToken => _components[_components.length - 1];
 
   /**
    * Return the token introducing the literal.
@@ -13254,7 +13432,6 @@
     this._poundSign = poundSign2;
   }
   void visitChildren(ASTVisitor<Object> visitor) {
-    _components.accept(visitor);
   }
 }
 /**
@@ -14004,9 +14181,10 @@
   }
 
   /**
-   * Return the token representing the 'assert' keyword.
+   * Return the token representing the 'extends' keyword, or `null` if there was no explicit
+   * upper bound.
    *
-   * @return the token representing the 'assert' keyword
+   * @return the token representing the 'extends' keyword
    */
   Token get keyword => _keyword;
 
@@ -14027,9 +14205,9 @@
   }
 
   /**
-   * Set the token representing the 'assert' keyword to the given token.
+   * Set the token representing the 'extends' keyword to the given token.
    *
-   * @param keyword the token representing the 'assert' keyword
+   * @param keyword the token representing the 'extends' keyword
    */
   void set keyword(Token keyword2) {
     this._keyword = keyword2;
@@ -14881,16 +15059,35 @@
  * visitor uses a breadth-first ordering rather than the depth-first ordering of
  * [GeneralizingASTVisitor].
  *
+ * Subclasses that override a visit method must either invoke the overridden visit method or
+ * explicitly invoke the more general visit method. Failure to do so will cause the visit methods
+ * for superclasses of the node to not be invoked and will cause the children of the visited node to
+ * not be visited.
+ *
+ * In addition, subclasses should <b>not</b> explicitly visit the children of a node, but should
+ * ensure that the method [visitNode] is used to visit the children (either directly
+ * or indirectly). Failure to do will break the order in which nodes are visited.
+ *
  * @coverage dart.engine.ast
  */
 class BreadthFirstVisitor<R> extends GeneralizingASTVisitor<R> {
+
+  /**
+   * A queue holding the nodes that have not yet been visited in the order in which they ought to be
+   * visited.
+   */
   Queue<ASTNode> _queue = new Queue<ASTNode>();
+
+  /**
+   * A visitor, used to visit the children of the current node, that will add the nodes it visits to
+   * the [queue].
+   */
   GeneralizingASTVisitor<Object> _childVisitor;
 
   /**
-   * Visit all nodes in the tree starting at the given `root` node, in depth-first order.
+   * Visit all nodes in the tree starting at the given `root` node, in breadth-first order.
    *
-   * @param root the root of the ASTNode tree
+   * @param root the root of the AST structure to be visited
    */
   void visitAllNodes(ASTNode root) {
     _queue.add(root);
@@ -15189,11 +15386,11 @@
   }
   Object visitSymbolLiteral(SymbolLiteral node) {
     JavaStringBuilder builder = new JavaStringBuilder();
-    for (SimpleIdentifier component in node.components) {
+    for (Token component in node.components) {
       if (builder.length > 0) {
         builder.appendChar(0x2E);
       }
-      builder.append(component.name);
+      builder.append(component.lexeme);
     }
     return builder.toString();
   }
@@ -15236,7 +15433,8 @@
  * Visitor that maps nodes to elements.
  */
 class ElementLocator_ElementMapper extends GeneralizingASTVisitor<Element> {
-  Element visitBinaryExpression(BinaryExpression node) => node.element;
+  Element visitAssignmentExpression(AssignmentExpression node) => node.bestElement;
+  Element visitBinaryExpression(BinaryExpression node) => node.bestElement;
   Element visitClassDeclaration(ClassDeclaration node) => node.element;
   Element visitCompilationUnit(CompilationUnit node) => node.element;
   Element visitConstructorDeclaration(ConstructorDeclaration node) => node.element;
@@ -15266,17 +15464,21 @@
         }
       }
     }
-    return node.element;
+    Element element = node.element;
+    if (element == null) {
+      element = node.staticElement;
+    }
+    return element;
   }
   Element visitImportDirective(ImportDirective node) => node.element;
-  Element visitIndexExpression(IndexExpression node) => node.element;
+  Element visitIndexExpression(IndexExpression node) => node.bestElement;
   Element visitInstanceCreationExpression(InstanceCreationExpression node) => node.element;
   Element visitLibraryDirective(LibraryDirective node) => node.element;
   Element visitMethodDeclaration(MethodDeclaration node) => node.element;
   Element visitMethodInvocation(MethodInvocation node) => node.methodName.element;
-  Element visitPostfixExpression(PostfixExpression node) => node.element;
+  Element visitPostfixExpression(PostfixExpression node) => node.bestElement;
   Element visitPrefixedIdentifier(PrefixedIdentifier node) => node.element;
-  Element visitPrefixExpression(PrefixExpression node) => node.element;
+  Element visitPrefixExpression(PrefixExpression node) => node.bestElement;
   Element visitStringLiteral(StringLiteral node) {
     ASTNode parent = node.parent;
     if (parent is UriBasedDirective) {
@@ -16461,7 +16663,7 @@
     if (node.isCascaded) {
       _writer.print("..");
     } else {
-      visit(node.array);
+      visit(node.target);
     }
     _writer.print('[');
     visit(node.index);
@@ -16720,7 +16922,13 @@
   }
   Object visitSymbolLiteral(SymbolLiteral node) {
     _writer.print("#");
-    visitList2(node.components, ".");
+    List<Token> components = node.components;
+    for (int i = 0; i < components.length; i++) {
+      if (i > 0) {
+        _writer.print(".");
+      }
+      _writer.print(components[i].lexeme);
+    }
     return null;
   }
   Object visitThisExpression(ThisExpression node) {
@@ -17004,7 +17212,7 @@
   IndexExpression visitIndexExpression(IndexExpression node) {
     Token period = node.period;
     if (period == null) {
-      return new IndexExpression.forTarget_full(clone2(node.array), node.leftBracket, clone2(node.index), node.rightBracket);
+      return new IndexExpression.forTarget_full(clone2(node.target), node.leftBracket, clone2(node.index), node.rightBracket);
     } else {
       return new IndexExpression.forCascade_full(period, node.leftBracket, clone2(node.index), node.rightBracket);
     }
@@ -17048,7 +17256,7 @@
   SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase.full(clone3(node.labels), node.keyword, clone2(node.expression), node.colon, clone3(node.statements));
   SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault.full(clone3(node.labels), node.keyword, node.colon, clone3(node.statements));
   SwitchStatement visitSwitchStatement(SwitchStatement node) => new SwitchStatement.full(node.keyword, node.leftParenthesis, clone2(node.expression), node.rightParenthesis, node.leftBracket, clone3(node.members), node.rightBracket);
-  ASTNode visitSymbolLiteral(SymbolLiteral node) => new SymbolLiteral.full(node.poundSign, clone3(node.components));
+  ASTNode visitSymbolLiteral(SymbolLiteral node) => new SymbolLiteral.full(node.poundSign, node.components);
   ThisExpression visitThisExpression(ThisExpression node) => new ThisExpression.full(node.keyword);
   ThrowExpression visitThrowExpression(ThrowExpression node) => new ThrowExpression.full(node.keyword, clone2(node.expression));
   TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration.full(clone2(node.documentationComment), clone3(node.metadata), clone2(node.variables), node.semicolon);
@@ -17057,8 +17265,8 @@
   TypeName visitTypeName(TypeName node) => new TypeName.full(clone2(node.name), clone2(node.typeArguments));
   TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter.full(clone2(node.documentationComment), clone3(node.metadata), clone2(node.name), node.keyword, clone2(node.bound));
   TypeParameterList visitTypeParameterList(TypeParameterList node) => new TypeParameterList.full(node.leftBracket, clone3(node.typeParameters), node.rightBracket);
-  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration.full(clone2(node.documentationComment), clone3(node.metadata), clone2(node.name), node.equals, clone2(node.initializer));
-  VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList.full(clone2(node.documentationComment), clone3(node.metadata), node.keyword, clone2(node.type), clone3(node.variables));
+  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration.full(null, clone3(node.metadata), clone2(node.name), node.equals, clone2(node.initializer));
+  VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList.full(null, clone3(node.metadata), node.keyword, clone2(node.type), clone3(node.variables));
   VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node) => new VariableDeclarationStatement.full(clone2(node.variables), node.semicolon);
   WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement.full(node.keyword, node.leftParenthesis, clone2(node.condition), node.rightParenthesis, clone2(node.body));
   WithClause visitWithClause(WithClause node) => new WithClause.full(node.withKeyword, clone3(node.mixinTypes));
diff --git a/pkg/analyzer_experimental/lib/src/generated/element.dart b/pkg/analyzer_experimental/lib/src/generated/element.dart
index 6effbfe..5df3e1e 100644
--- a/pkg/analyzer_experimental/lib/src/generated/element.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/element.dart
@@ -4,6 +4,7 @@
 import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
+import 'utilities_collection.dart';
 import 'source.dart';
 import 'scanner.dart' show Keyword;
 import 'ast.dart' show Identifier, LibraryIdentifier;
@@ -561,7 +562,7 @@
  *
  * @coverage dart.engine.element
  */
-class ElementKind implements Comparable<ElementKind> {
+class ElementKind implements Enum<ElementKind> {
   static final ElementKind CLASS = new ElementKind('CLASS', 0, "class");
   static final ElementKind COMPILATION_UNIT = new ElementKind('COMPILATION_UNIT', 1, "compilation unit");
   static final ElementKind CONSTRUCTOR = new ElementKind('CONSTRUCTOR', 2, "constructor");
@@ -1167,6 +1168,13 @@
    * @return the elements that were defined with the same name
    */
   List<Element> get conflictingElements;
+
+  /**
+   * Return the type of this element as the dynamic type.
+   *
+   * @return the type of this element as the dynamic type
+   */
+  Type2 get type;
 }
 /**
  * The interface `NamespaceCombinator` defines the behavior common to objects that control how
@@ -2668,7 +2676,7 @@
   /**
    * A bit-encoded form of the modifiers associated with this element.
    */
-  Set<Modifier> _modifiers;
+  int _modifiers = 0;
 
   /**
    * An array containing all of the metadata associated with this element.
@@ -2820,7 +2828,7 @@
    * @param modifier the modifier being tested for
    * @return `true` if this element has the given modifier associated with it
    */
-  bool hasModifier(Modifier modifier) => _modifiers != null && _modifiers.contains(modifier);
+  bool hasModifier(Modifier modifier) => BooleanArray.get(_modifiers, modifier);
 
   /**
    * If the given child is not `null`, use the given visitor to visit it.
@@ -2865,19 +2873,7 @@
    * @param value `true` if the modifier is to be associated with this element
    */
   void setModifier(Modifier modifier, bool value) {
-    if (value) {
-      if (_modifiers == null) {
-        _modifiers = new Set();
-      }
-      _modifiers.add(modifier);
-    } else {
-      if (_modifiers != null) {
-        _modifiers.remove(modifier);
-        if (_modifiers.isEmpty) {
-          _modifiers = null;
-        }
-      }
-    }
+    _modifiers = BooleanArray.set(_modifiers, modifier, value);
   }
 }
 /**
@@ -2961,7 +2957,20 @@
     }
     return builder.toString();
   }
-  int get hashCode => JavaArrays.makeHashCode(_components);
+  int get hashCode {
+    int result = 1;
+    for (int i = 0; i < _components.length; i++) {
+      String component = _components[i];
+      int componentHash;
+      if (i <= 1) {
+        componentHash = hashSourceComponent(component);
+      } else {
+        componentHash = component.hashCode;
+      }
+      result = 31 * result + componentHash;
+    }
+    return result;
+  }
   String toString() => encoding;
 
   /**
@@ -3033,6 +3042,19 @@
     }
     return left.substring(1) == right.substring(1);
   }
+
+  /**
+   * Return the hash code of the given encoded source component, ignoring the source type indicator.
+   *
+   * @param sourceComponent the component to compute a hash code
+   * @return the hash code of the given encoded source component
+   */
+  int hashSourceComponent(String sourceComponent) {
+    if (sourceComponent.length <= 1) {
+      return sourceComponent.hashCode;
+    }
+    return sourceComponent.substring(1).hashCode;
+  }
 }
 /**
  * Instances of the class `EmbeddedHtmlScriptElementImpl` implement an
@@ -3597,6 +3619,28 @@
     }
     this._typeVariables = typeVariables2;
   }
+
+  /**
+   * Set the parameters defined by this type alias to the given parameters without becoming the
+   * parent of the parameters. This should only be used by the [TypeResolverVisitor] when
+   * creating a synthetic type alias.
+   *
+   * @param parameters the parameters defined by this type alias
+   */
+  void shareParameters(List<ParameterElement> parameters2) {
+    this._parameters = parameters2;
+  }
+
+  /**
+   * Set the type variables defined for this type to the given variables without becoming the parent
+   * of the variables. This should only be used by the [TypeResolverVisitor] when creating a
+   * synthetic type alias.
+   *
+   * @param typeVariables the type variables defined for this type
+   */
+  void shareTypeVariables(List<TypeVariableElement> typeVariables2) {
+    this._typeVariables = typeVariables2;
+  }
   void visitChildren(ElementVisitor<Object> visitor) {
     super.visitChildren(visitor);
     safelyVisitChildren(_parameters, visitor);
@@ -4313,7 +4357,7 @@
  *
  * @coverage dart.engine.element
  */
-class Modifier implements Comparable<Modifier> {
+class Modifier implements Enum<Modifier> {
   static final Modifier ABSTRACT = new Modifier('ABSTRACT', 0);
   static final Modifier CONST = new Modifier('CONST', 1);
   static final Modifier FACTORY = new Modifier('FACTORY', 2);
@@ -4396,6 +4440,7 @@
   String get name => _name;
   int get nameOffset => -1;
   Source get source => null;
+  Type2 get type => DynamicTypeImpl.instance;
   bool isAccessibleIn(LibraryElement library) {
     for (Element element in _conflictingElements) {
       if (element.isAccessibleIn(library)) {
@@ -5081,6 +5126,9 @@
       return baseConstructor;
     }
     FunctionType baseType = baseConstructor.type;
+    if (baseType == null) {
+      return baseConstructor;
+    }
     List<Type2> argumentTypes = definingType.typeArguments;
     List<Type2> parameterTypes = definingType.element.type.typeArguments;
     FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
diff --git a/pkg/analyzer_experimental/lib/src/generated/engine.dart b/pkg/analyzer_experimental/lib/src/generated/engine.dart
index d1658b1..1570f8c 100644
--- a/pkg/analyzer_experimental/lib/src/generated/engine.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/engine.dart
@@ -1,9 +1,9 @@
 // This code was auto-generated, is not intended to be edited, and is subject to
 // significant change. Please see the README file for more information.
 library engine;
-import 'dart:collection' show HasNextIterator;
 import 'java_core.dart';
 import 'java_engine.dart';
+import 'utilities_collection.dart';
 import 'instrumentation.dart';
 import 'error.dart';
 import 'source.dart';
@@ -113,6 +113,27 @@
   }
 }
 /**
+ * Container with statistics about the [AnalysisContext].
+ */
+abstract class AnalysisContentStatistics {
+
+  /**
+   * @return the statistics for each kind of cached data.
+   */
+  List<AnalysisContentStatistics_CacheRow> get cacheRows;
+}
+/**
+ * Information about single item in the cache.
+ */
+abstract class AnalysisContentStatistics_CacheRow {
+  int get errorCount;
+  int get flushedCount;
+  int get inProcessCount;
+  int get invalidCount;
+  String get name;
+  int get validCount;
+}
+/**
  * The interface `AnalysisContext` defines the behavior of objects that represent a context in
  * which a single analysis can be performed and incrementally maintained. The context includes such
  * information as the version of the SDK being analyzed against as well as the package-root used to
@@ -945,15 +966,15 @@
   List<AnalysisError> _parseErrors = AnalysisError.NO_ERRORS;
 
   /**
-   * The state of the cached list of included parts.
+   * The state of the cached list of imported libraries.
    */
-  CacheState _includedPartsState = CacheState.INVALID;
+  CacheState _importedLibrariesState = CacheState.INVALID;
 
   /**
-   * The list of parts included in the library, or an empty array if the list is not currently
+   * The list of libraries imported by the library, or an empty array if the list is not currently
    * cached. The list will be empty if the Dart file is a part rather than a library.
    */
-  List<Source> _includedParts = Source.EMPTY_ARRAY;
+  List<Source> _importedLibraries = Source.EMPTY_ARRAY;
 
   /**
    * The state of the cached list of exported libraries.
@@ -967,15 +988,15 @@
   List<Source> _exportedLibraries = Source.EMPTY_ARRAY;
 
   /**
-   * The state of the cached list of imported libraries.
+   * The state of the cached list of included parts.
    */
-  CacheState _importedLibrariesState = CacheState.INVALID;
+  CacheState _includedPartsState = CacheState.INVALID;
 
   /**
-   * The list of libraries imported by the library, or an empty array if the list is not currently
+   * The list of parts included in the library, or an empty array if the list is not currently
    * cached. The list will be empty if the Dart file is a part rather than a library.
    */
-  List<Source> _importedLibraries = Source.EMPTY_ARRAY;
+  List<Source> _includedParts = Source.EMPTY_ARRAY;
 
   /**
    * The information known as a result of resolving this compilation unit as part of the library
@@ -1472,6 +1493,31 @@
     _launchableState = other._launchableState;
     _bitmask = other._bitmask;
   }
+  void writeOn(JavaStringBuilder builder) {
+    builder.append("Dart: ");
+    super.writeOn(builder);
+    builder.append("; sourceKind = ");
+    builder.append(_sourceKindState);
+    builder.append("; parsedUnit = ");
+    builder.append(_parsedUnitState);
+    builder.append("; parseErrors = ");
+    builder.append(_parseErrorsState);
+    builder.append("; exportedLibraries = ");
+    builder.append(_exportedLibrariesState);
+    builder.append("; importedLibraries = ");
+    builder.append(_importedLibrariesState);
+    builder.append("; includedParts = ");
+    builder.append(_includedPartsState);
+    builder.append("; element = ");
+    builder.append(_elementState);
+    builder.append("; publicNamespace = ");
+    builder.append(_publicNamespaceState);
+    builder.append("; clientServer = ");
+    builder.append(_clientServerState);
+    builder.append("; launchable = ");
+    builder.append(_launchableState);
+    _resolutionState.writeOn(builder);
+  }
 
   /**
    * Return a resolution state for the specified library, creating one as necessary.
@@ -1615,6 +1661,26 @@
     _hintsState = CacheState.ERROR;
     _hints = AnalysisError.NO_ERRORS;
   }
+
+  /**
+   * Write a textual representation of this state to the given builder. The result will only be
+   * used for debugging purposes.
+   *
+   * @param builder the builder to which the text should be written
+   */
+  void writeOn(JavaStringBuilder builder) {
+    if (_librarySource != null) {
+      builder.append("; resolvedUnit = ");
+      builder.append(_resolvedUnitState);
+      builder.append("; resolutionErrors = ");
+      builder.append(_resolutionErrorsState);
+      builder.append("; hints = ");
+      builder.append(_hintsState);
+      if (_nextState != null) {
+        _nextState.writeOn(builder);
+      }
+    }
+  }
 }
 /**
  * Instances of the class `DataDescriptor` are immutable constants representing data that can
@@ -1850,6 +1916,18 @@
     _hints = other._hints;
     _hintsState = other._hintsState;
   }
+  void writeOn(JavaStringBuilder builder) {
+    builder.append("Html: ");
+    super.writeOn(builder);
+    builder.append("; parsedUnit = ");
+    builder.append(_parsedUnitState);
+    builder.append("; resolutionErrors = ");
+    builder.append(_resolutionErrorsState);
+    builder.append("; referencedLibraries = ");
+    builder.append(_referencedLibrariesState);
+    builder.append("; element = ");
+    builder.append(_elementState);
+  }
 }
 /**
  * The interface `SourceEntry` defines the behavior of objects that maintain the information
@@ -1986,6 +2064,11 @@
       throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
     }
   }
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    writeOn(builder);
+    return builder.toString();
+  }
 
   /**
    * Copy the information from the given cache entry.
@@ -2015,6 +2098,74 @@
     }
     return defaultValue;
   }
+
+  /**
+   * Write a textual representation of this entry to the given builder. The result will only be used
+   * for debugging purposes.
+   *
+   * @param builder the builder to which the text should be written
+   */
+  void writeOn(JavaStringBuilder builder) {
+    builder.append("time = ");
+    builder.append(_modificationTime.toRadixString(16));
+    builder.append("; lineInfo = ");
+    builder.append(_lineInfoState);
+  }
+}
+/**
+ * Implementation of the [AnalysisContentStatistics].
+ */
+class AnalysisContentStatisticsImpl implements AnalysisContentStatistics {
+  Map<String, AnalysisContentStatistics_CacheRow> _dataMap = new Map<String, AnalysisContentStatistics_CacheRow>();
+  List<AnalysisContentStatistics_CacheRow> get cacheRows {
+    Iterable<AnalysisContentStatistics_CacheRow> items = _dataMap.values;
+    return new List.from(items);
+  }
+  void putCacheItem(DataDescriptor<Object> rowDesc, CacheState state) {
+    String rowName = rowDesc.toString();
+    AnalysisContentStatisticsImpl_CacheRowImpl row = _dataMap[rowName] as AnalysisContentStatisticsImpl_CacheRowImpl;
+    if (row == null) {
+      row = new AnalysisContentStatisticsImpl_CacheRowImpl(rowName);
+      _dataMap[rowName] = row;
+    }
+    row.incState(state);
+  }
+}
+class AnalysisContentStatisticsImpl_CacheRowImpl implements AnalysisContentStatistics_CacheRow {
+  String _name;
+  int _errorCount = 0;
+  int _flushedCount = 0;
+  int _inProcessCount = 0;
+  int _invalidCount = 0;
+  int _validCount = 0;
+  AnalysisContentStatisticsImpl_CacheRowImpl(String name) {
+    this._name = name;
+  }
+  bool operator ==(Object obj) => obj is AnalysisContentStatisticsImpl_CacheRowImpl && ((obj as AnalysisContentStatisticsImpl_CacheRowImpl))._name == _name;
+  int get errorCount => _errorCount;
+  int get flushedCount => _flushedCount;
+  int get inProcessCount => _inProcessCount;
+  int get invalidCount => _invalidCount;
+  String get name => _name;
+  int get validCount => _validCount;
+  int get hashCode => _name.hashCode;
+  void incState(CacheState state) {
+    if (identical(state, CacheState.ERROR)) {
+      _errorCount++;
+    }
+    if (identical(state, CacheState.FLUSHED)) {
+      _flushedCount++;
+    }
+    if (identical(state, CacheState.IN_PROCESS)) {
+      _inProcessCount++;
+    }
+    if (identical(state, CacheState.INVALID)) {
+      _invalidCount++;
+    }
+    if (identical(state, CacheState.VALID)) {
+      _validCount++;
+    }
+  }
 }
 /**
  * Instances of the class `AnalysisContextImpl` implement an [AnalysisContext].
@@ -2024,6 +2175,22 @@
 class AnalysisContextImpl implements InternalAnalysisContext {
 
   /**
+   * Helper for [getStatistics], puts the library-specific state into the given statistics
+   * object.
+   */
+  static void putStatCacheItem(AnalysisContentStatisticsImpl statistics, DartEntry dartEntry, Source librarySource, DataDescriptor<Object> key) {
+    statistics.putCacheItem(key, dartEntry.getState2(key, librarySource));
+  }
+
+  /**
+   * Helper for [getStatistics], puts the library independent state into the given
+   * statistics object.
+   */
+  static void putStatCacheItem2(AnalysisContentStatisticsImpl statistics, SourceEntry entry, DataDescriptor<Object> key) {
+    statistics.putCacheItem(key, entry.getState(key));
+  }
+
+  /**
    * The set of analysis options controlling the behavior of this context.
    */
   AnalysisOptions _options = new AnalysisOptionsImpl();
@@ -2074,6 +2241,14 @@
   static int _MAX_CACHE_SIZE = 64;
 
   /**
+   * The maximum number of sources that can be on the priority list. This <b>must</b> be less than
+   * the [MAX_CACHE_SIZE] in order to prevent an infinite loop in performAnalysisTask().
+   *
+   * @see #setAnalysisPriorityOrder(List)
+   */
+  static int _MAX_PRIORITY_LIST_SIZE = _MAX_CACHE_SIZE - 4;
+
+  /**
    * The name of the 'src' attribute in a HTML tag.
    */
   static String _ATTRIBUTE_SRC = "src";
@@ -2149,8 +2324,12 @@
           return null;
         }
         JavaStringBuilder builder = new JavaStringBuilder();
-        for (Token token in comment.tokens) {
-          builder.append(token.lexeme);
+        List<Token> tokens = comment.tokens;
+        for (int i = 0; i < tokens.length; i++) {
+          if (i > 0) {
+            builder.append('\n');
+          }
+          builder.append(tokens[i].lexeme);
         }
         return builder.toString();
       }
@@ -2159,116 +2338,49 @@
     return null;
   }
   List<AnalysisError> computeErrors(Source source) {
-    {
-      SourceEntry sourceEntry = getSourceEntry(source);
-      if (sourceEntry is DartEntry) {
-        DartEntry dartEntry = sourceEntry as DartEntry;
-        CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS);
-        if (parseErrorsState != CacheState.VALID && parseErrorsState != CacheState.ERROR) {
-          parseCompilationUnit(source);
-          dartEntry = getSourceEntry(source) as DartEntry;
-        }
+    SourceEntry sourceEntry = getReadableSourceEntry(source);
+    if (sourceEntry is DartEntry) {
+      List<AnalysisError> errors = new List<AnalysisError>();
+      DartEntry dartEntry = sourceEntry as DartEntry;
+      ListUtilities.addAll(errors, internalGetDartParseData(source, dartEntry, DartEntry.PARSE_ERRORS));
+      if (identical(dartEntry.getValue(DartEntry.SOURCE_KIND), SourceKind.LIBRARY)) {
+        ListUtilities.addAll(errors, internalGetDartResolutionData(source, source, dartEntry, DartEntry.RESOLUTION_ERRORS));
+      } else {
         List<Source> libraries = getLibrariesContaining(source);
         for (Source librarySource in libraries) {
-          CacheState resolutionErrorsState = dartEntry.getState2(DartEntry.RESOLUTION_ERRORS, librarySource);
-          if (resolutionErrorsState != CacheState.VALID && resolutionErrorsState != CacheState.ERROR) {
-          }
+          ListUtilities.addAll(errors, internalGetDartResolutionData(source, librarySource, dartEntry, DartEntry.RESOLUTION_ERRORS));
         }
-        return dartEntry.allErrors;
-      } else if (sourceEntry is HtmlEntry) {
-        HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
-        CacheState resolutionErrorsState = htmlEntry.getState(HtmlEntry.RESOLUTION_ERRORS);
-        if (resolutionErrorsState != CacheState.VALID && resolutionErrorsState != CacheState.ERROR) {
-          computeHtmlElement(source);
-          htmlEntry = getSourceEntry(source) as HtmlEntry;
-        }
-        return htmlEntry.getValue(HtmlEntry.RESOLUTION_ERRORS);
       }
-      return AnalysisError.NO_ERRORS;
+      if (errors.isEmpty) {
+        return AnalysisError.NO_ERRORS;
+      }
+      return new List.from(errors);
+    } else if (sourceEntry is HtmlEntry) {
+      HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
+      return internalGetHtmlResolutionData(source, htmlEntry, HtmlEntry.RESOLUTION_ERRORS, AnalysisError.NO_ERRORS);
     }
+    return AnalysisError.NO_ERRORS;
   }
-  List<Source> computeExportedLibraries(Source source) {
-    {
-      accessed(source);
-      DartEntry dartEntry = getDartEntry(source);
-      if (dartEntry == null || dartEntry.kind != SourceKind.LIBRARY) {
-        return Source.EMPTY_ARRAY;
-      }
-      CacheState state = dartEntry.getState(DartEntry.EXPORTED_LIBRARIES);
-      if (identical(state, CacheState.ERROR)) {
-        return Source.EMPTY_ARRAY;
-      } else if (identical(state, CacheState.VALID)) {
-        return dartEntry.getValue(DartEntry.EXPORTED_LIBRARIES);
-      } else {
-        DartEntryImpl dartCopy = dartEntry.writableCopy;
-        internalParseCompilationUnit(dartCopy, source);
-        _sourceMap[source] = dartCopy;
-        return dartCopy.getValue(DartEntry.EXPORTED_LIBRARIES);
-      }
-    }
-  }
+  List<Source> computeExportedLibraries(Source source) => internalGetDartParseData2(source, DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY);
   HtmlElement computeHtmlElement(Source source) {
-    if (!AnalysisEngine.isHtmlFileName(source.shortName)) {
+    HtmlEntry htmlEntry = getReadableHtmlEntry(source);
+    if (htmlEntry == null) {
       return null;
     }
-    {
-      HtmlEntry htmlEntry = getHtmlEntry(source);
-      if (htmlEntry == null) {
-        return null;
-      }
-      try {
-        HtmlElement element = htmlEntry.getValue(HtmlEntry.ELEMENT);
-        if (element == null) {
-          HtmlUnit unit = htmlEntry.getValue(HtmlEntry.PARSED_UNIT);
-          if (unit == null) {
-            unit = parseHtmlUnit(source);
-          }
-          HtmlUnitBuilder builder = new HtmlUnitBuilder(this);
-          element = builder.buildHtmlElement2(source, unit);
-          List<AnalysisError> resolutionErrors = builder.errorListener.getErrors2(source);
-          HtmlEntryImpl htmlCopy = getHtmlEntry(source).writableCopy;
-          htmlCopy.setValue(HtmlEntry.RESOLUTION_ERRORS, resolutionErrors);
-          htmlCopy.setValue(HtmlEntry.ELEMENT, element);
-          _sourceMap[source] = htmlCopy;
-          getNotice(source).setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
-        }
-        return element;
-      } on AnalysisException catch (exception) {
-        HtmlEntryImpl htmlCopy = getHtmlEntry(source).writableCopy;
-        htmlCopy.setState(HtmlEntry.RESOLUTION_ERRORS, CacheState.ERROR);
-        htmlCopy.setState(HtmlEntry.ELEMENT, CacheState.ERROR);
-        _sourceMap[source] = htmlCopy;
-        throw exception;
-      }
+    CacheState elementState = htmlEntry.getState(HtmlEntry.ELEMENT);
+    if (elementState != CacheState.ERROR && elementState != CacheState.VALID) {
+      htmlEntry = internalResolveHtml(source);
     }
+    return htmlEntry.getValue(HtmlEntry.ELEMENT);
   }
-  List<Source> computeImportedLibraries(Source source) {
-    {
-      accessed(source);
-      DartEntry dartEntry = getDartEntry(source);
-      if (dartEntry == null || dartEntry.kind != SourceKind.LIBRARY) {
-        return Source.EMPTY_ARRAY;
-      }
-      CacheState state = dartEntry.getState(DartEntry.IMPORTED_LIBRARIES);
-      if (identical(state, CacheState.ERROR)) {
-        return Source.EMPTY_ARRAY;
-      } else if (identical(state, CacheState.VALID)) {
-        return dartEntry.getValue(DartEntry.IMPORTED_LIBRARIES);
-      } else {
-        DartEntryImpl dartCopy = dartEntry.writableCopy;
-        internalParseCompilationUnit(dartCopy, source);
-        _sourceMap[source] = dartCopy;
-        return dartCopy.getValue(DartEntry.IMPORTED_LIBRARIES);
-      }
-    }
-  }
+  List<Source> computeImportedLibraries(Source source) => internalGetDartParseData2(source, DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_ARRAY);
   SourceKind computeKindOf(Source source) {
     SourceEntry sourceEntry = getReadableSourceEntry(source);
     if (sourceEntry == null) {
       return SourceKind.UNKNOWN;
     } else if (sourceEntry is DartEntry) {
       try {
-        return internalGetDartParseData(source, (sourceEntry as DartEntry), DartEntry.SOURCE_KIND, SourceKind.UNKNOWN);
+        return internalGetDartParseData(source, (sourceEntry as DartEntry), DartEntry.SOURCE_KIND);
       } on AnalysisException catch (exception) {
         return SourceKind.UNKNOWN;
       }
@@ -2307,21 +2419,19 @@
     return null;
   }
   CompilationUnit computeResolvableCompilationUnit(Source source) {
-    {
-      DartEntry dartEntry = getDartEntry(source);
-      if (dartEntry == null) {
+    DartEntry dartEntry = getReadableDartEntry(source);
+    if (dartEntry == null) {
+      return null;
+    }
+    CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
+    if (unit == null) {
+      try {
+        unit = parseCompilationUnit(source);
+      } on AnalysisException catch (exception) {
         return null;
       }
-      CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
-      if (unit != null) {
-        return unit.accept(new ASTCloner()) as CompilationUnit;
-      }
-      DartEntryImpl dartCopy = dartEntry.writableCopy;
-      unit = internalParseCompilationUnit(dartCopy, source);
-      dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
-      _sourceMap[source] = dartCopy;
-      return unit;
     }
+    return unit.accept(new ASTCloner()) as CompilationUnit;
   }
   AnalysisContext extractContext(SourceContainer container) => extractContextInto(container, (AnalysisEngine.instance.createAnalysisContext() as InternalAnalysisContext));
   InternalAnalysisContext extractContextInto(SourceContainer container, InternalAnalysisContext newContext) {
@@ -2373,15 +2483,20 @@
     return null;
   }
   List<Source> getHtmlFilesReferencing(Source source) {
+    SourceKind sourceKind = getKindOf(source);
+    if (sourceKind == null) {
+      return Source.EMPTY_ARRAY;
+    }
     {
       List<Source> htmlSources = new List<Source>();
       while (true) {
-        if (getKindOf(source) == SourceKind.LIBRARY) {
-        } else if (getKindOf(source) == SourceKind.PART) {
+        if (sourceKind == SourceKind.LIBRARY) {
+        } else if (sourceKind == SourceKind.PART) {
           List<Source> librarySources = getLibrariesContaining(source);
           for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
-            if (identical(entry.getValue().kind, SourceKind.HTML)) {
-              List<Source> referencedLibraries = ((entry.getValue() as HtmlEntry)).getValue(HtmlEntry.REFERENCED_LIBRARIES);
+            SourceEntry sourceEntry = entry.getValue();
+            if (identical(sourceEntry.kind, SourceKind.HTML)) {
+              List<Source> referencedLibraries = ((sourceEntry as HtmlEntry)).getValue(HtmlEntry.REFERENCED_LIBRARIES);
               if (containsAny(referencedLibraries, librarySources)) {
                 htmlSources.add(entry.getKey());
               }
@@ -2432,10 +2547,15 @@
   }
   List<Source> getLibrariesContaining(Source source) {
     {
+      SourceEntry sourceEntry = _sourceMap[source];
+      if (sourceEntry != null && identical(sourceEntry.kind, SourceKind.LIBRARY)) {
+        return <Source> [source];
+      }
       List<Source> librarySources = new List<Source>();
       for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
-        if (identical(entry.getValue().kind, SourceKind.LIBRARY)) {
-          if (contains(((entry.getValue() as DartEntry)).getValue(DartEntry.INCLUDED_PARTS), source)) {
+        sourceEntry = entry.getValue();
+        if (identical(sourceEntry.kind, SourceKind.LIBRARY)) {
+          if (contains(((sourceEntry as DartEntry)).getValue(DartEntry.INCLUDED_PARTS), source)) {
             librarySources.add(entry.getKey());
           }
         }
@@ -2450,11 +2570,12 @@
     {
       List<Source> dependentLibraries = new List<Source>();
       for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
-        if (identical(entry.getValue().kind, SourceKind.LIBRARY)) {
-          if (contains(((entry.getValue() as DartEntry)).getValue(DartEntry.EXPORTED_LIBRARIES), librarySource)) {
+        SourceEntry sourceEntry = entry.getValue();
+        if (identical(sourceEntry.kind, SourceKind.LIBRARY)) {
+          if (contains(((sourceEntry as DartEntry)).getValue(DartEntry.EXPORTED_LIBRARIES), librarySource)) {
             dependentLibraries.add(entry.getKey());
           }
-          if (contains(((entry.getValue() as DartEntry)).getValue(DartEntry.IMPORTED_LIBRARIES), librarySource)) {
+          if (contains(((sourceEntry as DartEntry)).getValue(DartEntry.IMPORTED_LIBRARIES), librarySource)) {
             dependentLibraries.add(entry.getKey());
           }
         }
@@ -2482,11 +2603,11 @@
   }
   Namespace getPublicNamespace(LibraryElement library) {
     Source source = library.definingCompilationUnit.source;
+    DartEntry dartEntry = getReadableDartEntry(source);
+    if (dartEntry == null) {
+      return null;
+    }
     {
-      DartEntry dartEntry = getDartEntry(source);
-      if (dartEntry == null) {
-        return null;
-      }
       Namespace namespace = dartEntry.getValue(DartEntry.PUBLIC_NAMESPACE);
       if (namespace == null) {
         NamespaceBuilder builder = new NamespaceBuilder();
@@ -2499,11 +2620,11 @@
     }
   }
   Namespace getPublicNamespace2(Source source) {
+    DartEntry dartEntry = getReadableDartEntry(source);
+    if (dartEntry == null) {
+      return null;
+    }
     {
-      DartEntry dartEntry = getDartEntry(source);
-      if (dartEntry == null) {
-        return null;
-      }
       Namespace namespace = dartEntry.getValue(DartEntry.PUBLIC_NAMESPACE);
       if (namespace == null) {
         LibraryElement library = computeLibraryElement(source);
@@ -2533,6 +2654,68 @@
     return null;
   }
   SourceFactory get sourceFactory => _sourceFactory;
+
+  /**
+   * Return a list of the sources that would be processed by [performAnalysisTask]. This
+   * method is intended to be used for testing purposes only.
+   *
+   * @return a list of the sources that would be processed by [performAnalysisTask]
+   */
+  List<Source> get sourcesNeedingProcessing {
+    List<Source> sources = new List<Source>();
+    {
+      for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
+        SourceEntry sourceEntry = entry.getValue();
+        if (sourceEntry is DartEntry) {
+          DartEntry dartEntry = sourceEntry as DartEntry;
+          CacheState parsedUnitState = dartEntry.getState(DartEntry.PARSED_UNIT);
+          CacheState elementState = dartEntry.getState(DartEntry.ELEMENT);
+          if (identical(parsedUnitState, CacheState.INVALID) || identical(elementState, CacheState.INVALID)) {
+            sources.add(entry.getKey());
+          }
+        } else if (sourceEntry is HtmlEntry) {
+          HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
+          CacheState parsedUnitState = htmlEntry.getState(HtmlEntry.PARSED_UNIT);
+          CacheState elementState = htmlEntry.getState(HtmlEntry.ELEMENT);
+          if (identical(parsedUnitState, CacheState.INVALID) || identical(elementState, CacheState.INVALID)) {
+            sources.add(entry.getKey());
+          }
+        }
+      }
+    }
+    return sources;
+  }
+  AnalysisContentStatistics get statistics {
+    AnalysisContentStatisticsImpl statistics = new AnalysisContentStatisticsImpl();
+    {
+      for (MapEntry<Source, SourceEntry> mapEntry in getMapEntrySet(_sourceMap)) {
+        SourceEntry entry = mapEntry.getValue();
+        if (entry is DartEntry) {
+          Source source = mapEntry.getKey();
+          DartEntry dartEntry = entry as DartEntry;
+          SourceKind kind = dartEntry.getValue(DartEntry.SOURCE_KIND);
+          putStatCacheItem2(statistics, dartEntry, DartEntry.PARSE_ERRORS);
+          putStatCacheItem2(statistics, dartEntry, DartEntry.PARSED_UNIT);
+          putStatCacheItem2(statistics, dartEntry, DartEntry.SOURCE_KIND);
+          putStatCacheItem2(statistics, dartEntry, DartEntry.LINE_INFO);
+          if (identical(kind, SourceKind.LIBRARY)) {
+            putStatCacheItem2(statistics, dartEntry, DartEntry.ELEMENT);
+            putStatCacheItem2(statistics, dartEntry, DartEntry.EXPORTED_LIBRARIES);
+            putStatCacheItem2(statistics, dartEntry, DartEntry.IMPORTED_LIBRARIES);
+            putStatCacheItem2(statistics, dartEntry, DartEntry.INCLUDED_PARTS);
+            putStatCacheItem2(statistics, dartEntry, DartEntry.IS_CLIENT);
+            putStatCacheItem2(statistics, dartEntry, DartEntry.IS_LAUNCHABLE);
+          }
+          List<Source> librarySources = getLibrariesContaining(source);
+          for (Source librarySource in librarySources) {
+            putStatCacheItem(statistics, dartEntry, librarySource, DartEntry.RESOLUTION_ERRORS);
+            putStatCacheItem(statistics, dartEntry, librarySource, DartEntry.RESOLVED_UNIT);
+          }
+        }
+      }
+    }
+    return statistics;
+  }
   bool isClientLibrary(Source librarySource) {
     SourceEntry sourceEntry = getReadableSourceEntry(librarySource);
     if (sourceEntry is DartEntry) {
@@ -2667,14 +2850,21 @@
       if (sources == null || sources.isEmpty) {
         _priorityOrder = Source.EMPTY_ARRAY;
       } else {
-        _priorityOrder = new List.from(sources);
+        while (sources.remove(null)) {
+        }
+        int count = Math.min(sources.length, _MAX_PRIORITY_LIST_SIZE);
+        _priorityOrder = new List<Source>(count);
+        for (int i = 0; i < count; i++) {
+          _priorityOrder[i] = sources[i];
+        }
       }
     }
   }
   void setContents(Source source, String contents) {
     {
-      _sourceFactory.setContents(source, contents);
-      sourceChanged(source);
+      if (_sourceFactory.setContents(source, contents)) {
+        sourceChanged(source);
+      }
     }
   }
   void set sourceFactory(SourceFactory factory) {
@@ -2703,37 +2893,6 @@
   }
 
   /**
-   * Return a list of the sources that would be processed by [performAnalysisTask]. This
-   * method is intended to be used for testing purposes only.
-   *
-   * @return a list of the sources that would be processed by [performAnalysisTask]
-   */
-  List<Source> get sourcesNeedingProcessing {
-    List<Source> sources = new List<Source>();
-    {
-      for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
-        SourceEntry sourceEntry = entry.getValue();
-        if (sourceEntry is DartEntry) {
-          DartEntry dartEntry = sourceEntry as DartEntry;
-          CacheState parsedUnitState = dartEntry.getState(DartEntry.PARSED_UNIT);
-          CacheState elementState = dartEntry.getState(DartEntry.ELEMENT);
-          if (identical(parsedUnitState, CacheState.INVALID) || identical(elementState, CacheState.INVALID)) {
-            sources.add(entry.getKey());
-          }
-        } else if (sourceEntry is HtmlEntry) {
-          HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
-          CacheState parsedUnitState = htmlEntry.getState(HtmlEntry.PARSED_UNIT);
-          CacheState elementState = htmlEntry.getState(HtmlEntry.ELEMENT);
-          if (identical(parsedUnitState, CacheState.INVALID) || identical(elementState, CacheState.INVALID)) {
-            sources.add(entry.getKey());
-          }
-        }
-      }
-    }
-    return sources;
-  }
-
-  /**
    * Record that the given source was just accessed for some unspecified purpose.
    *
    * Note: This method must only be invoked while we are synchronized on [cacheLock].
@@ -2883,7 +3042,7 @@
    * Note: This method must only be invoked while we are synchronized on [cacheLock].
    */
   void flushAstFromCache() {
-    Source removedSource = _recentlyUsed.removeAt(0);
+    Source removedSource = removeAstToFlush();
     SourceEntry sourceEntry = _sourceMap[removedSource];
     if (sourceEntry is HtmlEntry) {
       HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
@@ -2924,30 +3083,6 @@
   }
 
   /**
-   * Return the HTML unit information associated with the given source, or `null` if the
-   * source is not known to this context. This method should be used to access the HTML unit
-   * information rather than accessing the HTML unit map directly because sources in the SDK are
-   * implicitly part of every analysis context and are therefore only added to the map when first
-   * accessed.
-   *
-   * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
-   *
-   * @param source the source for which information is being sought
-   * @return the HTML unit information associated with the given source
-   */
-  HtmlEntry getHtmlEntry(Source source) {
-    SourceEntry sourceEntry = getSourceEntry(source);
-    if (sourceEntry == null) {
-      sourceEntry = new HtmlEntryImpl();
-      _sourceMap[source] = sourceEntry;
-      return sourceEntry as HtmlEntry;
-    } else if (sourceEntry is HtmlEntry) {
-      return sourceEntry as HtmlEntry;
-    }
-    return null;
-  }
-
-  /**
    * Return the sources of libraries that are referenced in the specified HTML file.
    *
    * @param htmlSource the source of the HTML file being analyzed
@@ -2964,6 +3099,117 @@
   }
 
   /**
+   * Look through the cache for a task that needs to be performed. Return the task that was found,
+   * or `null` if there is no more work to be done.
+   *
+   * @return the next task that needs to be performed
+   */
+  AnalysisContextImpl_AnalysisTask get nextTaskAnalysisTask {
+    {
+      for (Source source in _priorityOrder) {
+        SourceEntry sourceEntry = _sourceMap[source];
+        if (sourceEntry is DartEntry) {
+          DartEntry dartEntry = sourceEntry as DartEntry;
+          CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS);
+          if (identical(parseErrorsState, CacheState.INVALID) || identical(parseErrorsState, CacheState.FLUSHED)) {
+            DartEntryImpl dartCopy = dartEntry.writableCopy;
+            dartCopy.setState(DartEntry.PARSE_ERRORS, CacheState.IN_PROCESS);
+            _sourceMap[source] = dartCopy;
+            return new AnalysisContextImpl_ParseDartTask(this, source);
+          }
+          CacheState parseUnitState = dartEntry.getState(DartEntry.PARSED_UNIT);
+          if (identical(parseUnitState, CacheState.INVALID) || identical(parseUnitState, CacheState.FLUSHED)) {
+            DartEntryImpl dartCopy = dartEntry.writableCopy;
+            dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.IN_PROCESS);
+            _sourceMap[source] = dartCopy;
+            return new AnalysisContextImpl_ParseDartTask(this, source);
+          }
+          for (Source librarySource in getLibrariesContaining(source)) {
+            SourceEntry libraryEntry = _sourceMap[librarySource];
+            if (libraryEntry is DartEntry) {
+              CacheState elementState = libraryEntry.getState(DartEntry.ELEMENT);
+              if (identical(elementState, CacheState.INVALID) || identical(elementState, CacheState.FLUSHED)) {
+                DartEntryImpl libraryCopy = ((libraryEntry as DartEntry)).writableCopy;
+                libraryCopy.setState(DartEntry.ELEMENT, CacheState.IN_PROCESS);
+                _sourceMap[librarySource] = libraryCopy;
+                return new AnalysisContextImpl_ResolveDartLibraryTask(this, librarySource);
+              }
+            }
+            CacheState resolvedUnitState = dartEntry.getState2(DartEntry.RESOLVED_UNIT, librarySource);
+            if (identical(resolvedUnitState, CacheState.INVALID) || identical(resolvedUnitState, CacheState.FLUSHED)) {
+              DartEntryImpl dartCopy = dartEntry.writableCopy;
+              dartCopy.setState2(DartEntry.RESOLVED_UNIT, librarySource, CacheState.IN_PROCESS);
+              _sourceMap[source] = dartCopy;
+              return new AnalysisContextImpl_ResolveDartUnitTask(this, source, librarySource);
+            }
+          }
+        } else if (sourceEntry is HtmlEntry) {
+          HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
+          CacheState parsedUnitState = htmlEntry.getState(HtmlEntry.PARSED_UNIT);
+          if (identical(parsedUnitState, CacheState.INVALID) || identical(parsedUnitState, CacheState.FLUSHED)) {
+            HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+            htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.IN_PROCESS);
+            _sourceMap[source] = htmlCopy;
+            return new AnalysisContextImpl_ParseHtmlTask(this, source);
+          }
+          CacheState elementState = htmlEntry.getState(HtmlEntry.ELEMENT);
+          if (identical(elementState, CacheState.INVALID) || identical(elementState, CacheState.FLUSHED)) {
+            HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+            htmlCopy.setState(HtmlEntry.ELEMENT, CacheState.IN_PROCESS);
+            _sourceMap[source] = htmlCopy;
+            return new AnalysisContextImpl_ResolveHtmlTask(this, source);
+          }
+        }
+      }
+      for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
+        SourceEntry sourceEntry = entry.getValue();
+        if (sourceEntry is DartEntry) {
+          DartEntry dartEntry = sourceEntry as DartEntry;
+          if (identical(dartEntry.getState(DartEntry.PARSED_UNIT), CacheState.INVALID)) {
+            Source source = entry.getKey();
+            DartEntryImpl dartCopy = dartEntry.writableCopy;
+            dartCopy.setState(DartEntry.PARSE_ERRORS, CacheState.IN_PROCESS);
+            _sourceMap[source] = dartCopy;
+            return new AnalysisContextImpl_ParseDartTask(this, source);
+          }
+        } else if (sourceEntry is HtmlEntry) {
+          HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
+          if (identical(htmlEntry.getState(HtmlEntry.PARSED_UNIT), CacheState.INVALID)) {
+            Source source = entry.getKey();
+            HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+            htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.IN_PROCESS);
+            _sourceMap[source] = htmlCopy;
+            return new AnalysisContextImpl_ParseHtmlTask(this, source);
+          }
+        }
+      }
+      for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
+        SourceEntry sourceEntry = entry.getValue();
+        if (sourceEntry is DartEntry && identical(sourceEntry.kind, SourceKind.LIBRARY)) {
+          DartEntry dartEntry = sourceEntry as DartEntry;
+          if (identical(dartEntry.getState(DartEntry.ELEMENT), CacheState.INVALID)) {
+            Source source = entry.getKey();
+            DartEntryImpl dartCopy = dartEntry.writableCopy;
+            dartCopy.setState(DartEntry.ELEMENT, CacheState.IN_PROCESS);
+            _sourceMap[source] = dartCopy;
+            return new AnalysisContextImpl_ResolveDartLibraryTask(this, source);
+          }
+        } else if (sourceEntry is HtmlEntry) {
+          HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
+          if (identical(htmlEntry.getState(HtmlEntry.ELEMENT), CacheState.INVALID)) {
+            Source source = entry.getKey();
+            HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+            htmlCopy.setState(HtmlEntry.ELEMENT, CacheState.IN_PROCESS);
+            _sourceMap[source] = htmlCopy;
+            return new AnalysisContextImpl_ResolveHtmlTask(this, source);
+          }
+        }
+      }
+      return null;
+    }
+  }
+
+  /**
    * Return a change notice for the given source, creating one if one does not already exist.
    *
    * @param source the source for which changes are being reported
@@ -3078,26 +3324,99 @@
   }
 
   /**
-   * Given a source for a Dart file, return the data represented by the given descriptor that is
-   * associated with that source, or the given default value if the source is not a Dart file. This
-   * method assumes that the data can be produced by parsing the source if it is not already cached.
+   * Given a source for an HTML file, return a cache entry in which all of the data represented by
+   * the given descriptors is available. This method assumes that the data can be produced by
+   * parsing the source if it is not already cached.
+   *
+   * @param htmlEntry the cache entry associated with the HTML file
+   * @param descriptor the descriptor representing the data to be returned
+   * @return a cache entry containing the required data
+   */
+  bool hasHtmlParseDataCached(HtmlEntry htmlEntry, List<DataDescriptor<Object>> descriptors) {
+    for (DataDescriptor<Object> descriptor in descriptors) {
+      CacheState state = htmlEntry.getState(descriptor);
+      if (state != CacheState.VALID && state != CacheState.ERROR) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Given a source for a Dart file, return a cache entry in which the data represented by the given
+   * descriptor is available. This method assumes that the data can be produced by parsing the
+   * source if it is not already cached.
    *
    * @param source the source representing the Dart file
    * @param dartEntry the cache entry associated with the Dart file
    * @param descriptor the descriptor representing the data to be returned
-   * @param defaultValue the value to be returned if the source is not a Dart file
-   * @return the requested data about the given source
-   * @throws AnalysisException if data could not be returned because the source could not be parsed
+   * @return a cache entry containing the required data
+   * @throws AnalysisException if data could not be returned because the source could not be
+   *           resolved
    */
-  Object internalGetDartParseData(Source source, DartEntry dartEntry, DataDescriptor descriptor, Object defaultValue) {
-    if (dartEntry == null) {
-      return defaultValue;
-    }
+  DartEntry internalCacheDartParseData(Source source, DartEntry dartEntry, DataDescriptor<Object> descriptor) {
     CacheState state = dartEntry.getState(descriptor);
     while (state != CacheState.ERROR && state != CacheState.VALID) {
       dartEntry = internalParseDart(source);
       state = dartEntry.getState(descriptor);
     }
+    return dartEntry;
+  }
+
+  /**
+   * Given a source for a Dart file and the library that contains it, return a cache entry in which
+   * all of the data represented by the given descriptors is available. This method assumes that the
+   * data can be produced by resolving the source in the context of the library if it is not already
+   * cached.
+   *
+   * @param unitSource the source representing the Dart file
+   * @param librarySource the source representing the library containing the Dart file
+   * @param dartEntry the cache entry associated with the Dart file
+   * @param descriptor the descriptor representing the data to be returned
+   * @return the requested data about the given source
+   * @throws AnalysisException if data could not be returned because the source could not be parsed
+   */
+  DartEntry internalCacheDartResolutionData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor<Object> descriptor) {
+    CacheState state = dartEntry.getState2(descriptor, librarySource);
+    while (state != CacheState.ERROR && state != CacheState.VALID) {
+      dartEntry = internalResolveDart(unitSource, librarySource);
+      state = dartEntry.getState2(descriptor, librarySource);
+    }
+    return dartEntry;
+  }
+
+  /**
+   * Given a source for an HTML file, return a cache entry in which all of the data represented by
+   * the given descriptors is available. This method assumes that the data can be produced by
+   * parsing the source if it is not already cached.
+   *
+   * @param source the source representing the HTML file
+   * @param htmlEntry the cache entry associated with the HTML file
+   * @param descriptor the descriptor representing the data to be returned
+   * @return a cache entry containing the required data
+   * @throws AnalysisException if data could not be returned because the source could not be
+   *           resolved
+   */
+  HtmlEntry internalCacheHtmlParseData(Source source, HtmlEntry htmlEntry, List<DataDescriptor<Object>> descriptors) {
+    while (!hasHtmlParseDataCached(htmlEntry, descriptors)) {
+      htmlEntry = internalParseHtml(source);
+    }
+    return htmlEntry;
+  }
+
+  /**
+   * Given a source for a Dart file, return the data represented by the given descriptor that is
+   * associated with that source. This method assumes that the data can be produced by parsing the
+   * source if it is not already cached.
+   *
+   * @param source the source representing the Dart file
+   * @param dartEntry the cache entry associated with the Dart file
+   * @param descriptor the descriptor representing the data to be returned
+   * @return the requested data about the given source
+   * @throws AnalysisException if data could not be returned because the source could not be parsed
+   */
+  Object internalGetDartParseData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry = internalCacheDartParseData(source, dartEntry, descriptor);
     return dartEntry.getValue(descriptor);
   }
 
@@ -3112,7 +3431,51 @@
    * @return the requested data about the given source
    * @throws AnalysisException if data could not be returned because the source could not be parsed
    */
-  Object internalGetDartParseData2(Source source, DataDescriptor descriptor, Object defaultValue) => internalGetDartParseData(source, getReadableDartEntry(source), descriptor, defaultValue);
+  Object internalGetDartParseData2(Source source, DataDescriptor descriptor, Object defaultValue) {
+    DartEntry dartEntry = getReadableDartEntry(source);
+    if (dartEntry == null) {
+      return defaultValue;
+    }
+    return internalGetDartParseData(source, dartEntry, descriptor);
+  }
+
+  /**
+   * Given a source for a Dart file and the library that contains it, return the data represented by
+   * the given descriptor that is associated with that source. This method assumes that the data can
+   * be produced by resolving the source in the context of the library if it is not already cached.
+   *
+   * @param unitSource the source representing the Dart file
+   * @param librarySource the source representing the library containing the Dart file
+   * @param dartEntry the entry representing the Dart file
+   * @param descriptor the descriptor representing the data to be returned
+   * @return the requested data about the given source
+   * @throws AnalysisException if data could not be returned because the source could not be parsed
+   */
+  Object internalGetDartResolutionData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry = internalCacheDartResolutionData(unitSource, librarySource, dartEntry, descriptor);
+    return dartEntry.getValue2(descriptor, librarySource);
+  }
+
+  /**
+   * Given a source for a Dart file and the library that contains it, return the data represented by
+   * the given descriptor that is associated with that source. This method assumes that the data can
+   * be produced by resolving the source in the context of the library if it is not already cached.
+   *
+   * @param unitSource the source representing the Dart file
+   * @param librarySource the source representing the library containing the Dart file
+   * @param descriptor the descriptor representing the data to be returned
+   * @param defaultValue the value to be returned if the file is not a Dart file
+   * @return the requested data about the given source
+   * @throws AnalysisException if data could not be returned because the source could not be parsed
+   */
+  Object internalGetDartResolutionData2(Source unitSource, Source librarySource, DataDescriptor descriptor, Object defaultValue) {
+    DartEntry dartEntry = getReadableDartEntry(unitSource);
+    if (dartEntry == null) {
+      return defaultValue;
+    }
+    dartEntry = internalCacheDartResolutionData(unitSource, librarySource, dartEntry, descriptor);
+    return dartEntry.getValue(descriptor);
+  }
 
   /**
    * Given a source for an HTML file, return the data represented by the given descriptor that is
@@ -3130,9 +3493,30 @@
     if (htmlEntry == null) {
       return defaultValue;
     }
+    htmlEntry = internalCacheHtmlParseData(source, htmlEntry, [descriptor]);
+    return htmlEntry.getValue(descriptor);
+  }
+
+  /**
+   * Given a source for an HTML file, return the data represented by the given descriptor that is
+   * associated with that source, or the given default value if the source is not an HTML file. This
+   * method assumes that the data can be produced by resolving the source if it is not already
+   * cached.
+   *
+   * @param source the source representing the HTML file
+   * @param descriptor the descriptor representing the data to be returned
+   * @param defaultValue the value to be returned if the source is not an HTML file
+   * @return the requested data about the given source
+   * @throws AnalysisException if data could not be returned because the source could not be
+   *           resolved
+   */
+  Object internalGetHtmlResolutionData(Source source, HtmlEntry htmlEntry, DataDescriptor descriptor, Object defaultValue) {
+    if (htmlEntry == null) {
+      return defaultValue;
+    }
     CacheState state = htmlEntry.getState(descriptor);
     while (state != CacheState.ERROR && state != CacheState.VALID) {
-      htmlEntry = internalParseHtml(source);
+      htmlEntry = internalResolveHtml(source);
       state = htmlEntry.getState(descriptor);
     }
     return htmlEntry.getValue(descriptor);
@@ -3254,16 +3638,22 @@
     } on AnalysisException catch (exception) {
       thrownException = exception;
     }
-    DartEntryImpl dartCopy = null;
+    DartEntry dartEntry = null;
     {
       SourceEntry sourceEntry = _sourceMap[source];
       if (sourceEntry is! DartEntry) {
         throw new AnalysisException.con1("Internal error: attempting to parse non-Dart file as a Dart file: ${source.fullName}");
       }
+      dartEntry = sourceEntry as DartEntry;
       accessed(source);
-      int resultTime = scanResult == null ? source.modificationStamp : scanResult.modificationTime;
-      if (sourceEntry.modificationTime == resultTime) {
-        dartCopy = ((sourceEntry as DartEntry)).writableCopy;
+      int sourceTime = source.modificationStamp;
+      int resultTime = scanResult == null ? sourceTime : scanResult.modificationTime;
+      if (sourceTime == resultTime) {
+        if (dartEntry.modificationTime != sourceTime) {
+          sourceChanged(source);
+          dartEntry = getReadableDartEntry(source);
+        }
+        DartEntryImpl dartCopy = dartEntry.writableCopy;
         if (thrownException == null) {
           dartCopy.setValue(SourceEntry.LINE_INFO, lineInfo);
           if (hasPartOfDirective && !hasLibraryDirective) {
@@ -3280,13 +3670,16 @@
           dartCopy.recordParseError();
         }
         _sourceMap[source] = dartCopy;
+        dartEntry = dartCopy;
       }
     }
     if (thrownException != null) {
-      AnalysisEngine.instance.logger.logError2("Could not parse ${source.fullName}", thrownException);
+      if (thrownException.cause is! JavaIOException) {
+        AnalysisEngine.instance.logger.logError2("Could not parse ${source.fullName}", thrownException);
+      }
       throw thrownException;
     }
-    return dartCopy;
+    return dartEntry;
   }
 
   /**
@@ -3308,16 +3701,22 @@
     } on AnalysisException catch (exception) {
       thrownException = exception;
     }
-    HtmlEntryImpl htmlCopy = null;
+    HtmlEntry htmlEntry = null;
     {
       SourceEntry sourceEntry = _sourceMap[source];
       if (sourceEntry is! HtmlEntry) {
         throw new AnalysisException.con1("Internal error: attempting to parse non-HTML file as a HTML file: ${source.fullName}");
       }
+      htmlEntry = sourceEntry as HtmlEntry;
       accessed(source);
-      int resultTime = result == null ? source.modificationStamp : result.modificationTime;
-      if (sourceEntry.modificationTime == resultTime) {
-        htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
+      int sourceTime = source.modificationStamp;
+      int resultTime = result == null ? sourceTime : result.modificationTime;
+      if (sourceTime == resultTime) {
+        if (htmlEntry.modificationTime != sourceTime) {
+          sourceChanged(source);
+          htmlEntry = getReadableHtmlEntry(source);
+        }
+        HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
         if (thrownException == null) {
           HtmlUnit unit = result.htmlUnit;
           htmlCopy.setValue(SourceEntry.LINE_INFO, lineInfo);
@@ -3329,6 +3728,7 @@
           htmlCopy.setState(HtmlEntry.REFERENCED_LIBRARIES, CacheState.ERROR);
         }
         _sourceMap[source] = htmlCopy;
+        htmlEntry = htmlCopy;
       }
     }
     if (thrownException != null) {
@@ -3336,8 +3736,116 @@
       throw thrownException;
     }
     ChangeNoticeImpl notice = getNotice(source);
-    notice.setErrors(htmlCopy.allErrors, lineInfo);
-    return htmlCopy;
+    notice.setErrors(htmlEntry.allErrors, lineInfo);
+    return htmlEntry;
+  }
+  DartEntry internalResolveDart(Source unitSource, Source librarySource) {
+    DartEntry dartEntry = getReadableDartEntry(unitSource);
+    if (dartEntry == null) {
+      throw new AnalysisException.con1("Internal error: attempting to parse non-Dart file as a Dart file: ${unitSource.fullName}");
+    }
+    LibraryResolver resolver = null;
+    AnalysisException thrownException = null;
+    try {
+      resolver = new LibraryResolver(this);
+      resolver.resolveLibrary(librarySource, true);
+    } on AnalysisException catch (exception) {
+      thrownException = exception;
+    }
+    if (thrownException == null) {
+      {
+        accessed(unitSource);
+      }
+      recordResolutionResults(resolver);
+      dartEntry = getReadableDartEntry(unitSource);
+    } else {
+      AnalysisEngine.instance.logger.logError2("Could not resolve ${unitSource.fullName}", thrownException);
+      bool unitIsLibrary = unitSource == librarySource;
+      DartEntryImpl dartCopy = dartEntry.writableCopy;
+      dartCopy.setState2(DartEntry.RESOLUTION_ERRORS, librarySource, CacheState.ERROR);
+      if (unitIsLibrary) {
+        dartCopy.setState(DartEntry.ELEMENT, CacheState.ERROR);
+      }
+      _sourceMap[unitSource] = dartCopy;
+      if (!unitIsLibrary) {
+        DartEntry libraryEntry = getReadableDartEntry(librarySource);
+        if (libraryEntry != null) {
+          DartEntryImpl libraryCopy = dartEntry.writableCopy;
+          libraryCopy.setState2(DartEntry.RESOLUTION_ERRORS, librarySource, CacheState.ERROR);
+          libraryCopy.setState(DartEntry.ELEMENT, CacheState.ERROR);
+          _sourceMap[librarySource] = libraryCopy;
+        }
+      }
+      throw thrownException;
+    }
+    ChangeNoticeImpl notice = getNotice(unitSource);
+    notice.setErrors(dartEntry.allErrors, dartEntry.getValue(SourceEntry.LINE_INFO));
+    return dartEntry;
+  }
+
+  /**
+   * Scan and parse the given HTML file, updating the cache as appropriate, and return the updated
+   * cache entry associated with the source.
+   *
+   * @param source the source representing the HTML file to be parsed
+   * @return the updated cache entry associated with the source
+   * @throws AnalysisException if the source does not represent an HTML file or if the file cannot
+   *           be parsed for some reason
+   */
+  HtmlEntry internalResolveHtml(Source source) {
+    HtmlEntry htmlEntry = getReadableHtmlEntry(source);
+    if (htmlEntry == null) {
+      throw new AnalysisException.con1("Internal error: attempting to parse non-HTML file as a HTML file: ${source.fullName}");
+    }
+    int resultTime = 0;
+    HtmlElement element = null;
+    List<AnalysisError> resolutionErrors = null;
+    AnalysisException thrownException = null;
+    try {
+      htmlEntry = internalCacheHtmlParseData(source, htmlEntry, [HtmlEntry.PARSED_UNIT]);
+      HtmlUnit unit = htmlEntry.getValue(HtmlEntry.PARSED_UNIT);
+      if (unit == null) {
+        throw new AnalysisException.con1("Internal error: internalCacheHtmlParseData returned an entry without a parsed HTML unit");
+      }
+      resultTime = htmlEntry.modificationTime;
+      HtmlUnitBuilder builder = new HtmlUnitBuilder(this);
+      element = builder.buildHtmlElement2(source, unit);
+      resolutionErrors = builder.errorListener.getErrors2(source);
+    } on AnalysisException catch (exception) {
+      thrownException = exception;
+    }
+    {
+      SourceEntry sourceEntry = _sourceMap[source];
+      if (sourceEntry is! HtmlEntry) {
+        throw new AnalysisException.con1("Internal error: attempting to resolve non-HTML file as a HTML file: ${source.fullName}");
+      }
+      htmlEntry = sourceEntry as HtmlEntry;
+      accessed(source);
+      int sourceTime = source.modificationStamp;
+      if (sourceTime == resultTime) {
+        if (htmlEntry.modificationTime != sourceTime) {
+          sourceChanged(source);
+          htmlEntry = getReadableHtmlEntry(source);
+        }
+        HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+        if (thrownException == null) {
+          htmlCopy.setValue(HtmlEntry.RESOLUTION_ERRORS, resolutionErrors);
+          htmlCopy.setValue(HtmlEntry.ELEMENT, element);
+        } else {
+          htmlCopy.setState(HtmlEntry.RESOLUTION_ERRORS, CacheState.ERROR);
+          htmlCopy.setState(HtmlEntry.ELEMENT, CacheState.ERROR);
+        }
+        _sourceMap[source] = htmlCopy;
+        htmlEntry = htmlCopy;
+      }
+    }
+    if (thrownException != null) {
+      AnalysisEngine.instance.logger.logError2("Could not resolve ${source.fullName}", thrownException);
+      throw thrownException;
+    }
+    ChangeNoticeImpl notice = getNotice(source);
+    notice.setErrors(htmlEntry.allErrors, htmlEntry.getValue(SourceEntry.LINE_INFO));
+    return htmlEntry;
   }
   AnalysisContextImpl_ScanResult internalScan(Source source, AnalysisErrorListener errorListener) {
     AnalysisContextImpl_ScanResult result = new AnalysisContextImpl_ScanResult();
@@ -3425,6 +3933,20 @@
   }
 
   /**
+   * Return `true` if the given source is in the array of priority sources.
+   *
+   * Note: This method must only be invoked while we are synchronized on [cacheLock].
+   */
+  bool isPrioritySource(Source source) {
+    for (Source prioritySource in _priorityOrder) {
+      if (source == prioritySource) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
    * Perform a single analysis task.
    *
    * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
@@ -3436,19 +3958,34 @@
       SourceEntry sourceEntry = _sourceMap[source];
       if (sourceEntry is DartEntry) {
         DartEntry dartEntry = sourceEntry as DartEntry;
-        if (identical(dartEntry.getState(DartEntry.PARSED_UNIT), CacheState.INVALID)) {
+        CacheState parsedUnitState = dartEntry.getState(DartEntry.PARSED_UNIT);
+        if (identical(parsedUnitState, CacheState.INVALID) || identical(parsedUnitState, CacheState.FLUSHED)) {
           safelyParseCompilationUnit(source, dartEntry);
           return true;
-        } else if (identical(dartEntry.getState(DartEntry.RESOLVED_UNIT), CacheState.INVALID)) {
-          safelyResolveCompilationUnit(source);
-          return true;
+        }
+        for (Source librarySource in getLibrariesContaining(source)) {
+          SourceEntry libraryEntry = _sourceMap[librarySource];
+          if (libraryEntry is DartEntry) {
+            CacheState elementState = libraryEntry.getState(DartEntry.ELEMENT);
+            if (identical(elementState, CacheState.INVALID) || identical(elementState, CacheState.FLUSHED)) {
+              safelyResolveCompilationUnit(librarySource);
+              return true;
+            }
+          }
+          if (identical(dartEntry.getState2(DartEntry.RESOLVED_UNIT, librarySource), CacheState.FLUSHED)) {
+            safelyResolveCompilationUnit2(source, librarySource);
+            return true;
+          }
         }
       } else if (sourceEntry is HtmlEntry) {
         HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
-        if (identical(htmlEntry.getState(HtmlEntry.PARSED_UNIT), CacheState.INVALID)) {
+        CacheState parsedUnitState = htmlEntry.getState(HtmlEntry.PARSED_UNIT);
+        if (identical(parsedUnitState, CacheState.INVALID) || identical(parsedUnitState, CacheState.FLUSHED)) {
           safelyParseHtmlUnit(source);
           return true;
-        } else if (identical(htmlEntry.getState(HtmlEntry.ELEMENT), CacheState.INVALID)) {
+        }
+        CacheState elementState = htmlEntry.getState(HtmlEntry.ELEMENT);
+        if (identical(elementState, CacheState.INVALID) || identical(elementState, CacheState.FLUSHED)) {
           safelyResolveHtmlUnit(source);
           return true;
         }
@@ -3529,18 +4066,24 @@
         {
           DartEntry dartEntry = getDartEntry(source);
           if (dartEntry != null) {
-            DartEntryImpl dartCopy = dartEntry.writableCopy;
-            dartCopy.setValue(SourceEntry.LINE_INFO, lineInfo);
-            dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
-            dartCopy.setValue2(DartEntry.RESOLVED_UNIT, librarySource, unit);
-            dartCopy.setValue2(DartEntry.RESOLUTION_ERRORS, librarySource, errors);
-            if (identical(source, librarySource)) {
-              recordElementData(dartCopy, library.libraryElement, htmlSource);
+            int sourceTime = source.modificationStamp;
+            int resultTime = dartEntry.modificationTime;
+            if (sourceTime == resultTime) {
+              DartEntryImpl dartCopy = dartEntry.writableCopy;
+              dartCopy.setValue(SourceEntry.LINE_INFO, lineInfo);
+              dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
+              dartCopy.setValue2(DartEntry.RESOLVED_UNIT, librarySource, unit);
+              dartCopy.setValue2(DartEntry.RESOLUTION_ERRORS, librarySource, errors);
+              if (identical(source, librarySource)) {
+                recordElementData(dartCopy, library.libraryElement, htmlSource);
+              }
+              _sourceMap[source] = dartCopy;
+              ChangeNoticeImpl notice = getNotice(source);
+              notice.compilationUnit = unit;
+              notice.setErrors(dartCopy.allErrors, lineInfo);
+            } else {
+              sourceChanged(source);
             }
-            _sourceMap[source] = dartCopy;
-            ChangeNoticeImpl notice = getNotice(source);
-            notice.compilationUnit = unit;
-            notice.setErrors(dartCopy.allErrors, lineInfo);
           }
         }
       }
@@ -3548,6 +4091,26 @@
   }
 
   /**
+   * Remove and return one source from the list of recently used sources whose AST structure can be
+   * flushed from the cache. The source that will be returned will be the source that has been
+   * unreferenced for the longest period of time but that is not a priority for analysis.
+   *
+   * @return the source that was removed
+   *
+   *         Note: This method must only be invoked while we are synchronized on [cacheLock].
+   */
+  Source removeAstToFlush() {
+    for (int i = 0; i < _recentlyUsed.length; i++) {
+      Source source = _recentlyUsed[i];
+      if (!isPrioritySource(source)) {
+        return _recentlyUsed.removeAt(i);
+      }
+    }
+    AnalysisEngine.instance.logger.logError2("Internal error: The number of priority sources is greater than the maximum cache size", new JavaException());
+    return _recentlyUsed.removeAt(0);
+  }
+
+  /**
    * Return the result of resolving the URI of the given URI-based directive against the URI of the
    * given library, or `null` if the URI is not valid.
    *
@@ -3564,6 +4127,7 @@
     if (uriContent == null) {
       return null;
     }
+    uriContent = Uri.encodeFull(uriContent);
     try {
       parseUriWithException(uriContent);
       return _sourceFactory.resolveUri(librarySource, uriContent);
@@ -3585,7 +4149,9 @@
     try {
       internalParseCompilationUnit(dartCopy, source);
     } on AnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logError2("Could not parse ${source.fullName}", exception);
+      if (exception.cause is! JavaIOException) {
+        AnalysisEngine.instance.logger.logError2("Could not parse ${source.fullName}", exception);
+      }
     }
     _sourceMap[source] = dartCopy;
   }
@@ -3620,6 +4186,25 @@
   }
 
   /**
+   * Resolve the given source within the given library and update the cache.
+   *
+   * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
+   *
+   * @param unitSource the source to be resolved
+   * @param librarySource the source
+   */
+  void safelyResolveCompilationUnit2(Source unitSource, Source librarySource) {
+    try {
+      resolveCompilationUnit2(unitSource, librarySource);
+    } on AnalysisException catch (exception) {
+      DartEntryImpl dartCopy = getReadableDartEntry(unitSource).writableCopy;
+      dartCopy.recordResolutionError();
+      _sourceMap[unitSource] = dartCopy;
+      AnalysisEngine.instance.logger.logError2("Could not resolve ${unitSource.fullName} in ${librarySource.fullName}", exception);
+    }
+  }
+
+  /**
    * Resolve the given source and update the cache.
    *
    * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
@@ -3733,6 +4318,164 @@
   }
 }
 /**
+ * The interface `AnalysisTask` defines the behavior of objects used to perform an analysis
+ * task.
+ */
+abstract class AnalysisContextImpl_AnalysisTask {
+
+  /**
+   * Perform a single analysis task. Implementors should assume that the cache is not locked.
+   */
+  void perform();
+}
+/**
+ * Instances of the class `ParseDartTask` parse a specific source as a Dart file.
+ */
+class AnalysisContextImpl_ParseDartTask implements AnalysisContextImpl_AnalysisTask {
+  final AnalysisContextImpl AnalysisContextImpl_this;
+
+  /**
+   * The source to be parsed.
+   */
+  Source _source;
+
+  /**
+   * Initialize a newly created task to parse the given source as a Dart file.
+   *
+   * @param source the source to be resolved
+   */
+  AnalysisContextImpl_ParseDartTask(this.AnalysisContextImpl_this, Source source) {
+    this._source = source;
+  }
+  void perform() {
+    try {
+      AnalysisContextImpl_this.internalParseDart(_source);
+    } on AnalysisException catch (exception) {
+      AnalysisEngine.instance.logger.logError2("Could not parse ${_source.fullName}", exception);
+    }
+  }
+}
+/**
+ * Instances of the class `ParseHtmlTask` parse a specific source as an HTML file.
+ */
+class AnalysisContextImpl_ParseHtmlTask implements AnalysisContextImpl_AnalysisTask {
+  final AnalysisContextImpl AnalysisContextImpl_this;
+
+  /**
+   * The source to be parsed.
+   */
+  Source _source;
+
+  /**
+   * Initialize a newly created task to parse the given source as an HTML file.
+   *
+   * @param source the source to be resolved
+   */
+  AnalysisContextImpl_ParseHtmlTask(this.AnalysisContextImpl_this, Source source) {
+    this._source = source;
+  }
+  void perform() {
+    try {
+      AnalysisContextImpl_this.internalParseHtml(_source);
+    } on AnalysisException catch (exception) {
+      AnalysisEngine.instance.logger.logError2("Could not parse ${_source.fullName}", exception);
+    }
+  }
+}
+/**
+ * Instances of the class `ResolveDartLibraryTask` resolve a specific source as a Dart
+ * library.
+ */
+class AnalysisContextImpl_ResolveDartLibraryTask implements AnalysisContextImpl_AnalysisTask {
+  final AnalysisContextImpl AnalysisContextImpl_this;
+
+  /**
+   * The source to be resolved.
+   */
+  Source _source;
+
+  /**
+   * Initialize a newly created task to resolve the given source as a Dart file.
+   *
+   * @param source the source to be resolved
+   */
+  AnalysisContextImpl_ResolveDartLibraryTask(this.AnalysisContextImpl_this, Source source) {
+    this._source = source;
+  }
+  void perform() {
+    try {
+      AnalysisContextImpl_this.computeLibraryElement(_source);
+    } on AnalysisException catch (exception) {
+      AnalysisEngine.instance.logger.logError2("Could not resolve ${_source.fullName}", exception);
+    }
+  }
+}
+/**
+ * Instances of the class `ResolveDartUnitTask` resolve a specific source as a Dart file
+ * within a library.
+ */
+class AnalysisContextImpl_ResolveDartUnitTask implements AnalysisContextImpl_AnalysisTask {
+  final AnalysisContextImpl AnalysisContextImpl_this;
+
+  /**
+   * The source to be resolved.
+   */
+  Source _unitSource;
+
+  /**
+   * The source of the library in which the source is to be resolved.
+   */
+  Source _librarySource;
+
+  /**
+   * Initialize a newly created task to resolve the given source as a Dart file.
+   *
+   * @param unitSource the source to be resolved
+   * @param librarySource the source of the library in which the source is to be resolved
+   */
+  AnalysisContextImpl_ResolveDartUnitTask(this.AnalysisContextImpl_this, Source unitSource, Source librarySource) {
+    this._unitSource = unitSource;
+    this._librarySource = librarySource;
+  }
+  void perform() {
+    try {
+      AnalysisContextImpl_this.resolveCompilationUnit2(_unitSource, _librarySource);
+    } on AnalysisException catch (exception) {
+      DartEntryImpl dartCopy = AnalysisContextImpl_this.getReadableDartEntry(_unitSource).writableCopy;
+      dartCopy.recordResolutionError();
+      AnalysisContextImpl_this._sourceMap[_unitSource] = dartCopy;
+      AnalysisEngine.instance.logger.logError2("Could not resolve ${_unitSource.fullName} in ${_librarySource.fullName}", exception);
+    }
+  }
+}
+/**
+ * Instances of the class `ResolveHtmlTask` resolve a specific source as an HTML file.
+ */
+class AnalysisContextImpl_ResolveHtmlTask implements AnalysisContextImpl_AnalysisTask {
+  final AnalysisContextImpl AnalysisContextImpl_this;
+
+  /**
+   * The source to be resolved.
+   */
+  Source _source;
+
+  /**
+   * Initialize a newly created task to resolve the given source as an HTML file.
+   *
+   * @param source the source to be resolved
+   */
+  AnalysisContextImpl_ResolveHtmlTask(this.AnalysisContextImpl_this, Source source) {
+    this._source = source;
+  }
+  void perform() {
+    try {
+      AnalysisContextImpl_this.computeHtmlElement(_source);
+    } on AnalysisException catch (exception) {
+      AnalysisEngine.instance.logger.logError2("Could not resolve ${_source.fullName}", exception);
+    }
+  }
+}
+/**
  * Instances of the class `ScanResult` represent the results of scanning a source.
  */
 class AnalysisContextImpl_ScanResult {
@@ -3786,7 +4529,7 @@
             libraries.add(librarySource);
           }
         } catch (exception) {
-          AnalysisEngine.instance.logger.logError2("Invalid URL ('${scriptAttribute.text}') in script tag in '${htmlSource.fullName}'", exception);
+          AnalysisEngine.instance.logger.logInformation2("Invalid URL ('${scriptAttribute.text}') in script tag in '${htmlSource.fullName}'", exception);
         }
       }
     }
@@ -3903,7 +4646,7 @@
 /**
  * The enumeration `CacheState` defines the possible states of cached data.
  */
-class CacheState implements Comparable<CacheState> {
+class CacheState implements Enum<CacheState> {
 
   /**
    * The data is not in the cache and the last time an attempt was made to compute the data an
@@ -4582,7 +5325,7 @@
       }
       return ret;
     } finally {
-      instrumentation.log();
+      instrumentation.log2(2);
     }
   }
   List<Source> getLibrariesDependingOn(Source librarySource) {
@@ -4646,7 +5389,7 @@
       instrumentation.metric3("contextId", _contextId);
       return _basis.getResolvedCompilationUnit2(unitSource, librarySource);
     } finally {
-      instrumentation.log();
+      instrumentation.log2(2);
     }
   }
   SourceFactory get sourceFactory {
@@ -4655,9 +5398,10 @@
       instrumentation.metric3("contextId", _contextId);
       return _basis.sourceFactory;
     } finally {
-      instrumentation.log();
+      instrumentation.log2(2);
     }
   }
+  AnalysisContentStatistics get statistics => _basis.statistics;
   bool isClientLibrary(Source librarySource) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-isClientLibrary");
     try {
@@ -4722,7 +5466,7 @@
       }
       return ret;
     } finally {
-      instrumentation.log();
+      instrumentation.log2(2);
     }
   }
   void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
@@ -4888,6 +5632,11 @@
   Namespace getPublicNamespace2(Source source);
 
   /**
+   * Returns a statistics about this context.
+   */
+  AnalysisContentStatistics get statistics;
+
+  /**
    * Given a table mapping the source for the libraries represented by the corresponding elements to
    * the elements representing the libraries, record those mappings.
    *
@@ -4971,12 +5720,12 @@
 class ResolutionEraser extends GeneralizingASTVisitor<Object> {
   Object visitAssignmentExpression(AssignmentExpression node) {
     node.staticElement = null;
-    node.element = null;
+    node.propagatedElement = null;
     return super.visitAssignmentExpression(node);
   }
   Object visitBinaryExpression(BinaryExpression node) {
     node.staticElement = null;
-    node.element = null;
+    node.propagatedElement = null;
     return super.visitBinaryExpression(node);
   }
   Object visitCompilationUnit(CompilationUnit node) {
@@ -5007,12 +5756,12 @@
   }
   Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.staticElement = null;
-    node.element = null;
+    node.propagatedElement = null;
     return super.visitFunctionExpressionInvocation(node);
   }
   Object visitIndexExpression(IndexExpression node) {
     node.staticElement = null;
-    node.element = null;
+    node.propagatedElement = null;
     return super.visitIndexExpression(node);
   }
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
@@ -5022,12 +5771,12 @@
   }
   Object visitPostfixExpression(PostfixExpression node) {
     node.staticElement = null;
-    node.element = null;
+    node.propagatedElement = null;
     return super.visitPostfixExpression(node);
   }
   Object visitPrefixExpression(PrefixExpression node) {
     node.staticElement = null;
-    node.element = null;
+    node.propagatedElement = null;
     return super.visitPrefixExpression(node);
   }
   Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
diff --git a/pkg/analyzer_experimental/lib/src/generated/error.dart b/pkg/analyzer_experimental/lib/src/generated/error.dart
index 9729ec5..22e3162 100644
--- a/pkg/analyzer_experimental/lib/src/generated/error.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/error.dart
@@ -11,7 +11,7 @@
  *
  * @coverage dart.engine.error
  */
-class ErrorSeverity implements Comparable<ErrorSeverity> {
+class ErrorSeverity implements Enum<ErrorSeverity> {
 
   /**
    * The severity representing a non-error. This is never used for any error code, but is useful for
@@ -405,7 +405,7 @@
  * The enumeration `ErrorProperty` defines the properties that can be associated with an
  * [AnalysisError].
  */
-class ErrorProperty implements Comparable<ErrorProperty> {
+class ErrorProperty implements Enum<ErrorProperty> {
 
   /**
    * A property whose value is an array of [ExecutableElement] that should
@@ -428,7 +428,7 @@
  * The enumeration `HintCode` defines the hints and coding recommendations for best practices
  * which are not mentioned in the Dart Language Specification.
  */
-class HintCode implements Comparable<HintCode>, ErrorCode {
+class HintCode implements Enum<HintCode>, ErrorCode {
 
   /**
    * Dead code is code that is never reached, this can happen for instance if a statement follows a
@@ -450,10 +450,16 @@
    * @param supertypeName name of the supertype
    */
   static final HintCode DEAD_CODE_ON_CATCH_SUBTYPE = new HintCode('DEAD_CODE_ON_CATCH_SUBTYPE', 2, "Dead code, this on-catch block will never be executed since '%s' is a subtype of '%s'");
+
+  /**
+   * Unused imports are imports which are never not used.
+   */
+  static final HintCode UNUSED_IMPORT = new HintCode('UNUSED_IMPORT', 3, "Unused import");
   static final List<HintCode> values = [
       DEAD_CODE,
       DEAD_CODE_CATCH_FOLLOWING_CATCH,
-      DEAD_CODE_ON_CATCH_SUBTYPE];
+      DEAD_CODE_ON_CATCH_SUBTYPE,
+      UNUSED_IMPORT];
 
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
@@ -515,7 +521,7 @@
  *
  * @coverage dart.engine.error
  */
-class ErrorType implements Comparable<ErrorType> {
+class ErrorType implements Enum<ErrorType> {
 
   /**
    * Extra analysis run over the code to follow best practices, which are not in the Dart Language
@@ -597,7 +603,7 @@
  *
  * @coverage dart.engine.error
  */
-class CompileTimeErrorCode implements Comparable<CompileTimeErrorCode>, ErrorCode {
+class CompileTimeErrorCode implements Enum<CompileTimeErrorCode>, ErrorCode {
 
   /**
    * 14.2 Exports: It is a compile-time error if a name <i>N</i> is re-exported by a library
@@ -611,28 +617,12 @@
   static final CompileTimeErrorCode AMBIGUOUS_EXPORT = new CompileTimeErrorCode('AMBIGUOUS_EXPORT', 0, "The element '%s' is defined in the libraries '%s' and '%s'");
 
   /**
-   * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and <i>N</i> is introduced
-   * into the top level scope <i>L</i> by more than one import then:
-   * <ol>
-   * * It is a static warning if <i>N</i> is used as a type annotation.
-   * * In checked mode, it is a dynamic error if <i>N</i> is used as a type annotation and
-   * referenced during a subtype test.
-   * * Otherwise, it is a compile-time error.
-   * </ol>
-   *
-   * @param ambiguousElementName the name of the ambiguous element
-   * @param firstLibraryName the name of the first library that the type is found
-   * @param secondLibraryName the name of the second library that the type is found
-   */
-  static final CompileTimeErrorCode AMBIGUOUS_IMPORT = new CompileTimeErrorCode('AMBIGUOUS_IMPORT', 1, "The element '%s' is defined in the libraries '%s' and '%s'");
-
-  /**
    * 12.33 Argument Definition Test: It is a compile time error if <i>v</i> does not denote a formal
    * parameter.
    *
    * @param the name of the identifier in the argument definition test that is not a parameter
    */
-  static final CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER = new CompileTimeErrorCode('ARGUMENT_DEFINITION_TEST_NON_PARAMETER', 2, "'%s' is not a parameter");
+  static final CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER = new CompileTimeErrorCode('ARGUMENT_DEFINITION_TEST_NON_PARAMETER', 1, "'%s' is not a parameter");
 
   /**
    * 12.14.2 Binding Actuals to Formals: In checked mode, it is a dynamic type error if
@@ -645,57 +635,57 @@
    * @param requiredCount the maximum number of positional arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static final CompileTimeErrorCode ARGUMENT_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode('ARGUMENT_TYPE_NOT_ASSIGNABLE', 3, "The argument type '%s' cannot be assigned to the parameter type '%s'");
+  static final CompileTimeErrorCode ARGUMENT_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode('ARGUMENT_TYPE_NOT_ASSIGNABLE', 2, "The argument type '%s' cannot be assigned to the parameter type '%s'");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error to use a built-in identifier other than
    * dynamic as a type annotation.
    */
-  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE', 4, "The built-in identifier '%s' cannot be as a type");
+  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE', 3, "The built-in identifier '%s' cannot be as a type");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_NAME = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE_NAME', 5, "The built-in identifier '%s' cannot be used as a type name");
+  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_NAME = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE_NAME', 4, "The built-in identifier '%s' cannot be used as a type name");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME', 6, "The built-in identifier '%s' cannot be used as a type alias name");
+  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME', 5, "The built-in identifier '%s' cannot be used as a type alias name");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME', 7, "The built-in identifier '%s' cannot be used as a type variable name");
+  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME = new CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME', 6, "The built-in identifier '%s' cannot be used as a type variable name");
 
   /**
    * 13.9 Switch: It is a compile-time error if the class <i>C</i> implements the operator
    * <i>==</i>.
    */
-  static final CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = new CompileTimeErrorCode('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 8, "The switch case expression type '%s' cannot override the == operator");
+  static final CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = new CompileTimeErrorCode('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 7, "The switch case expression type '%s' cannot override the == operator");
 
   /**
    * 12.1 Constants: It is a compile-time error if evaluation of a compile-time constant would raise
    * an exception.
    */
-  static final CompileTimeErrorCode COMPILE_TIME_CONSTANT_RAISES_EXCEPTION = new CompileTimeErrorCode('COMPILE_TIME_CONSTANT_RAISES_EXCEPTION', 9, "");
+  static final CompileTimeErrorCode COMPILE_TIME_CONSTANT_RAISES_EXCEPTION = new CompileTimeErrorCode('COMPILE_TIME_CONSTANT_RAISES_EXCEPTION', 8, "");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
    * name. This restriction holds regardless of whether the getter is defined explicitly or
    * implicitly, or whether the getter or the method are inherited or not.
    */
-  static final CompileTimeErrorCode CONFLICTING_GETTER_AND_METHOD = new CompileTimeErrorCode('CONFLICTING_GETTER_AND_METHOD', 10, "Class '%s' cannot have both getter '%s.%s' and method with the same name");
+  static final CompileTimeErrorCode CONFLICTING_GETTER_AND_METHOD = new CompileTimeErrorCode('CONFLICTING_GETTER_AND_METHOD', 9, "Class '%s' cannot have both getter '%s.%s' and method with the same name");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
    * name. This restriction holds regardless of whether the getter is defined explicitly or
    * implicitly, or whether the getter or the method are inherited or not.
    */
-  static final CompileTimeErrorCode CONFLICTING_METHOD_AND_GETTER = new CompileTimeErrorCode('CONFLICTING_METHOD_AND_GETTER', 11, "Class '%s' cannot have both method '%s.%s' and getter with the same name");
+  static final CompileTimeErrorCode CONFLICTING_METHOD_AND_GETTER = new CompileTimeErrorCode('CONFLICTING_METHOD_AND_GETTER', 10, "Class '%s' cannot have both method '%s.%s' and getter with the same name");
 
   /**
    * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
@@ -703,7 +693,7 @@
    * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
    * class.
    */
-  static final CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD = new CompileTimeErrorCode('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD', 12, "'%s' cannot be used to name a constructor and a field in this class");
+  static final CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD = new CompileTimeErrorCode('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD', 11, "'%s' cannot be used to name a constructor and a field in this class");
 
   /**
    * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
@@ -711,13 +701,13 @@
    * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
    * class.
    */
-  static final CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD = new CompileTimeErrorCode('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD', 13, "'%s' cannot be used to name a constructor and a method in this class");
+  static final CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD = new CompileTimeErrorCode('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD', 12, "'%s' cannot be used to name a constructor and a method in this class");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static final CompileTimeErrorCode CONST_CONSTRUCTOR_THROWS_EXCEPTION = new CompileTimeErrorCode('CONST_CONSTRUCTOR_THROWS_EXCEPTION', 14, "'const' constructors cannot throw exceptions");
+  static final CompileTimeErrorCode CONST_CONSTRUCTOR_THROWS_EXCEPTION = new CompileTimeErrorCode('CONST_CONSTRUCTOR_THROWS_EXCEPTION', 13, "'const' constructors cannot throw exceptions");
 
   /**
    * 7.6.3 Constant Constructors: It is a compile-time error if a constant constructor is declared
@@ -725,7 +715,7 @@
    *
    * The above refers to both locally declared and inherited instance variables.
    */
-  static final CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = new CompileTimeErrorCode('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 15, "Cannot define the 'const' constructor for a class with non-final fields");
+  static final CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = new CompileTimeErrorCode('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 14, "Cannot define the 'const' constructor for a class with non-final fields");
 
   /**
    * 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error if o is not
@@ -738,63 +728,63 @@
    * @param initializerType the name of the type of the initializer expression
    * @param fieldType the name of the type of the field
    */
-  static final CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = new CompileTimeErrorCode('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 16, "The initializer type '%s' cannot be assigned to the field type '%s'");
+  static final CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = new CompileTimeErrorCode('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 15, "The initializer type '%s' cannot be assigned to the field type '%s'");
 
   /**
    * 6.2 Formal Parameters: It is a compile-time error if a formal parameter is declared as a
    * constant variable.
    */
-  static final CompileTimeErrorCode CONST_FORMAL_PARAMETER = new CompileTimeErrorCode('CONST_FORMAL_PARAMETER', 17, "Parameters cannot be 'const'");
+  static final CompileTimeErrorCode CONST_FORMAL_PARAMETER = new CompileTimeErrorCode('CONST_FORMAL_PARAMETER', 16, "Parameters cannot be 'const'");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant or a
    * compile-time error occurs.
    */
-  static final CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = new CompileTimeErrorCode('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 18, "'const' variables must be constant value");
+  static final CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = new CompileTimeErrorCode('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 17, "'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', 19, "Only static fields can be declared as 'const'");
+  static final CompileTimeErrorCode CONST_INSTANCE_FIELD = new CompileTimeErrorCode('CONST_INSTANCE_FIELD', 18, "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', 20, "An expression of type 'bool' was expected");
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = new CompileTimeErrorCode('CONST_EVAL_TYPE_BOOL', 19, "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', 21, "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', 20, "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', 22, "An expression of type 'int' was expected");
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_INT = new CompileTimeErrorCode('CONST_EVAL_TYPE_INT', 21, "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', 23, "An expression of type 'num' was expected");
+  static final CompileTimeErrorCode CONST_EVAL_TYPE_NUM = new CompileTimeErrorCode('CONST_EVAL_TYPE_NUM', 22, "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', 24, "Evaluation of this constant expression causes exception");
+  static final CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = new CompileTimeErrorCode('CONST_EVAL_THROWS_EXCEPTION', 23, "Evaluation of this constant expression causes exception");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static final CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = new CompileTimeErrorCode('CONST_EVAL_THROWS_IDBZE', 25, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
+  static final CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = new CompileTimeErrorCode('CONST_EVAL_THROWS_IDBZE', 24, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
 
   /**
    * 12.11.2 Const: If <i>T</i> is a parameterized type <i>S&lt;U<sub>1</sub>, &hellip;,
@@ -807,7 +797,7 @@
    * @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
    * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
    */
-  static final CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = new CompileTimeErrorCode('CONST_WITH_INVALID_TYPE_PARAMETERS', 26, "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', 25, "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>,
@@ -815,13 +805,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', 27, "The constructor being called is not a 'const' constructor");
+  static final CompileTimeErrorCode CONST_WITH_NON_CONST = new CompileTimeErrorCode('CONST_WITH_NON_CONST', 26, "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', 28, "Arguments of a constant creation must be constant expressions");
+  static final CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = new CompileTimeErrorCode('CONST_WITH_NON_CONSTANT_ARGUMENT', 27, "Arguments of a constant creation must be constant expressions");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
@@ -834,12 +824,12 @@
    *
    * @param name the name of the non-type element
    */
-  static final CompileTimeErrorCode CONST_WITH_NON_TYPE = new CompileTimeErrorCode('CONST_WITH_NON_TYPE', 29, "The name '%s' is not a class");
+  static final CompileTimeErrorCode CONST_WITH_NON_TYPE = new CompileTimeErrorCode('CONST_WITH_NON_TYPE', 28, "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', 30, "The constant creation cannot use a type parameter");
+  static final CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = new CompileTimeErrorCode('CONST_WITH_TYPE_PARAMETERS', 29, "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
@@ -848,7 +838,7 @@
    * @param typeName the name of the type
    * @param constructorName the name of the requested constant constructor
    */
-  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = new CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR', 31, "The class '%s' does not have a constant constructor '%s'");
+  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = new CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR', 30, "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
@@ -856,19 +846,19 @@
    *
    * @param typeName the name of the type
    */
-  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 32, "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', 31, "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', 33, "Default values aren't allowed in typedefs");
+  static final CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = new CompileTimeErrorCode('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 32, "Default values aren't allowed in typedefs");
 
   /**
    * 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', 34, "The default constructor is already defined");
+  static final CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = new CompileTimeErrorCode('DUPLICATE_CONSTRUCTOR_DEFAULT', 33, "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
@@ -876,7 +866,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static final CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = new CompileTimeErrorCode('DUPLICATE_CONSTRUCTOR_NAME', 35, "The constructor with name '%s' is already defined");
+  static final CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = new CompileTimeErrorCode('DUPLICATE_CONSTRUCTOR_NAME', 34, "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
@@ -889,7 +879,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static final CompileTimeErrorCode DUPLICATE_DEFINITION = new CompileTimeErrorCode('DUPLICATE_DEFINITION', 36, "The name '%s' is already defined");
+  static final CompileTimeErrorCode DUPLICATE_DEFINITION = new CompileTimeErrorCode('DUPLICATE_DEFINITION', 35, "The name '%s' is already defined");
 
   /**
    * 7. Classes: It is a compile-time error if a class has an instance member and a static member
@@ -901,21 +891,21 @@
    * @param name the name of the conflicting members
    * @see #DUPLICATE_DEFINITION
    */
-  static final CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = new CompileTimeErrorCode('DUPLICATE_DEFINITION_INHERITANCE', 37, "The name '%s' is already defined in '%s'");
+  static final CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = new CompileTimeErrorCode('DUPLICATE_DEFINITION_INHERITANCE', 36, "The name '%s' is already defined in '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a compile-time error if <i>q<sub>i</sub> =
    * q<sub>j</sub></i> for any <i>i != j</i> [where <i>q<sub>i</sub></i> is the label for a named
    * argument].
    */
-  static final CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = new CompileTimeErrorCode('DUPLICATE_NAMED_ARGUMENT', 38, "The argument for the named parameter '%s' was already specified");
+  static final CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = new CompileTimeErrorCode('DUPLICATE_NAMED_ARGUMENT', 37, "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', 39, "The library %s is internal and cannot be exported");
+  static final CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = new CompileTimeErrorCode('EXPORT_INTERNAL_LIBRARY', 38, "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
@@ -923,7 +913,7 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static final CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = new CompileTimeErrorCode('EXPORT_OF_NON_LIBRARY', 40, "The exported library '%s' must not have a part-of directive");
+  static final CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = new CompileTimeErrorCode('EXPORT_OF_NON_LIBRARY', 39, "The exported library '%s' must not have a part-of directive");
 
   /**
    * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
@@ -931,7 +921,7 @@
    *
    * @param typeName the name of the superclass that was not found
    */
-  static final CompileTimeErrorCode EXTENDS_NON_CLASS = new CompileTimeErrorCode('EXTENDS_NON_CLASS', 41, "Classes can only extend other classes");
+  static final CompileTimeErrorCode EXTENDS_NON_CLASS = new CompileTimeErrorCode('EXTENDS_NON_CLASS', 40, "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.
@@ -950,7 +940,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', 42, "Classes cannot extend '%s'");
+  static final CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = new CompileTimeErrorCode('EXTENDS_DISALLOWED_CLASS', 41, "Classes cannot extend '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -962,28 +952,28 @@
    * @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', 43, "%d positional arguments expected, but %d found");
+  static final CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = new CompileTimeErrorCode('EXTRA_POSITIONAL_ARGUMENTS', 42, "%d positional arguments expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if more than one initializer corresponding to a given instance variable appears in
    * <i>k</i>'s list.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = new CompileTimeErrorCode('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 44, "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', 43, "The field '%s' cannot be initialized twice in the same constructor");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if <i>k</i>'s initializer list contains an initializer for a final variable <i>f</i>
    * whose declaration includes an initialization expression.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = new CompileTimeErrorCode('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 45, "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', 44, "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', 46, "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', 45, "Fields cannot be initialized in both the parameter list and the initializers");
 
   /**
    * 5 Variables: It is a compile-time error if a final instance variable that has been initialized
@@ -991,7 +981,7 @@
    *
    * @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', 47, "'%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', 46, "'%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
@@ -1000,19 +990,19 @@
    *
    * @param name the name of the field in question
    */
-  static final CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = new CompileTimeErrorCode('FINAL_INITIALIZED_MULTIPLE_TIMES', 48, "'%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', 47, "'%s' is a final field and so can only be set once");
 
   /**
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 49, "Initializing formal fields cannot be used in factory constructors");
+  static final CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 48, "Initializing formal fields cannot be used in factory constructors");
 
   /**
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 50, "Initializing formal fields can only be used in constructors");
+  static final CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 49, "Initializing formal fields can only be used in constructors");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1021,7 +1011,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', 51, "The redirecting constructor cannot have a field initializer");
+  static final CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 50, "The redirecting constructor cannot have a field initializer");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -1029,7 +1019,7 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static final CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = new CompileTimeErrorCode('GETTER_AND_METHOD_WITH_SAME_NAME', 52, "'%s' cannot be used to name a getter, there is already a method with the same name");
+  static final CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = new CompileTimeErrorCode('GETTER_AND_METHOD_WITH_SAME_NAME', 51, "'%s' cannot be used to name a getter, there is already a method with the same name");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -1048,13 +1038,13 @@
    * @param typeName the name of the type that cannot be implemented
    * @see #EXTENDS_DISALLOWED_CLASS
    */
-  static final CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = new CompileTimeErrorCode('IMPLEMENTS_DISALLOWED_CLASS', 53, "Classes cannot implement '%s'");
+  static final CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = new CompileTimeErrorCode('IMPLEMENTS_DISALLOWED_CLASS', 52, "Classes cannot implement '%s'");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class includes
    * type dynamic.
    */
-  static final CompileTimeErrorCode IMPLEMENTS_DYNAMIC = new CompileTimeErrorCode('IMPLEMENTS_DYNAMIC', 54, "Classes cannot implement 'dynamic'");
+  static final CompileTimeErrorCode IMPLEMENTS_DYNAMIC = new CompileTimeErrorCode('IMPLEMENTS_DYNAMIC', 53, "Classes cannot implement 'dynamic'");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
@@ -1063,7 +1053,7 @@
    *
    * @param typeName the name of the interface that was not found
    */
-  static final CompileTimeErrorCode IMPLEMENTS_NON_CLASS = new CompileTimeErrorCode('IMPLEMENTS_NON_CLASS', 55, "Classes can only implement other classes");
+  static final CompileTimeErrorCode IMPLEMENTS_NON_CLASS = new CompileTimeErrorCode('IMPLEMENTS_NON_CLASS', 54, "Classes can only implement other classes");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if a type <i>T</i> appears more than once in
@@ -1071,7 +1061,7 @@
    *
    * @param className the name of the class that is implemented more than once
    */
-  static final CompileTimeErrorCode IMPLEMENTS_REPEATED = new CompileTimeErrorCode('IMPLEMENTS_REPEATED', 56, "'%s' can only be implemented once");
+  static final CompileTimeErrorCode IMPLEMENTS_REPEATED = new CompileTimeErrorCode('IMPLEMENTS_REPEATED', 55, "'%s' can only be implemented once");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the superclass of a class <i>C</i> appears
@@ -1079,7 +1069,7 @@
    *
    * @param className the name of the class that appears in both "extends" and "implements" clauses
    */
-  static final CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = new CompileTimeErrorCode('IMPLEMENTS_SUPER_CLASS', 57, "'%s' cannot be used in both 'extends' and 'implements' clauses");
+  static final CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = new CompileTimeErrorCode('IMPLEMENTS_SUPER_CLASS', 56, "'%s' cannot be used in both 'extends' and 'implements' clauses");
 
   /**
    * 7.6.1 Generative Constructors: Note that <b>this</b> is not in scope on the right hand side of
@@ -1091,14 +1081,14 @@
    *
    * @param name the name of the type in question
    */
-  static final CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = new CompileTimeErrorCode('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 58, "The 'this' expression cannot be implicitly used in initializers");
+  static final CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = new CompileTimeErrorCode('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 57, "The 'this' expression cannot be implicitly used in initializers");
 
   /**
    * SDK implementation libraries can be imported only by other SDK libraries.
    *
    * @param uri the uri pointing to a library
    */
-  static final CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = new CompileTimeErrorCode('IMPORT_INTERNAL_LIBRARY', 59, "The library %s is internal and cannot be imported");
+  static final CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = new CompileTimeErrorCode('IMPORT_INTERNAL_LIBRARY', 58, "The library %s is internal and cannot be imported");
 
   /**
    * 14.1 Imports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1106,7 +1096,7 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static final CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = new CompileTimeErrorCode('IMPORT_OF_NON_LIBRARY', 60, "The imported library '%s' must not have a part-of directive");
+  static final CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = new CompileTimeErrorCode('IMPORT_OF_NON_LIBRARY', 59, "The imported library '%s' must not have a part-of directive");
 
   /**
    * 13.9 Switch: It is a compile-time error if values of the expressions <i>e<sub>k</sub></i> are
@@ -1115,7 +1105,7 @@
    * @param expressionSource the expression source code that is the unexpected type
    * @param expectedType the name of the expected type
    */
-  static final CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = new CompileTimeErrorCode('INCONSISTENT_CASE_EXPRESSION_TYPES', 61, "Case expressions must have the same types, '%s' is not a %s'");
+  static final CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = new CompileTimeErrorCode('INCONSISTENT_CASE_EXPRESSION_TYPES', 60, "Case expressions must have the same types, '%s' is not a %s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
@@ -1126,7 +1116,7 @@
    *          immediately enclosing class
    * @see #INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode('INITIALIZER_FOR_NON_EXISTANT_FIELD', 62, "'%s' is not a variable in the enclosing class");
+  static final CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode('INITIALIZER_FOR_NON_EXISTANT_FIELD', 61, "'%s' is not a variable in the enclosing class");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
@@ -1137,7 +1127,7 @@
    *          enclosing class
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = new CompileTimeErrorCode('INITIALIZER_FOR_STATIC_FIELD', 63, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+  static final CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = new CompileTimeErrorCode('INITIALIZER_FOR_STATIC_FIELD', 62, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -1149,7 +1139,7 @@
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    * @see #INITIALIZER_FOR_NON_EXISTANT_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 64, "'%s' is not a variable in the enclosing class");
+  static final CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 63, "'%s' is not a variable in the enclosing class");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -1160,20 +1150,20 @@
    *          enclosing class
    * @see #INITIALIZER_FOR_STATIC_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = new CompileTimeErrorCode('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 65, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+  static final CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = new CompileTimeErrorCode('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 64, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
 
   /**
    * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
    * <b>this</b>.<i>id</i>.
    */
-  static final CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = new CompileTimeErrorCode('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 66, "Instance member cannot be accessed from static method");
+  static final CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = new CompileTimeErrorCode('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 65, "Instance member cannot be accessed from static method");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static final CompileTimeErrorCode INVALID_ANNOTATION = new CompileTimeErrorCode('INVALID_ANNOTATION', 67, "Annotation can be only constant variable or constant constructor invocation");
+  static final CompileTimeErrorCode INVALID_ANNOTATION = new CompileTimeErrorCode('INVALID_ANNOTATION', 66, "Annotation can be only constant variable or constant constructor invocation");
 
   /**
    * TODO(brianwilkerson) Remove this when we have decided on how to report errors in compile-time
@@ -1181,19 +1171,19 @@
    *
    * See TODOs in ConstantVisitor
    */
-  static final CompileTimeErrorCode INVALID_CONSTANT = new CompileTimeErrorCode('INVALID_CONSTANT', 68, "Invalid constant value");
+  static final CompileTimeErrorCode INVALID_CONSTANT = new CompileTimeErrorCode('INVALID_CONSTANT', 67, "Invalid constant value");
 
   /**
    * 7.6 Constructors: It is a compile-time error if the name of a constructor is not a constructor
    * name.
    */
-  static final CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = new CompileTimeErrorCode('INVALID_CONSTRUCTOR_NAME', 69, "Invalid constructor name");
+  static final CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = new CompileTimeErrorCode('INVALID_CONSTRUCTOR_NAME', 68, "Invalid constructor name");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>M</i> is not the name of the immediately
    * enclosing class.
    */
-  static final CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = new CompileTimeErrorCode('INVALID_FACTORY_NAME_NOT_A_CLASS', 70, "The name of the immediately enclosing class expected");
+  static final CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = new CompileTimeErrorCode('INVALID_FACTORY_NAME_NOT_A_CLASS', 69, "The name of the immediately enclosing class expected");
 
   /**
    * 7.1 Instance Methods: It is a compile-time error if an instance method <i>m1</i> overrides an
@@ -1203,7 +1193,7 @@
    * @param paramCount the number of named parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static final CompileTimeErrorCode INVALID_OVERRIDE_NAMED = new CompileTimeErrorCode('INVALID_OVERRIDE_NAMED', 71, "Missing the named parameter '%s' to match the overridden method from '%s'");
+  static final CompileTimeErrorCode INVALID_OVERRIDE_NAMED = new CompileTimeErrorCode('INVALID_OVERRIDE_NAMED', 70, "Missing the named parameter '%s' to match the overridden method from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a compile-time error if an instance method <i>m1</i> overrides an
@@ -1213,7 +1203,7 @@
    * @param paramCount the number of positional parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static final CompileTimeErrorCode INVALID_OVERRIDE_POSITIONAL = new CompileTimeErrorCode('INVALID_OVERRIDE_POSITIONAL', 72, "Must have at least %d optional parameters to match the overridden method from '%s'");
+  static final CompileTimeErrorCode INVALID_OVERRIDE_POSITIONAL = new CompileTimeErrorCode('INVALID_OVERRIDE_POSITIONAL', 71, "Must have at least %d optional parameters to match the overridden method from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a compile-time error if an instance method <i>m1</i> overrides an
@@ -1223,20 +1213,20 @@
    * @param paramCount the number of required parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static final CompileTimeErrorCode INVALID_OVERRIDE_REQUIRED = new CompileTimeErrorCode('INVALID_OVERRIDE_REQUIRED', 73, "Must have at exactly %d required parameters to match the overridden method from '%s'");
+  static final CompileTimeErrorCode INVALID_OVERRIDE_REQUIRED = new CompileTimeErrorCode('INVALID_OVERRIDE_REQUIRED', 72, "Must have exactly %d required parameters to match the overridden method from '%s'");
 
   /**
    * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
    * initializer, in a factory constructor, or in a static method or variable initializer, or in the
    * initializer of an instance variable.
    */
-  static final CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = new CompileTimeErrorCode('INVALID_REFERENCE_TO_THIS', 74, "Invalid reference to 'this' expression");
+  static final CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = new CompileTimeErrorCode('INVALID_REFERENCE_TO_THIS', 73, "Invalid reference to 'this' expression");
 
   /**
    * 12.7 Maps: It is a compile-time error if the first type argument to a map literal is not
    * String.
    */
-  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_FOR_KEY = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_FOR_KEY', 75, "The first type argument to a map literal must be 'String'");
+  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_FOR_KEY = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_FOR_KEY', 74, "The first type argument to a map literal must be 'String'");
 
   /**
    * 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
@@ -1244,7 +1234,7 @@
    *
    * @name the name of the type parameter
    */
-  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 76, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
+  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 75, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 12.7 Maps: It is a compile time error if the type arguments of a constant map literal include a
@@ -1252,7 +1242,7 @@
    *
    * @name the name of the type parameter
    */
-  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 77, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
+  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = new CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 76, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1267,7 +1257,7 @@
    * @param uri the URI that is invalid
    * @see #URI_DOES_NOT_EXIST
    */
-  static final CompileTimeErrorCode INVALID_URI = new CompileTimeErrorCode('INVALID_URI', 78, "Invalid URI syntax: '%s'");
+  static final CompileTimeErrorCode INVALID_URI = new CompileTimeErrorCode('INVALID_URI', 77, "Invalid URI syntax: '%s'");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1278,7 +1268,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static final CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = new CompileTimeErrorCode('LABEL_IN_OUTER_SCOPE', 79, "Cannot reference label '%s' declared in an outer method");
+  static final CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = new CompileTimeErrorCode('LABEL_IN_OUTER_SCOPE', 78, "Cannot reference label '%s' declared in an outer method");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1289,7 +1279,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static final CompileTimeErrorCode LABEL_UNDEFINED = new CompileTimeErrorCode('LABEL_UNDEFINED', 80, "Cannot reference undefined label '%s'");
+  static final CompileTimeErrorCode LABEL_UNDEFINED = new CompileTimeErrorCode('LABEL_UNDEFINED', 79, "Cannot reference undefined label '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -1305,7 +1295,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 81, "The element type '%s' cannot be assigned to the list type '%s'");
+  static final CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 80, "The element type '%s' cannot be assigned to the list type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1321,7 +1311,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode('MAP_KEY_TYPE_NOT_ASSIGNABLE', 82, "The element type '%s' cannot be assigned to the map key type '%s'");
+  static final CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode('MAP_KEY_TYPE_NOT_ASSIGNABLE', 81, "The element type '%s' cannot be assigned to the map key type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1337,13 +1327,13 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 83, "The element type '%s' cannot be assigned to the map value type '%s'");
+  static final CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 82, "The element type '%s' cannot be assigned to the map value type '%s'");
 
   /**
    * 7 Classes: It is a compile time error if a class <i>C</i> declares a member with the same name
    * as <i>C</i>.
    */
-  static final CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = new CompileTimeErrorCode('MEMBER_WITH_CLASS_NAME', 84, "Class members cannot have the same name as the enclosing class");
+  static final CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = new CompileTimeErrorCode('MEMBER_WITH_CLASS_NAME', 83, "Class members cannot have the same name as the enclosing class");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -1351,17 +1341,17 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static final CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = new CompileTimeErrorCode('METHOD_AND_GETTER_WITH_SAME_NAME', 85, "'%s' cannot be used to name a method, there is already a getter with the same name");
+  static final CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = new CompileTimeErrorCode('METHOD_AND_GETTER_WITH_SAME_NAME', 84, "'%s' cannot be used to name a method, there is already a getter with the same name");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant list literal.
    */
-  static final CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = new CompileTimeErrorCode('MISSING_CONST_IN_LIST_LITERAL', 86, "List literals must be prefixed with 'const' when used as a constant expression");
+  static final CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = new CompileTimeErrorCode('MISSING_CONST_IN_LIST_LITERAL', 85, "List literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant map literal.
    */
-  static final CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = new CompileTimeErrorCode('MISSING_CONST_IN_MAP_LITERAL', 87, "Map literals must be prefixed with 'const' when used as a constant expression");
+  static final CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = new CompileTimeErrorCode('MISSING_CONST_IN_MAP_LITERAL', 86, "Map literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin explicitly declares a
@@ -1369,7 +1359,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static final CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = new CompileTimeErrorCode('MIXIN_DECLARES_CONSTRUCTOR', 88, "The class '%s' cannot be used as a mixin because it declares a constructor");
+  static final CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = new CompileTimeErrorCode('MIXIN_DECLARES_CONSTRUCTOR', 87, "The class '%s' cannot be used as a mixin because it declares a constructor");
 
   /**
    * 9 Mixins: It is a compile-time error if a mixin is derived from a class whose superclass is not
@@ -1377,43 +1367,43 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static final CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = new CompileTimeErrorCode('MIXIN_INHERITS_FROM_NOT_OBJECT', 89, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
+  static final CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = new CompileTimeErrorCode('MIXIN_INHERITS_FROM_NOT_OBJECT', 88, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>M</i> does not denote a class or mixin
    * available in the immediately enclosing scope.
    */
-  static final CompileTimeErrorCode MIXIN_OF_NON_CLASS = new CompileTimeErrorCode('MIXIN_OF_NON_CLASS', 90, "Classes can only mixin other classes");
+  static final CompileTimeErrorCode MIXIN_OF_NON_CLASS = new CompileTimeErrorCode('MIXIN_OF_NON_CLASS', 89, "Classes can only mixin other classes");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin refers to super.
    */
-  static final CompileTimeErrorCode MIXIN_REFERENCES_SUPER = new CompileTimeErrorCode('MIXIN_REFERENCES_SUPER', 91, "The class '%s' cannot be used as a mixin because it references 'super'");
+  static final CompileTimeErrorCode MIXIN_REFERENCES_SUPER = new CompileTimeErrorCode('MIXIN_REFERENCES_SUPER', 90, "The class '%s' cannot be used as a mixin because it references 'super'");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>S</i> does not denote a class available
    * in the immediately enclosing scope.
    */
-  static final CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = new CompileTimeErrorCode('MIXIN_WITH_NON_CLASS_SUPERCLASS', 92, "Mixin can only be applied to class");
+  static final CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = new CompileTimeErrorCode('MIXIN_WITH_NON_CLASS_SUPERCLASS', 91, "Mixin can only be applied to class");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static final CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = new CompileTimeErrorCode('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 93, "Constructor may have at most one 'this' redirection");
+  static final CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = new CompileTimeErrorCode('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 92, "Constructor may have at most one 'this' redirection");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. Then <i>k</i> may
    * include at most one superinitializer in its initializer list or a compile time error occurs.
    */
-  static final CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = new CompileTimeErrorCode('MULTIPLE_SUPER_INITIALIZERS', 94, "Constructor may have at most one 'super' initializer");
+  static final CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = new CompileTimeErrorCode('MULTIPLE_SUPER_INITIALIZERS', 93, "Constructor may have at most one 'super' initializer");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static final CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = new CompileTimeErrorCode('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 95, "Annotation creation must have arguments");
+  static final CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = new CompileTimeErrorCode('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 94, "Annotation creation must have arguments");
 
   /**
    * 7.6.1 Generative Constructors: If no superinitializer is provided, an implicit superinitializer
@@ -1423,7 +1413,7 @@
    * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
    * generative constructor named <i>S</i> (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = new CompileTimeErrorCode('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 96, "The class '%s' does not have a default constructor");
+  static final CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = new CompileTimeErrorCode('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 95, "The class '%s' does not have a default constructor");
 
   /**
    * 7.6 Constructors: Iff no constructor is specified for a class <i>C</i>, it implicitly has a
@@ -1432,13 +1422,13 @@
    * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
    * generative constructor named <i>S</i> (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = new CompileTimeErrorCode('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 97, "The class '%s' does not have a default constructor");
+  static final CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = new CompileTimeErrorCode('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 96, "The class '%s' does not have a default constructor");
 
   /**
    * 13.2 Expression Statements: It is a compile-time error if a non-constant map literal that has
    * no explicit type arguments appears in a place where a statement is expected.
    */
-  static final CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = new CompileTimeErrorCode('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 98, "A non-constant map literal without type arguments cannot be used as an expression statement");
+  static final CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = new CompileTimeErrorCode('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 97, "A non-constant map literal without type arguments cannot be used as an expression statement");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
@@ -1449,44 +1439,44 @@
    * s<sub>n</sub>}</i>, it is a compile-time error if the expressions <i>e<sub>k</sub></i> are not
    * compile-time constants, for all <i>1 &lt;= k &lt;= n</i>.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = new CompileTimeErrorCode('NON_CONSTANT_CASE_EXPRESSION', 99, "Case expressions must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = new CompileTimeErrorCode('NON_CONSTANT_CASE_EXPRESSION', 98, "Case expressions must be constant");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
    * parameter is not a compile-time constant.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = new CompileTimeErrorCode('NON_CONSTANT_DEFAULT_VALUE', 100, "Default values of an optional parameter must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = new CompileTimeErrorCode('NON_CONSTANT_DEFAULT_VALUE', 99, "Default values of an optional parameter must be constant");
 
   /**
    * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
    * compile-time constant.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = new CompileTimeErrorCode('NON_CONSTANT_LIST_ELEMENT', 101, "'const' lists must have all constant values");
+  static final CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = new CompileTimeErrorCode('NON_CONSTANT_LIST_ELEMENT', 100, "'const' lists must have all constant values");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_MAP_KEY = new CompileTimeErrorCode('NON_CONSTANT_MAP_KEY', 102, "The keys in a map must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_MAP_KEY = new CompileTimeErrorCode('NON_CONSTANT_MAP_KEY', 101, "The keys in a map must be constant");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = new CompileTimeErrorCode('NON_CONSTANT_MAP_VALUE', 103, "The values in a 'const' map must be constant");
+  static final CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = new CompileTimeErrorCode('NON_CONSTANT_MAP_VALUE', 102, "The values in a 'const' map must be constant");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = new CompileTimeErrorCode('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 104, "Annotation creation can use only 'const' constructor");
+  static final CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = new CompileTimeErrorCode('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 103, "Annotation creation can use only 'const' constructor");
 
   /**
    * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
    * constant constructor must be a potentially constant expression, or a compile-time error occurs.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = new CompileTimeErrorCode('NON_CONSTANT_VALUE_IN_INITIALIZER', 105, "Initializer expressions in constant constructors must be constants");
+  static final CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = new CompileTimeErrorCode('NON_CONSTANT_VALUE_IN_INITIALIZER', 104, "Initializer expressions in constant constructors must be constants");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
@@ -1497,7 +1487,7 @@
    * @param requiredCount the expected number of required arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static final CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new CompileTimeErrorCode('NOT_ENOUGH_REQUIRED_ARGUMENTS', 106, "%d required argument(s) expected, but %d found");
+  static final CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new CompileTimeErrorCode('NOT_ENOUGH_REQUIRED_ARGUMENTS', 105, "%d required argument(s) expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1505,17 +1495,17 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode('NON_GENERATIVE_CONSTRUCTOR', 107, "The generative constructor '%s' expected, but factory found");
+  static final CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode('NON_GENERATIVE_CONSTRUCTOR', 106, "The generative constructor '%s' expected, but factory found");
 
   /**
    * 7.9 Superclasses: It is a compile-time error to specify an extends clause for class Object.
    */
-  static final CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = new CompileTimeErrorCode('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 108, "");
+  static final CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = new CompileTimeErrorCode('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 107, "");
 
   /**
    * 7.1.1 Operators: It is a compile-time error to declare an optional parameter in an operator.
    */
-  static final CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = new CompileTimeErrorCode('OPTIONAL_PARAMETER_IN_OPERATOR', 109, "Optional parameters are not allowed when defining an operator");
+  static final CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = new CompileTimeErrorCode('OPTIONAL_PARAMETER_IN_OPERATOR', 108, "Optional parameters are not allowed when defining an operator");
 
   /**
    * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
@@ -1523,25 +1513,25 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static final CompileTimeErrorCode PART_OF_NON_PART = new CompileTimeErrorCode('PART_OF_NON_PART', 110, "The included part '%s' must have a part-of directive");
+  static final CompileTimeErrorCode PART_OF_NON_PART = new CompileTimeErrorCode('PART_OF_NON_PART', 109, "The included part '%s' must have a part-of directive");
 
   /**
    * 14.1 Imports: It is a compile-time error if the current library declares a top-level member
    * named <i>p</i>.
    */
-  static final CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = new CompileTimeErrorCode('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 111, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
+  static final CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = new CompileTimeErrorCode('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 110, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the name of a named optional parameter
    * begins with an '_' character.
    */
-  static final CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = new CompileTimeErrorCode('PRIVATE_OPTIONAL_PARAMETER', 112, "Named optional parameters cannot start with an underscore");
+  static final CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = new CompileTimeErrorCode('PRIVATE_OPTIONAL_PARAMETER', 111, "Named optional parameters cannot start with an underscore");
 
   /**
    * 12.1 Constants: It is a compile-time error if the value of a compile-time constant expression
    * depends on itself.
    */
-  static final CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = new CompileTimeErrorCode('RECURSIVE_COMPILE_TIME_CONSTANT', 113, "");
+  static final CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = new CompileTimeErrorCode('RECURSIVE_COMPILE_TIME_CONSTANT', 112, "");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1552,13 +1542,13 @@
    *
    * https://code.google.com/p/dart/issues/detail?id=954
    */
-  static final CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = new CompileTimeErrorCode('RECURSIVE_CONSTRUCTOR_REDIRECT', 114, "Cycle in redirecting generative constructors");
+  static final CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = new CompileTimeErrorCode('RECURSIVE_CONSTRUCTOR_REDIRECT', 113, "Cycle in redirecting generative constructors");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if a redirecting factory constructor redirects to
    * itself, either directly or indirectly via a sequence of redirections.
    */
-  static final CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = new CompileTimeErrorCode('RECURSIVE_FACTORY_REDIRECT', 115, "Cycle in redirecting factory constructors");
+  static final CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = new CompileTimeErrorCode('RECURSIVE_FACTORY_REDIRECT', 114, "Cycle in redirecting factory constructors");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1571,7 +1561,7 @@
    * @param className the name of the class that implements itself recursively
    * @param strImplementsPath a string representation of the implements loop
    */
-  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE', 116, "'%s' cannot be a superinterface of itself: %s");
+  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE', 115, "'%s' cannot be a superinterface of itself: %s");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1583,7 +1573,7 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 117, "'%s' cannot extend itself");
+  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 116, "'%s' cannot extend itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1595,31 +1585,31 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 118, "'%s' cannot implement itself");
+  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = new CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 117, "'%s' cannot implement itself");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static final CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = new CompileTimeErrorCode('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 119, "Constant factory constructor cannot delegate to a non-constant constructor");
+  static final CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = new CompileTimeErrorCode('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 118, "Constant factory constructor cannot delegate to a non-constant constructor");
 
   /**
    * 13.3 Local Variable Declaration: It is a compile-time error if <i>e</i> refers to the name
    * <i>v</i> or the name <i>v=</i>.
    */
-  static final CompileTimeErrorCode REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER = new CompileTimeErrorCode('REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER', 120, "The name '%s' cannot be referenced in the initializer of a variable with the same name");
+  static final CompileTimeErrorCode REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER = new CompileTimeErrorCode('REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER', 119, "The name '%s' cannot be referenced in the initializer of a variable with the same name");
 
   /**
    * 12.8.1 Rethrow: It is a compile-time error if an expression of the form <i>rethrow;</i> is not
    * enclosed within a on-catch clause.
    */
-  static final CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = new CompileTimeErrorCode('RETHROW_OUTSIDE_CATCH', 121, "rethrow must be inside of a catch clause");
+  static final CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = new CompileTimeErrorCode('RETHROW_OUTSIDE_CATCH', 120, "rethrow must be inside of a catch clause");
 
   /**
    * 13.11 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
    * appears in a generative constructor.
    */
-  static final CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode('RETURN_IN_GENERATIVE_CONSTRUCTOR', 122, "Constructors cannot return a value");
+  static final CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode('RETURN_IN_GENERATIVE_CONSTRUCTOR', 121, "Constructors cannot return a value");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1629,19 +1619,19 @@
    * initializer list, in class Object, in a factory constructor, or in a static method or variable
    * initializer.
    */
-  static final CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = new CompileTimeErrorCode('SUPER_IN_INVALID_CONTEXT', 123, "Invalid context for 'super' invocation");
+  static final CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = new CompileTimeErrorCode('SUPER_IN_INVALID_CONTEXT', 122, "Invalid context for 'super' invocation");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static final CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode('SUPER_IN_REDIRECTING_CONSTRUCTOR', 124, "The redirecting constructor cannot have a 'super' initializer");
+  static final CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode('SUPER_IN_REDIRECTING_CONSTRUCTOR', 123, "The redirecting constructor cannot have a 'super' initializer");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
    * error if a generative constructor of class Object includes a superinitializer.
    */
-  static final CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = new CompileTimeErrorCode('SUPER_INITIALIZER_IN_OBJECT', 125, "");
+  static final CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = new CompileTimeErrorCode('SUPER_INITIALIZER_IN_OBJECT', 124, "");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -1660,19 +1650,19 @@
    * @param boundingTypeName the name of the bounding type
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  static final CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = new CompileTimeErrorCode('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 126, "'%s' does not extend '%s'");
+  static final CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = new CompileTimeErrorCode('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 125, "'%s' does not extend '%s'");
 
   /**
    * 15.3.1 Typedef: It is a compile-time error if a typedef refers to itself via a chain of
    * references that does not include a class declaration.
    */
-  static final CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = new CompileTimeErrorCode('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 127, "Type alias cannot reference itself directly or via other typedefs");
+  static final CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = new CompileTimeErrorCode('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 126, "Type alias can reference itself only via the bounds of its generic parameters");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
    * scope, optionally followed by type arguments.
    */
-  static final CompileTimeErrorCode UNDEFINED_CLASS = new CompileTimeErrorCode('UNDEFINED_CLASS', 128, "Undefined class '%s'");
+  static final CompileTimeErrorCode UNDEFINED_CLASS = new CompileTimeErrorCode('UNDEFINED_CLASS', 127, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1680,7 +1670,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 129, "The class '%s' does not have a generative constructor '%s'");
+  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 128, "The class '%s' does not have a generative constructor '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1688,7 +1678,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 130, "The class '%s' does not have a default generative constructor");
+  static final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = new CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 129, "The class '%s' does not have a default generative constructor");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -1700,7 +1690,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static final CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = new CompileTimeErrorCode('UNDEFINED_NAMED_PARAMETER', 131, "The named parameter '%s' is not defined");
+  static final CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = new CompileTimeErrorCode('UNDEFINED_NAMED_PARAMETER', 130, "The named parameter '%s' is not defined");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1715,7 +1705,7 @@
    * @param uri the URI pointing to a non-existent file
    * @see #INVALID_URI
    */
-  static final CompileTimeErrorCode URI_DOES_NOT_EXIST = new CompileTimeErrorCode('URI_DOES_NOT_EXIST', 132, "Target of URI does not exist: '%s'");
+  static final CompileTimeErrorCode URI_DOES_NOT_EXIST = new CompileTimeErrorCode('URI_DOES_NOT_EXIST', 131, "Target of URI does not exist: '%s'");
 
   /**
    * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
@@ -1727,7 +1717,7 @@
    * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that describes a URI is
    * not a compile-time constant, or if <i>x</i> involves string interpolation.
    */
-  static final CompileTimeErrorCode URI_WITH_INTERPOLATION = new CompileTimeErrorCode('URI_WITH_INTERPOLATION', 133, "URIs cannot use string interpolation");
+  static final CompileTimeErrorCode URI_WITH_INTERPOLATION = new CompileTimeErrorCode('URI_WITH_INTERPOLATION', 132, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
@@ -1740,7 +1730,7 @@
    * @param expectedNumberOfParameters the number of parameters expected
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 134, "Operator '%s' should declare exactly %d parameter(s), but %d found");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 133, "Operator '%s' should declare exactly %d parameter(s), but %d found");
 
   /**
    * 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
@@ -1748,16 +1738,15 @@
    *
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 135, "Operator '-' should declare 0 or 1 parameter, but %d found");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 134, "Operator '-' should declare 0 or 1 parameter, but %d found");
 
   /**
    * 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
    * exactly one required formal parameter <i>p</i>.
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 136, "Setters should declare exactly one required parameter");
+  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = new CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 135, "Setters should declare exactly one required parameter");
   static final List<CompileTimeErrorCode> values = [
       AMBIGUOUS_EXPORT,
-      AMBIGUOUS_IMPORT,
       ARGUMENT_DEFINITION_TEST_NON_PARAMETER,
       ARGUMENT_TYPE_NOT_ASSIGNABLE,
       BUILT_IN_IDENTIFIER_AS_TYPE,
@@ -1926,7 +1915,7 @@
  * indicate the problem that caused the suggestion to be generated and for the message to explain
  * what is wrong and, when appropriate, how the situation can be corrected.
  */
-class PubSuggestionCode implements Comparable<PubSuggestionCode>, ErrorCode {
+class PubSuggestionCode implements Enum<PubSuggestionCode>, ErrorCode {
 
   /**
    * It is a bad practice for a source file in a package "lib" directory hierarchy to traverse
@@ -1989,16 +1978,16 @@
  *
  * @coverage dart.engine.error
  */
-class StaticWarningCode implements Comparable<StaticWarningCode>, ErrorCode {
+class StaticWarningCode implements Enum<StaticWarningCode>, ErrorCode {
 
   /**
    * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and <i>N</i> is introduced
    * into the top level scope <i>L</i> by more than one import then:
    * <ol>
-   * * It is a static warning if <i>N</i> is used as a type annotation.
-   * * In checked mode, it is a dynamic error if <i>N</i> is used as a type annotation and
-   * referenced during a subtype test.
-   * * Otherwise, it is a compile-time error.
+   * * A static warning occurs.
+   * * If <i>N</i> is referenced as a function, getter or setter, a <i>NoSuchMethodError</i> is
+   * raised.
+   * * If <i>N</i> is referenced as a type, it is treated as a malformed type.
    * </ol>
    *
    * @param ambiguousTypeName the name of the ambiguous type
@@ -2034,26 +2023,35 @@
    * 5 Variables: Attempting to assign to a final variable elsewhere will cause a NoSuchMethodError
    * to be thrown, because no setter is defined for it. The assignment will also give rise to a
    * static warning for the same reason.
+   *
+   * A constant variable is always implicitly final.
    */
-  static final StaticWarningCode ASSIGNMENT_TO_FINAL = new StaticWarningCode('ASSIGNMENT_TO_FINAL', 2, "Final variables cannot be assigned a value");
+  static final StaticWarningCode ASSIGNMENT_TO_CONST = new StaticWarningCode('ASSIGNMENT_TO_CONST', 2, "Constant variables cannot be assigned a value");
+
+  /**
+   * 5 Variables: Attempting to assign to a final variable elsewhere will cause a NoSuchMethodError
+   * to be thrown, because no setter is defined for it. The assignment will also give rise to a
+   * static warning for the same reason.
+   */
+  static final StaticWarningCode ASSIGNMENT_TO_FINAL = new StaticWarningCode('ASSIGNMENT_TO_FINAL', 3, "Final variables cannot be assigned a value");
 
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
    * warning if <i>T</i> does not have an accessible instance setter named <i>v =</i>.
    */
-  static final StaticWarningCode ASSIGNMENT_TO_METHOD = new StaticWarningCode('ASSIGNMENT_TO_METHOD', 3, "Methods cannot be assigned a value");
+  static final StaticWarningCode ASSIGNMENT_TO_METHOD = new StaticWarningCode('ASSIGNMENT_TO_METHOD', 4, "Methods cannot be assigned a value");
 
   /**
    * 13.9 Switch: It is a static warning if the last statement of the statement sequence
    * <i>s<sub>k</sub></i> is not a break, continue, return or throw statement.
    */
-  static final StaticWarningCode CASE_BLOCK_NOT_TERMINATED = new StaticWarningCode('CASE_BLOCK_NOT_TERMINATED', 4, "The last statement of the 'case' should be 'break', 'continue', 'return' or 'throw'");
+  static final StaticWarningCode CASE_BLOCK_NOT_TERMINATED = new StaticWarningCode('CASE_BLOCK_NOT_TERMINATED', 5, "The last statement of the 'case' should be 'break', 'continue', 'return' or 'throw'");
 
   /**
    * 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', 5, "The name '%s' is not a type and cannot be used in an 'as' expression");
+  static final StaticWarningCode CAST_TO_NON_TYPE = new StaticWarningCode('CAST_TO_NON_TYPE', 6, "The name '%s' is not a type and cannot be used in an 'as' expression");
 
   /**
    * 16.1.2 Comments: A token of the form <i>[new c](uri)</i> will be replaced by a link in the
@@ -2062,7 +2060,7 @@
    * <i>L</i>, or if <i>c</i> is not the name of a constructor of a class declared in the exported
    * namespace of <i>L</i>.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE = new StaticWarningCode('COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE', 6, "");
+  static final StaticWarningCode COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE = new StaticWarningCode('COMMENT_REFERENCE_CONSTRUCTOR_NOT_VISIBLE', 7, "");
 
   /**
    * 16.1.2 Comments: A token of the form <i>[id](uri)</i> will be replaced by a link in the
@@ -2070,19 +2068,19 @@
    * of the link will be <i>id</i>. It is a static warning if uri is not the URI of a dart library
    * <i>L</i>, or if <i>id</i> is not a name declared in the exported namespace of <i>L</i>.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE = new StaticWarningCode('COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE', 7, "");
+  static final StaticWarningCode COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE = new StaticWarningCode('COMMENT_REFERENCE_IDENTIFIER_NOT_VISIBLE', 8, "");
 
   /**
    * 16.1.2 Comments: It is a static warning if <i>c</i> does not denote a constructor that
    * available in the scope of the documentation comment.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR = new StaticWarningCode('COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR', 8, "");
+  static final StaticWarningCode COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR = new StaticWarningCode('COMMENT_REFERENCE_UNDECLARED_CONSTRUCTOR', 9, "");
 
   /**
    * 16.1.2 Comments: It is a static warning if <i>id</i> does not denote a declaration that
    * available in the scope of the documentation comment.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_UNDECLARED_IDENTIFIER = new StaticWarningCode('COMMENT_REFERENCE_UNDECLARED_IDENTIFIER', 9, "");
+  static final StaticWarningCode COMMENT_REFERENCE_UNDECLARED_IDENTIFIER = new StaticWarningCode('COMMENT_REFERENCE_UNDECLARED_IDENTIFIER', 10, "");
 
   /**
    * 16.1.2 Comments: A token of the form <i>[id](uri)</i> will be replaced by a link in the
@@ -2090,13 +2088,13 @@
    * of the link will be <i>id</i>. It is a static warning if uri is not the URI of a dart library
    * <i>L</i>, or if <i>id</i> is not a name declared in the exported namespace of <i>L</i>.
    */
-  static final StaticWarningCode COMMENT_REFERENCE_URI_NOT_LIBRARY = new StaticWarningCode('COMMENT_REFERENCE_URI_NOT_LIBRARY', 10, "");
+  static final StaticWarningCode COMMENT_REFERENCE_URI_NOT_LIBRARY = new StaticWarningCode('COMMENT_REFERENCE_URI_NOT_LIBRARY', 11, "");
 
   /**
    * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
    * inherited in a concrete class.
    */
-  static final StaticWarningCode CONCRETE_CLASS_WITH_ABSTRACT_MEMBER = new StaticWarningCode('CONCRETE_CLASS_WITH_ABSTRACT_MEMBER', 11, "'%s' must have a method body because '%s' is not abstract");
+  static final StaticWarningCode CONCRETE_CLASS_WITH_ABSTRACT_MEMBER = new StaticWarningCode('CONCRETE_CLASS_WITH_ABSTRACT_MEMBER', 12, "'%s' must have a method body because '%s' is not abstract");
 
   /**
    * 7.2 Getters: It is a static warning if a class <i>C</i> declares an instance getter named
@@ -2105,7 +2103,7 @@
    *
    * @param superName the name of the super class declaring a static member
    */
-  static final StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode('CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER', 12, "Superclass '%s' declares static member with the same name");
+  static final StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode('CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER', 13, "Superclass '%s' declares static member with the same name");
 
   /**
    * 7.3 Setters: It is a static warning if a class <i>C</i> declares an instance setter named
@@ -2114,31 +2112,31 @@
    *
    * @param superName the name of the super class declaring a static member
    */
-  static final StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 13, "Superclass '%s' declares static member with the same name");
+  static final StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 14, "Superclass '%s' declares static member with the same name");
 
   /**
    * 7.2 Getters: It is a static warning if a class declares a static getter named <i>v</i> and also
    * has a non-static setter named <i>v=</i>.
    */
-  static final StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = new StaticWarningCode('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 14, "Class '%s' declares non-static setter with the same name");
+  static final StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = new StaticWarningCode('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 15, "Class '%s' declares non-static setter with the same name");
 
   /**
    * 7.3 Setters: It is a static warning if a class declares a static setter named <i>v=</i> and
    * also has a non-static member named <i>v</i>.
    */
-  static final StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = new StaticWarningCode('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 15, "Class '%s' declares non-static member with the same name");
+  static final StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = new StaticWarningCode('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 16, "Class '%s' declares non-static member with the same name");
 
   /**
    * 12.11.2 Const: Given an instance creation expression of the form <i>const q(a<sub>1</sub>,
    * &hellip; a<sub>n</sub>)</i> it is a static warning if <i>q</i> is the constructor of an
    * abstract class but <i>q</i> is not a factory constructor.
    */
-  static final StaticWarningCode CONST_WITH_ABSTRACT_CLASS = new StaticWarningCode('CONST_WITH_ABSTRACT_CLASS', 16, "Abstract classes cannot be created with a 'const' expression");
+  static final StaticWarningCode CONST_WITH_ABSTRACT_CLASS = new StaticWarningCode('CONST_WITH_ABSTRACT_CLASS', 17, "Abstract classes cannot be created with a 'const' expression");
 
   /**
    * 12.7 Maps: It is a static warning if the values of any two keys in a map literal are equal.
    */
-  static final StaticWarningCode EQUAL_KEYS_IN_MAP = new StaticWarningCode('EQUAL_KEYS_IN_MAP', 17, "Keys in a map cannot be equal");
+  static final StaticWarningCode EQUAL_KEYS_IN_MAP = new StaticWarningCode('EQUAL_KEYS_IN_MAP', 18, "Keys in a map cannot be equal");
 
   /**
    * 14.2 Exports: It is a static warning to export two different libraries with the same name.
@@ -2147,7 +2145,7 @@
    * @param uri2 the uri pointing to a second library
    * @param name the shared name of the exported libraries
    */
-  static final StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode('EXPORT_DUPLICATED_LIBRARY_NAME', 18, "The exported libraries '%s' and '%s' should not have the same name '%s'");
+  static final StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode('EXPORT_DUPLICATED_LIBRARY_NAME', 19, "The exported libraries '%s' and '%s' should not have the same name '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -2157,7 +2155,7 @@
    * @param argumentCount the actual number of positional arguments given
    * @see #NOT_ENOUGH_REQUIRED_ARGUMENTS
    */
-  static final StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = new StaticWarningCode('EXTRA_POSITIONAL_ARGUMENTS', 19, "%d positional arguments expected, but %d found");
+  static final StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = new StaticWarningCode('EXTRA_POSITIONAL_ARGUMENTS', 20, "%d positional arguments expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Execution of an initializer of the form <b>this</b>.<i>v</i> =
@@ -2174,7 +2172,7 @@
    * @param initializerType the name of the type of the initializer expression
    * @param fieldType the name of the type of the field
    */
-  static final StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = new StaticWarningCode('FIELD_INITIALIZER_NOT_ASSIGNABLE', 20, "The initializer type '%s' cannot be assigned to the field type '%s'");
+  static final StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = new StaticWarningCode('FIELD_INITIALIZER_NOT_ASSIGNABLE', 21, "The initializer type '%s' cannot be assigned to the field type '%s'");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -2183,7 +2181,7 @@
    * @param parameterType the name of the type of the field formal parameter
    * @param fieldType the name of the type of the field
    */
-  static final StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = new StaticWarningCode('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 21, "The parameter type '%s' is incompatable with the field type '%s'");
+  static final StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = new StaticWarningCode('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 22, "The parameter type '%s' is incompatable with the field type '%s'");
 
   /**
    * 5 Variables: It is a static warning if a library, static or local variable <i>v</i> is final
@@ -2200,7 +2198,7 @@
    *
    * @param name the name of the uninitialized final variable
    */
-  static final StaticWarningCode FINAL_NOT_INITIALIZED = new StaticWarningCode('FINAL_NOT_INITIALIZED', 22, "The final variable '%s' must be initialized");
+  static final StaticWarningCode FINAL_NOT_INITIALIZED = new StaticWarningCode('FINAL_NOT_INITIALIZED', 23, "The final variable '%s' must be initialized");
 
   /**
    * 14.1 Imports: It is a static warning to import two different libraries with the same name.
@@ -2209,7 +2207,7 @@
    * @param uri2 the uri pointing to a second library
    * @param name the shared name of the imported libraries
    */
-  static final StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode('IMPORT_DUPLICATED_LIBRARY_NAME', 23, "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', 24, "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>,
@@ -2221,7 +2219,7 @@
    * not all of the <i>m<sub>i</sub></i> are setters, none of the <i>m<sub>i</sub></i> are
    * inherited, and a static warning is issued.
    */
-  static final StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = new StaticWarningCode('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 24, "'%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', 25, "'%s' is inherited as a getter and also a method");
 
   /**
    * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
@@ -2231,7 +2229,7 @@
    * @param memberName the name of the member with the name conflict
    * @param superclassName the name of the enclosing class that has the static member
    */
-  static final StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = new StaticWarningCode('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 25, "'%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', 26, "'%s' collides with a static member in the superclass '%s'");
 
   /**
    * 7.2 Getters: It is a static warning if a getter <i>m1</i> overrides a getter <i>m2</i> and the
@@ -2243,7 +2241,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
@@ -2254,7 +2252,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
@@ -2266,7 +2264,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
@@ -2277,7 +2275,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
@@ -2289,7 +2287,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
@@ -2297,7 +2295,7 @@
    * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
    * for <i>p</i>.
    */
-  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = new StaticWarningCode('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 31, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
+  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = new StaticWarningCode('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 32, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2305,7 +2303,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_POSITIONAL = new StaticWarningCode('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 32, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
+  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = new StaticWarningCode('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 33, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
 
   /**
    * 7.3 Setters: It is a static warning if a setter <i>m1</i> overrides a setter <i>m2</i> and the
@@ -2317,7 +2315,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', 33, "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', 34, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -2333,7 +2331,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 34, "The element type '%s' cannot be assigned to the list type '%s'");
+  static final StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 35, "The element type '%s' cannot be assigned to the list type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -2349,7 +2347,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE = new StaticWarningCode('MAP_KEY_TYPE_NOT_ASSIGNABLE', 35, "The element type '%s' cannot be assigned to the map key type '%s'");
+  static final StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE = new StaticWarningCode('MAP_KEY_TYPE_NOT_ASSIGNABLE', 36, "The element type '%s' cannot be assigned to the map key type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -2365,20 +2363,20 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static final StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = new StaticWarningCode('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 36, "The element type '%s' cannot be assigned to the map value type '%s'");
+  static final StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = new StaticWarningCode('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 37, "The element type '%s' cannot be assigned to the map value type '%s'");
 
   /**
    * 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', 37, "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', 38, "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', 38, "Abstract classes cannot be created with a 'new' expression");
+  static final StaticWarningCode NEW_WITH_ABSTRACT_CLASS = new StaticWarningCode('NEW_WITH_ABSTRACT_CLASS', 39, "Abstract classes cannot be created with a 'new' expression");
 
   /**
    * 15.8 Parameterized Types: Any use of a malbounded type gives rise to a static warning.
@@ -2389,7 +2387,7 @@
    * @see CompileTimeErrorCode#CONST_WITH_INVALID_TYPE_PARAMETERS
    * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
    */
-  static final StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS = new StaticWarningCode('NEW_WITH_INVALID_TYPE_PARAMETERS', 39, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static final StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS = new StaticWarningCode('NEW_WITH_INVALID_TYPE_PARAMETERS', 40, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   /**
    * 12.11.1 New: It is a static warning if <i>T</i> is not a class accessible in the current scope,
@@ -2397,7 +2395,7 @@
    *
    * @param name the name of the non-type element
    */
-  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode('NEW_WITH_NON_TYPE', 40, "The name '%s' is not a class");
+  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode('NEW_WITH_NON_TYPE', 41, "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:
@@ -2408,7 +2406,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', 41, "The class '%s' does not have a constructor '%s'");
+  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = new StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR', 42, "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:
@@ -2419,15 +2417,19 @@
    * 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', 42, "The class '%s' does not have a default constructor");
+  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 43, "The class '%s' does not have a default constructor");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
    * abstract method.
    *
-   * 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>.
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
+   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
+   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
+   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
+   * inherited in a concrete class unless that member overrides a concrete one.
    *
    * @param memberName the name of the first member
    * @param memberName the name of the second member
@@ -2435,61 +2437,77 @@
    * @param memberName the name of the fourth member
    * @param additionalCount the number of additional missing members that aren't listed
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 43, "Missing inherited members: '%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', 44, "Missing inherited members: '%s', '%s', '%s', '%s' and %d more");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
    * abstract method.
    *
-   * 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>.
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
+   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
+   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
+   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
+   * inherited in a concrete class unless that member overrides a concrete one.
    *
    * @param memberName the name of the first member
    * @param memberName the name of the second member
    * @param memberName the name of the third member
    * @param memberName the name of the fourth member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 44, "Missing inherited members: '%s', '%s', '%s' and '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 45, "Missing inherited members: '%s', '%s', '%s' and '%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
    * abstract method.
    *
-   * 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>.
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
+   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
+   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
+   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
+   * inherited in a concrete class unless that member overrides a concrete one.
    *
    * @param memberName the name of the member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 45, "Missing inherited member '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 46, "Missing inherited member '%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
    * abstract method.
    *
-   * 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>.
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
+   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
+   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
+   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
+   * inherited in a concrete class unless that member overrides a concrete one.
    *
    * @param memberName the name of the first member
    * @param memberName the name of the second member
    * @param memberName the name of the third member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 46, "Missing inherited members: '%s', '%s' and '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 47, "Missing inherited members: '%s', '%s' and '%s'");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
    * abstract method.
    *
-   * 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>.
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not declare its own
+   * <i>noSuchMethod()</i> method. It is a static warning if the implicit interface of <i>C</i>
+   * includes an instance member <i>m</i> of type <i>F</i> and <i>C</i> does not declare or inherit
+   * a corresponding instance member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
+   * inherited in a concrete class unless that member overrides a concrete one.
    *
    * @param memberName the name of the first member
    * @param memberName the name of the second member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 47, "Missing inherited members: '%s' and '%s'");
+  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = new StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 48, "Missing inherited members: '%s' and '%s'");
 
   /**
    * 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
@@ -2499,18 +2517,18 @@
    *
    * @param name the name of the non-type element
    */
-  static final StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = new StaticWarningCode('NON_TYPE_IN_CATCH_CLAUSE', 48, "The name '%s' is not a type and cannot be used in an on-catch clause");
+  static final StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = new StaticWarningCode('NON_TYPE_IN_CATCH_CLAUSE', 49, "The name '%s' is not a type and cannot be used in an on-catch clause");
 
   /**
    * 7.1.1 Operators: It is a static warning if the return type of the user-declared operator []= is
    * explicitly declared and not void.
    */
-  static final StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = new StaticWarningCode('NON_VOID_RETURN_FOR_OPERATOR', 49, "The return type of the operator []= must be 'void'");
+  static final StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = new StaticWarningCode('NON_VOID_RETURN_FOR_OPERATOR', 50, "The return type of the operator []= must be 'void'");
 
   /**
    * 7.3 Setters: It is a static warning if a setter declares a return type other than void.
    */
-  static final StaticWarningCode NON_VOID_RETURN_FOR_SETTER = new StaticWarningCode('NON_VOID_RETURN_FOR_SETTER', 50, "The return type of the setter must be 'void'");
+  static final StaticWarningCode NON_VOID_RETURN_FOR_SETTER = new StaticWarningCode('NON_VOID_RETURN_FOR_SETTER', 51, "The return type of the setter must be 'void'");
 
   /**
    * 15.1 Static Types: A type <i>T</i> is malformed iff: * <i>T</i> has the form <i>id</i> or the
@@ -2524,7 +2542,7 @@
    *
    * @param nonTypeName the name that is not a type
    */
-  static final StaticWarningCode NOT_A_TYPE = new StaticWarningCode('NOT_A_TYPE', 51, "%s is not a type");
+  static final StaticWarningCode NOT_A_TYPE = new StaticWarningCode('NOT_A_TYPE', 52, "%s is not a type");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -2534,7 +2552,7 @@
    * @param argumentCount the actual number of positional arguments given
    * @see #EXTRA_POSITIONAL_ARGUMENTS
    */
-  static final StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new StaticWarningCode('NOT_ENOUGH_REQUIRED_ARGUMENTS', 52, "%d required argument(s) expected, but %d found");
+  static final StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new StaticWarningCode('NOT_ENOUGH_REQUIRED_ARGUMENTS', 53, "%d required argument(s) expected, but %d found");
 
   /**
    * 14.3 Parts: It is a static warning if the referenced part declaration <i>p</i> names a library
@@ -2543,7 +2561,7 @@
    * @param expectedLibraryName the name of expected library name
    * @param actualLibraryName the non-matching actual library name from the "part of" declaration
    */
-  static final StaticWarningCode PART_OF_DIFFERENT_LIBRARY = new StaticWarningCode('PART_OF_DIFFERENT_LIBRARY', 53, "Expected this library to be part of '%s', not '%s'");
+  static final StaticWarningCode PART_OF_DIFFERENT_LIBRARY = new StaticWarningCode('PART_OF_DIFFERENT_LIBRARY', 54, "Expected this library to be part of '%s', not '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -2552,7 +2570,7 @@
    * @param redirectedName the name of the redirected constructor
    * @param redirectingName the name of the redirecting constructor
    */
-  static final StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = new StaticWarningCode('REDIRECT_TO_INVALID_FUNCTION_TYPE', 54, "The redirected constructor '%s' has incompatible parameters with '%s'");
+  static final StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = new StaticWarningCode('REDIRECT_TO_INVALID_FUNCTION_TYPE', 55, "The redirected constructor '%s' has incompatible parameters with '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -2561,21 +2579,21 @@
    * @param redirectedName the name of the redirected constructor return type
    * @param redirectingName the name of the redirecting constructor return type
    */
-  static final StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = new StaticWarningCode('REDIRECT_TO_INVALID_RETURN_TYPE', 55, "The return type '%s' of the redirected constructor is not a subclass of '%s'");
+  static final StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = new StaticWarningCode('REDIRECT_TO_INVALID_RETURN_TYPE', 56, "The return type '%s' of the redirected constructor is not a subclass of '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static final StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = new StaticWarningCode('REDIRECT_TO_MISSING_CONSTRUCTOR', 56, "The constructor '%s' could not be found in '%s'");
+  static final StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = new StaticWarningCode('REDIRECT_TO_MISSING_CONSTRUCTOR', 57, "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', 57, "The name '%s' is not a type and cannot be used in a redirected constructor");
+  static final StaticWarningCode REDIRECT_TO_NON_CLASS = new StaticWarningCode('REDIRECT_TO_NON_CLASS', 58, "The name '%s' is not a type and cannot be used in a redirected constructor");
 
   /**
    * 13.11 Return: Let <i>f</i> be the function immediately enclosing a return statement of the form
@@ -2585,7 +2603,7 @@
    * * The return type of <i>f</i> may not be assigned to void.
    * </ol>
    */
-  static final StaticWarningCode RETURN_WITHOUT_VALUE = new StaticWarningCode('RETURN_WITHOUT_VALUE', 58, "Missing return value after 'return'");
+  static final StaticWarningCode RETURN_WITHOUT_VALUE = new StaticWarningCode('RETURN_WITHOUT_VALUE', 59, "Missing return value after 'return'");
 
   /**
    * 12.15.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
@@ -2593,19 +2611,19 @@
    *
    * @param memberName the name of the instance member
    */
-  static final StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = new StaticWarningCode('STATIC_ACCESS_TO_INSTANCE_MEMBER', 59, "Instance member '%s' cannot be accessed using static access");
+  static final StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = new StaticWarningCode('STATIC_ACCESS_TO_INSTANCE_MEMBER', 60, "Instance member '%s' cannot be accessed using static access");
 
   /**
    * 13.9 Switch: It is a static warning if the type of <i>e</i> may not be assigned to the type of
    * <i>e<sub>k</sub></i>.
    */
-  static final StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = new StaticWarningCode('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 60, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
+  static final StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = new StaticWarningCode('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 61, "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', 61, "The name '%s' is not a type and cannot be used in an 'is' expression");
+  static final StaticWarningCode TYPE_TEST_NON_TYPE = new StaticWarningCode('TYPE_TEST_NON_TYPE', 62, "The name '%s' is not a type and cannot be used in an 'is' expression");
 
   /**
    * 10 Generics: However, a type parameter is considered to be a malformed type when referenced by
@@ -2614,7 +2632,7 @@
    * 15.1 Static Types: Any use of a malformed type gives rise to a static warning. A malformed type
    * is then interpreted as dynamic by the static type checker and the runtime.
    */
-  static final StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC = new StaticWarningCode('TYPE_PARAMETER_REFERENCED_BY_STATIC', 62, "Static members cannot reference type parameters");
+  static final StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC = new StaticWarningCode('TYPE_PARAMETER_REFERENCED_BY_STATIC', 63, "Static members cannot reference type parameters");
 
   /**
    * 12.15.3 Static Invocation: A static method invocation <i>i</i> has the form
@@ -2624,12 +2642,12 @@
    *
    * @param undefinedClassName the name of the undefined class
    */
-  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode('UNDEFINED_CLASS', 63, "Undefined class '%s'");
+  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode('UNDEFINED_CLASS', 64, "Undefined class '%s'");
 
   /**
    * Same as [UNDEFINED_CLASS], but to catch using "boolean" instead of "bool".
    */
-  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode('UNDEFINED_CLASS_BOOLEAN', 64, "Undefined class 'boolean'; did you mean 'bool'?");
+  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode('UNDEFINED_CLASS_BOOLEAN', 65, "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
@@ -2639,7 +2657,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', 65, "There is no such getter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_GETTER = new StaticWarningCode('UNDEFINED_GETTER', 66, "There is no such getter '%s' in '%s'");
 
   /**
    * 12.30 Identifier Reference: It is as static warning if an identifier expression of the form
@@ -2647,7 +2665,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', 66, "Undefined name '%s'");
+  static final StaticWarningCode UNDEFINED_IDENTIFIER = new StaticWarningCode('UNDEFINED_IDENTIFIER', 67, "Undefined name '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -2656,7 +2674,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static final StaticWarningCode UNDEFINED_NAMED_PARAMETER = new StaticWarningCode('UNDEFINED_NAMED_PARAMETER', 67, "The named parameter '%s' is not defined");
+  static final StaticWarningCode UNDEFINED_NAMED_PARAMETER = new StaticWarningCode('UNDEFINED_NAMED_PARAMETER', 68, "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
@@ -2671,7 +2689,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', 68, "There is no such setter '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_SETTER = new StaticWarningCode('UNDEFINED_SETTER', 69, "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
@@ -2680,10 +2698,11 @@
    * @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', 69, "There is no such static method '%s' in '%s'");
+  static final StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = new StaticWarningCode('UNDEFINED_STATIC_METHOD_OR_GETTER', 70, "There is no such static method '%s' in '%s'");
   static final List<StaticWarningCode> values = [
       AMBIGUOUS_IMPORT,
       ARGUMENT_TYPE_NOT_ASSIGNABLE,
+      ASSIGNMENT_TO_CONST,
       ASSIGNMENT_TO_FINAL,
       ASSIGNMENT_TO_METHOD,
       CASE_BLOCK_NOT_TERMINATED,
@@ -2811,7 +2830,7 @@
  *
  * @coverage dart.engine.error
  */
-class HtmlWarningCode implements Comparable<HtmlWarningCode>, ErrorCode {
+class HtmlWarningCode implements Enum<HtmlWarningCode>, ErrorCode {
 
   /**
    * An error code indicating that the value of the 'src' attribute of a Dart script tag is not a
@@ -2864,7 +2883,7 @@
  *
  * @coverage dart.engine.error
  */
-class StaticTypeWarningCode implements Comparable<StaticTypeWarningCode>, ErrorCode {
+class StaticTypeWarningCode implements Enum<StaticTypeWarningCode>, ErrorCode {
 
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
diff --git a/pkg/analyzer_experimental/lib/src/generated/html.dart b/pkg/analyzer_experimental/lib/src/generated/html.dart
index c0e83c9..b69bda3 100644
--- a/pkg/analyzer_experimental/lib/src/generated/html.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/html.dart
@@ -924,7 +924,7 @@
  *
  * @coverage dart.engine.html
  */
-class TokenType implements Comparable<TokenType> {
+class TokenType implements Enum<TokenType> {
 
   /**
    * The type of the token that marks the end of the input.
diff --git a/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart b/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
index 6f1da08..5dbf578 100644
--- a/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
@@ -38,13 +38,13 @@
   /**
    * A builder that will silently ignore all data and logging requests.
    */
-  static InstrumentationBuilder _NULL_INSTRUMENTATION_BUILDER = new InstrumentationBuilder_13();
+  static InstrumentationBuilder _NULL_INSTRUMENTATION_BUILDER = new InstrumentationBuilder_14();
 
   /**
    * An instrumentation logger that can be used when no other instrumentation logger has been
    * configured. This logger will silently ignore all data and logging requests.
    */
-  static InstrumentationLogger _NULL_LOGGER = new InstrumentationLogger_14();
+  static InstrumentationLogger _NULL_LOGGER = new InstrumentationLogger_15();
 
   /**
    * The current instrumentation logger.
@@ -96,7 +96,7 @@
     _CURRENT_LOGGER = logger2 == null ? _NULL_LOGGER : logger2;
   }
 }
-class InstrumentationBuilder_13 implements InstrumentationBuilder {
+class InstrumentationBuilder_14 implements InstrumentationBuilder {
   InstrumentationBuilder data(String name, bool value) => this;
   InstrumentationBuilder data2(String name, int value) => this;
   InstrumentationBuilder data3(String name, String value) => this;
@@ -104,13 +104,15 @@
   InstrumentationLevel get instrumentationLevel => InstrumentationLevel.OFF;
   void log() {
   }
+  void log2(int minTimeToLong) {
+  }
   InstrumentationBuilder metric(String name, bool value) => this;
   InstrumentationBuilder metric2(String name, int value) => this;
   InstrumentationBuilder metric3(String name, String value) => this;
   InstrumentationBuilder metric4(String name, List<String> value) => this;
   InstrumentationBuilder record(Exception exception) => this;
 }
-class InstrumentationLogger_14 implements InstrumentationLogger {
+class InstrumentationLogger_15 implements InstrumentationLogger {
   InstrumentationBuilder createBuilder(String name) => Instrumentation._NULL_INSTRUMENTATION_BUILDER;
 }
 /**
@@ -183,6 +185,15 @@
   void log();
 
   /**
+   * Log the data that has been collected. The instrumentation builder should not be used after this
+   * method is invoked. The behavior of any method defined on this interface that is used after this
+   * method is invoked is undefined.
+   *
+   * @param minTimeToLog if the total elapsed time is less than this, do not record
+   */
+  void log2(int minTimeToLog);
+
+  /**
    * Append the given metric to the data being collected by this builder. The information is
    * declared to contain only metrics data (data that is not user identifiable and does not contain
    * user intellectual property).
@@ -244,7 +255,7 @@
  *
  * @coverage dart.engine.utilities
  */
-class InstrumentationLevel implements Comparable<InstrumentationLevel> {
+class InstrumentationLevel implements Enum<InstrumentationLevel> {
 
   /** Recording all instrumented information */
   static final InstrumentationLevel EVERYTHING = new InstrumentationLevel('EVERYTHING', 0);
diff --git a/pkg/analyzer_experimental/lib/src/generated/java_core.dart b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
index 01ffd5d..4e9d258 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_core.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
@@ -258,10 +258,14 @@
 
 class JavaException implements Exception {
   final String message;
-  final Exception e;
-  JavaException([this.message = "", this.e = null]);
-  JavaException.withCause(this.e) : message = null;
-  String toString() => "JavaException: $message $e";
+  final Exception cause;
+  JavaException([this.message = "", this.cause = null]);
+  JavaException.withCause(this.cause) : message = null;
+  String toString() => "JavaException: $message $cause";
+}
+
+class JavaIOException extends JavaException {
+  JavaIOException([message = "", cause = null]) : super(message, cause);
 }
 
 class IllegalArgumentException implements Exception {
@@ -478,6 +482,12 @@
   return false;
 }
 
+javaMapPut(Map target, key, value) {
+  var oldValue = target[key];
+  target[key] = value;
+  return oldValue;
+}
+
 void javaMapPutAll(Map target, Map source) {
   source.forEach((k, v) {
     target[k] = v;
@@ -521,3 +531,8 @@
     sb = new StringBuffer();
   }
 }
+
+abstract class Enum<E> implements Comparable<E> {
+  int get ordinal;
+  String get name;
+}
diff --git a/pkg/analyzer_experimental/lib/src/generated/java_engine_io.dart b/pkg/analyzer_experimental/lib/src/generated/java_engine_io.dart
index 32923b6..3c713d6 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_engine_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_engine_io.dart
@@ -5,6 +5,7 @@
 
 
 class OSUtilities {
+  static String LINE_SEPARATOR = isWindows() ? '\r\n' : '\n';
   static bool isWindows() => Platform.operatingSystem == 'windows';
   static bool isMac() => Platform.operatingSystem == 'macos';
 }
diff --git a/pkg/analyzer_experimental/lib/src/generated/java_io.dart b/pkg/analyzer_experimental/lib/src/generated/java_io.dart
index 41c2e24..3e23f8d 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_io.dart
@@ -1,6 +1,7 @@
 library java.io;
 
 import "dart:io";
+import 'java_core.dart' show JavaIOException;
 import 'package:path/path.dart' as pathos;
 
 class JavaSystemIO {
@@ -90,7 +91,13 @@
     return new JavaFile(parent);
   }
   String getAbsolutePath() => pathos.absolute(_path);
-  String getCanonicalPath() => _newFile().fullPathSync();
+  String getCanonicalPath() {
+    try {
+      return _newFile().fullPathSync();
+    } catch (e) {
+      throw new JavaIOException('IOException', e);
+    }
+  }
   JavaFile getAbsoluteFile() => new JavaFile(getAbsolutePath());
   JavaFile getCanonicalFile() => new JavaFile(getCanonicalPath());
   bool exists() {
diff --git a/pkg/analyzer_experimental/lib/src/generated/java_junit.dart b/pkg/analyzer_experimental/lib/src/generated/java_junit.dart
index 876d345..3888427 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_junit.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_junit.dart
@@ -75,10 +75,6 @@
   Description describe(Description mismatchDescription) {
     return mismatchDescription.replace(msg);
   }
-  Description describeMismatch(item, Description mismatchDescription,
-                               Map matchState, bool verbose) {
-    return mismatchDescription.replace(msg).add(" $item != $expectedValue");
-  }
 }
 
 Matcher isTrueMsg(String msg) => new _IsTrueWithMessage(msg);
@@ -91,10 +87,6 @@
   Description describe(Description mismatchDescription) {
     return mismatchDescription.replace(msg);
   }
-  Description describeMismatch(item, Description mismatchDescription,
-                               Map matchState, bool verbose) {
-    return mismatchDescription.replace(msg).add(" $item is not true");
-  }
 }
 
 Matcher isFalseMsg(String msg) => new _IsFalseWithMessage(msg);
@@ -107,10 +99,6 @@
   Description describe(Description mismatchDescription) {
     return mismatchDescription.replace(msg);
   }
-  Description describeMismatch(item, Description mismatchDescription,
-                               Map matchState, bool verbose) {
-    return mismatchDescription.replace(msg).add(" $item is not false");
-  }
 }
 
 Matcher isNotNullMsg(String msg) => new _IsNotNullWithMessage(msg);
@@ -123,8 +111,4 @@
   Description describe(Description mismatchDescription) {
     return mismatchDescription.replace(msg);
   }
-  Description describeMismatch(item, Description mismatchDescription,
-                               Map matchState, bool verbose) {
-    return mismatchDescription.replace(msg).add(" $item is null");
-  }
 }
diff --git a/pkg/analyzer_experimental/lib/src/generated/parser.dart b/pkg/analyzer_experimental/lib/src/generated/parser.dart
index c406289..84fec68 100644
--- a/pkg/analyzer_experimental/lib/src/generated/parser.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/parser.dart
@@ -3,13 +3,13 @@
 library engine.parser;
 import 'dart:collection';
 import 'java_core.dart';
-import 'java_engine.dart';
 import 'instrumentation.dart';
 import 'error.dart';
 import 'source.dart';
 import 'scanner.dart';
 import 'ast.dart';
 import 'utilities_dart.dart';
+import 'engine.dart' show AnalysisEngine;
 /**
  * Instances of the class `CommentAndMetadata` implement a simple data-holder for a method
  * that needs to return multiple values.
@@ -441,29 +441,40 @@
    * Compute the content of a string with the given literal representation.
    *
    * @param lexeme the literal representation of the string
+   * @param first `true` if this is the first token in a string literal
+   * @param last `true` if this is the last token in a string literal
    * @return the actual value of the string
    */
-  String computeStringValue(String lexeme) {
-    if (lexeme.startsWith("r\"\"\"") || lexeme.startsWith("r'''")) {
-      if (lexeme.length > 4) {
-        return lexeme.substring(4, lexeme.length - 3);
-      }
-    } else if (lexeme.startsWith("r\"") || lexeme.startsWith("r'")) {
-      if (lexeme.length > 2) {
-        return lexeme.substring(2, lexeme.length - 1);
-      }
-    }
+  String computeStringValue(String lexeme, bool first, bool last) {
+    bool isRaw = false;
     int start = 0;
-    if (lexeme.startsWith("\"\"\"") || lexeme.startsWith("'''")) {
-      start += 3;
-    } else if (lexeme.startsWith("\"") || lexeme.startsWith("'")) {
-      start += 1;
+    if (first) {
+      if (lexeme.startsWith("r\"\"\"") || lexeme.startsWith("r'''")) {
+        isRaw = true;
+        start += 4;
+      } else if (lexeme.startsWith("r\"") || lexeme.startsWith("r'")) {
+        isRaw = true;
+        start += 2;
+      } else if (lexeme.startsWith("\"\"\"") || lexeme.startsWith("'''")) {
+        start += 3;
+      } else if (lexeme.startsWith("\"") || lexeme.startsWith("'")) {
+        start += 1;
+      }
     }
     int end = lexeme.length;
-    if (end > 3 && (lexeme.endsWith("\"\"\"") || lexeme.endsWith("'''"))) {
-      end -= 3;
-    } else if (end > 1 && (lexeme.endsWith("\"") || lexeme.endsWith("'"))) {
-      end -= 1;
+    if (last) {
+      if (lexeme.endsWith("\"\"\"") || lexeme.endsWith("'''")) {
+        end -= 3;
+      } else if (lexeme.endsWith("\"") || lexeme.endsWith("'")) {
+        end -= 1;
+      }
+    }
+    if (end - start + 1 < 0) {
+      AnalysisEngine.instance.logger.logError("Internal error: computeStringValue(${lexeme}, ${first}, ${last})");
+      return "";
+    }
+    if (isRaw) {
+      return lexeme.substring(start, end);
     }
     JavaStringBuilder builder = new JavaStringBuilder();
     int index = start;
@@ -532,7 +543,7 @@
    *
    * @return the synthetic token that was created
    */
-  Token createSyntheticToken(Keyword keyword) => new KeywordToken_11(keyword, _currentToken.offset);
+  Token createSyntheticToken(Keyword keyword) => new KeywordToken_12(keyword, _currentToken.offset);
 
   /**
    * Create a synthetic token with the given type.
@@ -1819,7 +1830,7 @@
     }
     try {
       List<bool> errorFound = [false];
-      AnalysisErrorListener listener = new AnalysisErrorListener_12(errorFound);
+      AnalysisErrorListener listener = new AnalysisErrorListener_13(errorFound);
       StringScanner scanner = new StringScanner(null, referenceSource, listener);
       scanner.setSourceStart(1, 1, sourceOffset);
       Token firstToken = scanner.tokenize();
@@ -4259,8 +4270,9 @@
    */
   StringInterpolation parseStringInterpolation(Token string) {
     List<InterpolationElement> elements = new List<InterpolationElement>();
-    elements.add(new InterpolationString.full(string, computeStringValue(string.lexeme)));
-    while (matches5(TokenType.STRING_INTERPOLATION_EXPRESSION) || matches5(TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
+    bool hasMore = matches5(TokenType.STRING_INTERPOLATION_EXPRESSION) || matches5(TokenType.STRING_INTERPOLATION_IDENTIFIER);
+    elements.add(new InterpolationString.full(string, computeStringValue(string.lexeme, true, !hasMore)));
+    while (hasMore) {
       if (matches5(TokenType.STRING_INTERPOLATION_EXPRESSION)) {
         Token openToken = andAdvance;
         Expression expression = parseExpression2();
@@ -4278,7 +4290,8 @@
       }
       if (matches5(TokenType.STRING)) {
         string = andAdvance;
-        elements.add(new InterpolationString.full(string, computeStringValue(string.lexeme)));
+        hasMore = matches5(TokenType.STRING_INTERPOLATION_EXPRESSION) || matches5(TokenType.STRING_INTERPOLATION_IDENTIFIER);
+        elements.add(new InterpolationString.full(string, computeStringValue(string.lexeme, false, !hasMore)));
       }
     }
     return new StringInterpolation.full(elements);
@@ -4302,7 +4315,7 @@
       if (matches5(TokenType.STRING_INTERPOLATION_EXPRESSION) || matches5(TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
         strings.add(parseStringInterpolation(string));
       } else {
-        strings.add(new SimpleStringLiteral.full(string, computeStringValue(string.lexeme)));
+        strings.add(new SimpleStringLiteral.full(string, computeStringValue(string.lexeme, true, true)));
       }
     }
     if (strings.length < 1) {
@@ -4419,24 +4432,26 @@
    */
   SymbolLiteral parseSymbolLiteral() {
     Token poundSign = andAdvance;
-    List<SimpleIdentifier> components = new List<SimpleIdentifier>();
+    List<Token> components = new List<Token>();
     if (matches5(TokenType.IDENTIFIER)) {
-      components.add(parseSimpleIdentifier());
+      components.add(andAdvance);
       while (matches5(TokenType.PERIOD)) {
         advance();
         if (matches5(TokenType.IDENTIFIER)) {
-          components.add(parseSimpleIdentifier());
+          components.add(andAdvance);
         } else {
           reportError7(ParserErrorCode.MISSING_IDENTIFIER, []);
-          components.add(createSyntheticIdentifier());
+          components.add(createSyntheticToken2(TokenType.IDENTIFIER));
           break;
         }
       }
+    } else if (_currentToken.isOperator) {
+      components.add(andAdvance);
     } else {
       reportError7(ParserErrorCode.MISSING_IDENTIFIER, []);
-      components.add(createSyntheticIdentifier());
+      components.add(createSyntheticToken2(TokenType.IDENTIFIER));
     }
-    return new SymbolLiteral.full(poundSign, components);
+    return new SymbolLiteral.full(poundSign, new List.from(components));
   }
 
   /**
@@ -5711,13 +5726,13 @@
     }
   }
 }
-class KeywordToken_11 extends KeywordToken {
-  KeywordToken_11(Keyword arg0, int arg1) : super(arg0, arg1);
+class KeywordToken_12 extends KeywordToken {
+  KeywordToken_12(Keyword arg0, int arg1) : super(arg0, arg1);
   int get length => 0;
 }
-class AnalysisErrorListener_12 implements AnalysisErrorListener {
+class AnalysisErrorListener_13 implements AnalysisErrorListener {
   List<bool> errorFound;
-  AnalysisErrorListener_12(this.errorFound);
+  AnalysisErrorListener_13(this.errorFound);
   void onError(AnalysisError error) {
     errorFound[0] = true;
   }
@@ -5730,7 +5745,7 @@
  *
  * @coverage dart.engine.parser
  */
-class ParserErrorCode implements Comparable<ParserErrorCode>, ErrorCode {
+class ParserErrorCode implements Enum<ParserErrorCode>, ErrorCode {
   static final ParserErrorCode ABSTRACT_CLASS_MEMBER = new ParserErrorCode.con2('ABSTRACT_CLASS_MEMBER', 0, "Members of classes cannot be declared to be 'abstract'");
   static final ParserErrorCode ABSTRACT_STATIC_METHOD = new ParserErrorCode.con2('ABSTRACT_STATIC_METHOD', 1, "Static methods cannot be declared to be 'abstract'");
   static final ParserErrorCode ABSTRACT_TOP_LEVEL_FUNCTION = new ParserErrorCode.con2('ABSTRACT_TOP_LEVEL_FUNCTION', 2, "Top-level functions cannot be declared to be 'abstract'");
@@ -5823,40 +5838,41 @@
   static final ParserErrorCode MULTIPLE_WITH_CLAUSES = new ParserErrorCode.con2('MULTIPLE_WITH_CLAUSES', 89, "Each class definition can have at most one with clause");
   static final ParserErrorCode NAMED_FUNCTION_EXPRESSION = new ParserErrorCode.con2('NAMED_FUNCTION_EXPRESSION', 90, "Function expressions cannot be named");
   static final ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con2('NAMED_PARAMETER_OUTSIDE_GROUP', 91, "Named parameters must be enclosed in curly braces ('{' and '}')");
-  static final ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = new ParserErrorCode.con2('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', 92, "Native functions can only be declared in the SDK and code that is loaded through native extensions");
-  static final ParserErrorCode NON_CONSTRUCTOR_FACTORY = new ParserErrorCode.con2('NON_CONSTRUCTOR_FACTORY', 93, "Only constructors can be declared to be a 'factory'");
-  static final ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = new ParserErrorCode.con2('NON_IDENTIFIER_LIBRARY_NAME', 94, "The name of a library must be an identifier");
-  static final ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = new ParserErrorCode.con2('NON_PART_OF_DIRECTIVE_IN_PART', 95, "The part-of directive must be the only directive in a part");
-  static final ParserErrorCode NON_USER_DEFINABLE_OPERATOR = new ParserErrorCode.con2('NON_USER_DEFINABLE_OPERATOR', 96, "The operator '%s' is not user definable");
-  static final ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = new ParserErrorCode.con2('NORMAL_BEFORE_OPTIONAL_PARAMETERS', 97, "Normal parameters must occur before optional parameters");
-  static final ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = new ParserErrorCode.con2('POSITIONAL_AFTER_NAMED_ARGUMENT', 98, "Positional arguments must occur before named arguments");
-  static final ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con2('POSITIONAL_PARAMETER_OUTSIDE_GROUP', 99, "Positional parameters must be enclosed in square brackets ('[' and ']')");
-  static final ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR = new ParserErrorCode.con2('REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR', 100, "Only factory constructor can specify '=' redirection.");
-  static final ParserErrorCode STATIC_AFTER_CONST = new ParserErrorCode.con2('STATIC_AFTER_CONST', 101, "The modifier 'static' should be before the modifier 'const'");
-  static final ParserErrorCode STATIC_AFTER_FINAL = new ParserErrorCode.con2('STATIC_AFTER_FINAL', 102, "The modifier 'static' should be before the modifier 'final'");
-  static final ParserErrorCode STATIC_AFTER_VAR = new ParserErrorCode.con2('STATIC_AFTER_VAR', 103, "The modifier 'static' should be before the modifier 'var'");
-  static final ParserErrorCode STATIC_CONSTRUCTOR = new ParserErrorCode.con2('STATIC_CONSTRUCTOR', 104, "Constructors cannot be static");
-  static final ParserErrorCode STATIC_GETTER_WITHOUT_BODY = new ParserErrorCode.con2('STATIC_GETTER_WITHOUT_BODY', 105, "A 'static' getter must have a body");
-  static final ParserErrorCode STATIC_OPERATOR = new ParserErrorCode.con2('STATIC_OPERATOR', 106, "Operators cannot be static");
-  static final ParserErrorCode STATIC_SETTER_WITHOUT_BODY = new ParserErrorCode.con2('STATIC_SETTER_WITHOUT_BODY', 107, "A 'static' setter must have a body");
-  static final ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = new ParserErrorCode.con2('STATIC_TOP_LEVEL_DECLARATION', 108, "Top-level declarations cannot be declared to be 'static'");
-  static final ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = new ParserErrorCode.con2('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', 109, "The 'default' case should be the last case in a switch statement");
-  static final ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = new ParserErrorCode.con2('SWITCH_HAS_MULTIPLE_DEFAULT_CASES', 110, "The 'default' case can only be declared once");
-  static final ParserErrorCode TOP_LEVEL_OPERATOR = new ParserErrorCode.con2('TOP_LEVEL_OPERATOR', 111, "Operators must be declared within a class");
-  static final ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con2('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', 112, "There is no '%s' to open a parameter group");
-  static final ParserErrorCode UNEXPECTED_TOKEN = new ParserErrorCode.con2('UNEXPECTED_TOKEN', 113, "Unexpected token '%s'");
-  static final ParserErrorCode WITH_BEFORE_EXTENDS = new ParserErrorCode.con2('WITH_BEFORE_EXTENDS', 114, "The extends clause must be before the with clause");
-  static final ParserErrorCode WITH_WITHOUT_EXTENDS = new ParserErrorCode.con2('WITH_WITHOUT_EXTENDS', 115, "The with clause cannot be used without an extends clause");
-  static final ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = new ParserErrorCode.con2('WRONG_SEPARATOR_FOR_NAMED_PARAMETER', 116, "The default value of a named parameter should be preceeded by ':'");
-  static final ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = new ParserErrorCode.con2('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', 117, "The default value of a positional parameter should be preceeded by '='");
-  static final ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con2('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', 118, "Expected '%s' to close parameter group");
-  static final ParserErrorCode VAR_AND_TYPE = new ParserErrorCode.con2('VAR_AND_TYPE', 119, "Variables cannot be declared using both 'var' and a type name; remove the 'var'");
-  static final ParserErrorCode VAR_AS_TYPE_NAME = new ParserErrorCode.con2('VAR_AS_TYPE_NAME', 120, "The keyword 'var' cannot be used as a type name");
-  static final ParserErrorCode VAR_CLASS = new ParserErrorCode.con2('VAR_CLASS', 121, "Classes cannot be declared to be 'var'");
-  static final ParserErrorCode VAR_RETURN_TYPE = new ParserErrorCode.con2('VAR_RETURN_TYPE', 122, "The return type cannot be 'var'");
-  static final ParserErrorCode VAR_TYPEDEF = new ParserErrorCode.con2('VAR_TYPEDEF', 123, "Type aliases cannot be declared to be 'var'");
-  static final ParserErrorCode VOID_PARAMETER = new ParserErrorCode.con2('VOID_PARAMETER', 124, "Parameters cannot have a type of 'void'");
-  static final ParserErrorCode VOID_VARIABLE = new ParserErrorCode.con2('VOID_VARIABLE', 125, "Variables cannot have a type of 'void'");
+  static final ParserErrorCode NATIVE_CLAUSE_IN_NON_SDK_CODE = new ParserErrorCode.con2('NATIVE_CLAUSE_IN_NON_SDK_CODE', 92, "Native clause can only be used in the SDK and code that is loaded through native extensions");
+  static final ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = new ParserErrorCode.con2('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', 93, "Native functions can only be declared in the SDK and code that is loaded through native extensions");
+  static final ParserErrorCode NON_CONSTRUCTOR_FACTORY = new ParserErrorCode.con2('NON_CONSTRUCTOR_FACTORY', 94, "Only constructors can be declared to be a 'factory'");
+  static final ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = new ParserErrorCode.con2('NON_IDENTIFIER_LIBRARY_NAME', 95, "The name of a library must be an identifier");
+  static final ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = new ParserErrorCode.con2('NON_PART_OF_DIRECTIVE_IN_PART', 96, "The part-of directive must be the only directive in a part");
+  static final ParserErrorCode NON_USER_DEFINABLE_OPERATOR = new ParserErrorCode.con2('NON_USER_DEFINABLE_OPERATOR', 97, "The operator '%s' is not user definable");
+  static final ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = new ParserErrorCode.con2('NORMAL_BEFORE_OPTIONAL_PARAMETERS', 98, "Normal parameters must occur before optional parameters");
+  static final ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = new ParserErrorCode.con2('POSITIONAL_AFTER_NAMED_ARGUMENT', 99, "Positional arguments must occur before named arguments");
+  static final ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con2('POSITIONAL_PARAMETER_OUTSIDE_GROUP', 100, "Positional parameters must be enclosed in square brackets ('[' and ']')");
+  static final ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR = new ParserErrorCode.con2('REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR', 101, "Only factory constructor can specify '=' redirection.");
+  static final ParserErrorCode STATIC_AFTER_CONST = new ParserErrorCode.con2('STATIC_AFTER_CONST', 102, "The modifier 'static' should be before the modifier 'const'");
+  static final ParserErrorCode STATIC_AFTER_FINAL = new ParserErrorCode.con2('STATIC_AFTER_FINAL', 103, "The modifier 'static' should be before the modifier 'final'");
+  static final ParserErrorCode STATIC_AFTER_VAR = new ParserErrorCode.con2('STATIC_AFTER_VAR', 104, "The modifier 'static' should be before the modifier 'var'");
+  static final ParserErrorCode STATIC_CONSTRUCTOR = new ParserErrorCode.con2('STATIC_CONSTRUCTOR', 105, "Constructors cannot be static");
+  static final ParserErrorCode STATIC_GETTER_WITHOUT_BODY = new ParserErrorCode.con2('STATIC_GETTER_WITHOUT_BODY', 106, "A 'static' getter must have a body");
+  static final ParserErrorCode STATIC_OPERATOR = new ParserErrorCode.con2('STATIC_OPERATOR', 107, "Operators cannot be static");
+  static final ParserErrorCode STATIC_SETTER_WITHOUT_BODY = new ParserErrorCode.con2('STATIC_SETTER_WITHOUT_BODY', 108, "A 'static' setter must have a body");
+  static final ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = new ParserErrorCode.con2('STATIC_TOP_LEVEL_DECLARATION', 109, "Top-level declarations cannot be declared to be 'static'");
+  static final ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = new ParserErrorCode.con2('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', 110, "The 'default' case should be the last case in a switch statement");
+  static final ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = new ParserErrorCode.con2('SWITCH_HAS_MULTIPLE_DEFAULT_CASES', 111, "The 'default' case can only be declared once");
+  static final ParserErrorCode TOP_LEVEL_OPERATOR = new ParserErrorCode.con2('TOP_LEVEL_OPERATOR', 112, "Operators must be declared within a class");
+  static final ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con2('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', 113, "There is no '%s' to open a parameter group");
+  static final ParserErrorCode UNEXPECTED_TOKEN = new ParserErrorCode.con2('UNEXPECTED_TOKEN', 114, "Unexpected token '%s'");
+  static final ParserErrorCode WITH_BEFORE_EXTENDS = new ParserErrorCode.con2('WITH_BEFORE_EXTENDS', 115, "The extends clause must be before the with clause");
+  static final ParserErrorCode WITH_WITHOUT_EXTENDS = new ParserErrorCode.con2('WITH_WITHOUT_EXTENDS', 116, "The with clause cannot be used without an extends clause");
+  static final ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = new ParserErrorCode.con2('WRONG_SEPARATOR_FOR_NAMED_PARAMETER', 117, "The default value of a named parameter should be preceeded by ':'");
+  static final ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = new ParserErrorCode.con2('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', 118, "The default value of a positional parameter should be preceeded by '='");
+  static final ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con2('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', 119, "Expected '%s' to close parameter group");
+  static final ParserErrorCode VAR_AND_TYPE = new ParserErrorCode.con2('VAR_AND_TYPE', 120, "Variables cannot be declared using both 'var' and a type name; remove the 'var'");
+  static final ParserErrorCode VAR_AS_TYPE_NAME = new ParserErrorCode.con2('VAR_AS_TYPE_NAME', 121, "The keyword 'var' cannot be used as a type name");
+  static final ParserErrorCode VAR_CLASS = new ParserErrorCode.con2('VAR_CLASS', 122, "Classes cannot be declared to be 'var'");
+  static final ParserErrorCode VAR_RETURN_TYPE = new ParserErrorCode.con2('VAR_RETURN_TYPE', 123, "The return type cannot be 'var'");
+  static final ParserErrorCode VAR_TYPEDEF = new ParserErrorCode.con2('VAR_TYPEDEF', 124, "Type aliases cannot be declared to be 'var'");
+  static final ParserErrorCode VOID_PARAMETER = new ParserErrorCode.con2('VOID_PARAMETER', 125, "Parameters cannot have a type of 'void'");
+  static final ParserErrorCode VOID_VARIABLE = new ParserErrorCode.con2('VOID_VARIABLE', 126, "Variables cannot have a type of 'void'");
   static final List<ParserErrorCode> values = [
       ABSTRACT_CLASS_MEMBER,
       ABSTRACT_STATIC_METHOD,
@@ -5950,6 +5966,7 @@
       MULTIPLE_WITH_CLAUSES,
       NAMED_FUNCTION_EXPRESSION,
       NAMED_PARAMETER_OUTSIDE_GROUP,
+      NATIVE_CLAUSE_IN_NON_SDK_CODE,
       NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE,
       NON_CONSTRUCTOR_FACTORY,
       NON_IDENTIFIER_LIBRARY_NAME,
@@ -6447,7 +6464,7 @@
     if (node.isCascaded) {
       _writer.print("..");
     } else {
-      visit(node.array);
+      visit(node.target);
     }
     _writer.print('[');
     visit(node.index);
@@ -6733,7 +6750,7 @@
   }
   Object visitSymbolLiteral(SymbolLiteral node) {
     _writer.print("#");
-    visitList5(node.components, ".");
+    visitList8(node.components, ".");
     return null;
   }
   Object visitThisExpression(ThisExpression node) {
@@ -6950,4 +6967,23 @@
       }
     }
   }
+
+  /**
+   * Print a list of tokens, separated by the given separator.
+   *
+   * @param tokens the tokens to be printed
+   * @param separator the separator to be printed between adjacent tokens
+   */
+  void visitList8(List<Token> tokens, String separator) {
+    int size = tokens.length;
+    for (int i = 0; i < size; i++) {
+      if ("\n" == separator) {
+        _writer.print("\n");
+        indent();
+      } else if (i > 0) {
+        _writer.print(separator);
+      }
+      _writer.print(tokens[i].lexeme);
+    }
+  }
 }
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/generated/resolver.dart b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
index 3891934..2b056f4 100644
--- a/pkg/analyzer_experimental/lib/src/generated/resolver.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
@@ -1248,6 +1248,625 @@
   }
 }
 /**
+ * Instances of the class `DeadCodeVerifier` traverse an AST structure looking for cases of
+ * [HintCode#DEAD_CODE].
+ *
+ * @coverage dart.engine.resolver
+ */
+class DeadCodeVerifier extends RecursiveASTVisitor<Object> {
+
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  ErrorReporter _errorReporter;
+
+  /**
+   * Create a new instance of the [DeadCodeVerifier].
+   *
+   * @param errorReporter the error reporter
+   */
+  DeadCodeVerifier(ErrorReporter errorReporter) {
+    this._errorReporter = errorReporter;
+  }
+  Object visitBinaryExpression(BinaryExpression node) {
+    sc.Token operator = node.operator;
+    bool isAmpAmp = identical(operator.type, sc.TokenType.AMPERSAND_AMPERSAND);
+    bool isBarBar = identical(operator.type, sc.TokenType.BAR_BAR);
+    if (isAmpAmp || isBarBar) {
+      Expression lhsCondition = node.leftOperand;
+      ValidResult lhsResult = getConstantBooleanValue(lhsCondition);
+      if (lhsResult != null) {
+        if (identical(lhsResult, ValidResult.RESULT_TRUE) && isBarBar) {
+          _errorReporter.reportError2(HintCode.DEAD_CODE, node.rightOperand, []);
+          safelyVisit(lhsCondition);
+          return null;
+        } else if (identical(lhsResult, ValidResult.RESULT_FALSE) && isAmpAmp) {
+          _errorReporter.reportError2(HintCode.DEAD_CODE, node.rightOperand, []);
+          safelyVisit(lhsCondition);
+          return null;
+        }
+      }
+    }
+    return super.visitBinaryExpression(node);
+  }
+
+  /**
+   * For each [Block], this method reports and error on all statements between the end of the
+   * block and the first return statement (assuming there it is not at the end of the block.)
+   *
+   * @param node the block to evaluate
+   */
+  Object visitBlock(Block node) {
+    NodeList<Statement> statements = node.statements;
+    int size = statements.length;
+    for (int i = 0; i < size; i++) {
+      Statement currentStatement = statements[i];
+      safelyVisit(currentStatement);
+      if (currentStatement is ReturnStatement && i != size - 1) {
+        Statement nextStatement = statements[i + 1];
+        Statement lastStatement = statements[size - 1];
+        int offset = nextStatement.offset;
+        int length = lastStatement.end - offset;
+        _errorReporter.reportError3(HintCode.DEAD_CODE, offset, length, []);
+        return null;
+      }
+    }
+    return null;
+  }
+  Object visitConditionalExpression(ConditionalExpression node) {
+    Expression conditionExpression = node.condition;
+    ValidResult result = getConstantBooleanValue(conditionExpression);
+    if (result != null) {
+      if (identical(result, ValidResult.RESULT_TRUE)) {
+        _errorReporter.reportError2(HintCode.DEAD_CODE, node.elseExpression, []);
+        safelyVisit(node.thenExpression);
+        return null;
+      } else {
+        _errorReporter.reportError2(HintCode.DEAD_CODE, node.thenExpression, []);
+        safelyVisit(node.elseExpression);
+        return null;
+      }
+    }
+    return super.visitConditionalExpression(node);
+  }
+  Object visitIfStatement(IfStatement node) {
+    Expression conditionExpression = node.condition;
+    ValidResult result = getConstantBooleanValue(conditionExpression);
+    if (result != null) {
+      if (identical(result, ValidResult.RESULT_TRUE)) {
+        Statement elseStatement = node.elseStatement;
+        if (elseStatement != null) {
+          _errorReporter.reportError2(HintCode.DEAD_CODE, elseStatement, []);
+          safelyVisit(node.thenStatement);
+          return null;
+        }
+      } else {
+        _errorReporter.reportError2(HintCode.DEAD_CODE, node.thenStatement, []);
+        safelyVisit(node.elseStatement);
+        return null;
+      }
+    }
+    return super.visitIfStatement(node);
+  }
+  Object visitTryStatement(TryStatement node) {
+    safelyVisit(node.body);
+    safelyVisit(node.finallyClause);
+    NodeList<CatchClause> catchClauses = node.catchClauses;
+    int numOfCatchClauses = catchClauses.length;
+    List<Type2> visitedTypes = new List<Type2>();
+    for (int i = 0; i < numOfCatchClauses; i++) {
+      CatchClause catchClause = catchClauses[i];
+      if (catchClause.onKeyword != null) {
+        TypeName typeName = catchClause.exceptionType;
+        if (typeName != null && typeName.type != null) {
+          Type2 currentType = typeName.type;
+          if (currentType.isObject) {
+            safelyVisit(catchClause);
+            if (i + 1 != numOfCatchClauses) {
+              CatchClause nextCatchClause = catchClauses[i + 1];
+              CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
+              int offset = nextCatchClause.offset;
+              int length = lastCatchClause.end - offset;
+              _errorReporter.reportError3(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
+              return null;
+            }
+          }
+          for (Type2 type in visitedTypes) {
+            if (currentType.isSubtypeOf(type)) {
+              CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
+              int offset = catchClause.offset;
+              int length = lastCatchClause.end - offset;
+              _errorReporter.reportError3(HintCode.DEAD_CODE_ON_CATCH_SUBTYPE, offset, length, [currentType.displayName, type.displayName]);
+              return null;
+            }
+          }
+          visitedTypes.add(currentType);
+        }
+        safelyVisit(catchClause);
+      } else {
+        safelyVisit(catchClause);
+        if (i + 1 != numOfCatchClauses) {
+          CatchClause nextCatchClause = catchClauses[i + 1];
+          CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
+          int offset = nextCatchClause.offset;
+          int length = lastCatchClause.end - offset;
+          _errorReporter.reportError3(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
+          return null;
+        }
+      }
+    }
+    return null;
+  }
+  Object visitWhileStatement(WhileStatement node) {
+    Expression conditionExpression = node.condition;
+    safelyVisit(conditionExpression);
+    ValidResult result = getConstantBooleanValue(conditionExpression);
+    if (result != null) {
+      if (identical(result, ValidResult.RESULT_FALSE)) {
+        _errorReporter.reportError2(HintCode.DEAD_CODE, node.body, []);
+        return null;
+      }
+    }
+    safelyVisit(node.body);
+    return null;
+  }
+
+  /**
+   * Given some [Expression], this method returns [ValidResult#RESULT_TRUE] if it is
+   * `true`, [ValidResult#RESULT_FALSE] if it is `false`, or `null` if the
+   * expression is not a constant boolean value.
+   *
+   * @param expression the expression to evaluate
+   * @return [ValidResult#RESULT_TRUE] if it is `true`, [ValidResult#RESULT_FALSE]
+   *         if it is `false`, or `null` if the expression is not a constant boolean
+   *         value
+   */
+  ValidResult getConstantBooleanValue(Expression expression) {
+    if (expression is BooleanLiteral) {
+      if (((expression as BooleanLiteral)).value) {
+        return ValidResult.RESULT_TRUE;
+      } else {
+        return ValidResult.RESULT_FALSE;
+      }
+    } else {
+      EvaluationResultImpl result = expression.accept(new ConstantVisitor());
+      if (identical(result, ValidResult.RESULT_TRUE)) {
+        return ValidResult.RESULT_TRUE;
+      } else if (identical(result, ValidResult.RESULT_FALSE)) {
+        return ValidResult.RESULT_FALSE;
+      }
+      return null;
+    }
+  }
+
+  /**
+   * If the given node is not `null`, visit this instance of the dead code verifier.
+   *
+   * @param node the node to be visited
+   */
+  void safelyVisit(ASTNode node) {
+    if (node != null) {
+      node.accept(this);
+    }
+  }
+}
+/**
+ * Instances of the class `HintGenerator` traverse a library's worth of dart code at a time to
+ * generate hints over the set of sources.
+ *
+ * @see HintCode
+ * @coverage dart.engine.resolver
+ */
+class HintGenerator {
+  List<CompilationUnit> _compilationUnits;
+  AnalysisContext _context;
+  AnalysisErrorListener _errorListener;
+  ImportsVerifier _importsVerifier;
+  DeadCodeVerifier _deadCodeVerifier;
+  HintGenerator(List<CompilationUnit> compilationUnits, AnalysisContext context, AnalysisErrorListener errorListener) {
+    this._compilationUnits = compilationUnits;
+    this._context = context;
+    this._errorListener = errorListener;
+    LibraryElement library = compilationUnits[0].element.library;
+    _importsVerifier = new ImportsVerifier(library);
+  }
+  void generateForLibrary() {
+    for (int i = 0; i < _compilationUnits.length; i++) {
+      CompilationUnitElement element = _compilationUnits[i].element;
+      if (element != null) {
+        if (i == 0) {
+          _importsVerifier.inDefiningCompilationUnit = true;
+          generateForCompilationUnit(_compilationUnits[i], element.source);
+          _importsVerifier.inDefiningCompilationUnit = false;
+        } else {
+          generateForCompilationUnit(_compilationUnits[i], element.source);
+        }
+      }
+    }
+    _importsVerifier.generateUnusedImportHints(new ErrorReporter(_errorListener, _compilationUnits[0].element.source));
+  }
+  void generateForCompilationUnit(CompilationUnit unit, Source source) {
+    ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
+    _importsVerifier.visitCompilationUnit(unit);
+    _deadCodeVerifier = new DeadCodeVerifier(errorReporter);
+    _deadCodeVerifier.visitCompilationUnit(unit);
+  }
+}
+/**
+ * Instances of the class `ImportsVerifier` visit all of the referenced libraries in the
+ * source code verifying that all of the imports are used, otherwise a
+ * [HintCode#UNUSED_IMPORT] is generated with
+ * [generateUnusedImportHints].
+ *
+ * While this class does not yet have support for an "Organize Imports" action, this logic built up
+ * in this class could be used for such an action in the future.
+ *
+ * @coverage dart.engine.resolver
+ */
+class ImportsVerifier extends RecursiveASTVisitor<Object> {
+
+  /**
+   * This is set to `true` if the current compilation unit which is being visited is the
+   * defining compilation unit for the library, its value can be set with
+   * [setInDefiningCompilationUnit].
+   */
+  bool _inDefiningCompilationUnit = false;
+
+  /**
+   * The current library.
+   */
+  LibraryElement _currentLibrary;
+
+  /**
+   * A list of [ImportDirective]s that the current library imports, as identifiers are visited
+   * by this visitor and an import has been identified as being used by the library, the
+   * [ImportDirective] is removed from this list. After all the sources in the library have
+   * been evaluated, this list represents the set of unused imports.
+   *
+   * @see ImportsVerifier#generateUnusedImportErrors(ErrorReporter)
+   */
+  List<ImportDirective> _unusedImports;
+
+  /**
+   * This is a map between the set of [LibraryElement]s that the current library imports, and
+   * a list of [ImportDirective]s that imports the library. In cases where the current library
+   * imports a library with a single directive (such as `import lib1.dart;`), the library
+   * element will map to a list of one [ImportDirective], which will then be removed from the
+   * [unusedImports] list. In cases where the current library imports a library with multiple
+   * directives (such as `import lib1.dart; import lib1.dart show C;`), the
+   * [LibraryElement] will be mapped to a list of the import directives, and the namespace
+   * will need to be used to compute the correct [ImportDirective] being used, see
+   * [namespaceMap].
+   */
+  Map<LibraryElement, List<ImportDirective>> _libraryMap;
+
+  /**
+   * In cases where there is more than one import directive per library element, this mapping is
+   * used to determine which of the multiple import directives are used by generating a
+   * [Namespace] for each of the imports to do lookups in the same way that they are done from
+   * the [ElementResolver].
+   */
+  Map<ImportDirective, Namespace> _namespaceMap;
+
+  /**
+   * This is a map between prefix elements and the import directive from which they are derived. In
+   * cases where a type is referenced via a prefix element, the import directive can be marked as
+   * used (removed from the unusedImports) by looking at the resolved `lib` in `lib.X`,
+   * instead of looking at which library the `lib.X` resolves.
+   */
+  Map<PrefixElement, ImportDirective> _prefixElementMap;
+
+  /**
+   * Create a new instance of the [ImportsVerifier].
+   *
+   * @param errorReporter the error reporter
+   */
+  ImportsVerifier(LibraryElement library) {
+    this._currentLibrary = library;
+    this._unusedImports = new List<ImportDirective>();
+    this._libraryMap = new Map<LibraryElement, List<ImportDirective>>();
+    this._namespaceMap = new Map<ImportDirective, Namespace>();
+    this._prefixElementMap = new Map<PrefixElement, ImportDirective>();
+  }
+
+  /**
+   * After all of the compilation units have been visited by this visitor, this method can be called
+   * to report an [HintCode#UNUSED_IMPORT] hint for each of the import directives in the
+   * [unusedImports] list.
+   *
+   * @param errorReporter the error reporter to report the set of [HintCode#UNUSED_IMPORT]
+   *          hints to
+   */
+  void generateUnusedImportHints(ErrorReporter errorReporter) {
+    for (ImportDirective unusedImport in _unusedImports) {
+      errorReporter.reportError2(HintCode.UNUSED_IMPORT, unusedImport.uri, []);
+    }
+  }
+  Object visitCompilationUnit(CompilationUnit node) {
+    if (_inDefiningCompilationUnit) {
+      NodeList<Directive> directives = node.directives;
+      for (Directive directive in directives) {
+        if (directive is ImportDirective) {
+          ImportDirective importDirective = directive as ImportDirective;
+          LibraryElement libraryElement = importDirective.uriElement;
+          if (libraryElement != null) {
+            _unusedImports.add(importDirective);
+            if (importDirective.asToken != null) {
+              SimpleIdentifier prefixIdentifier = importDirective.prefix;
+              if (prefixIdentifier != null) {
+                Element element = prefixIdentifier.element;
+                if (element is PrefixElement) {
+                  PrefixElement prefixElementKey = element as PrefixElement;
+                  _prefixElementMap[prefixElementKey] = importDirective;
+                }
+              }
+            }
+            putIntoLibraryMap(libraryElement, importDirective);
+            addAdditionalLibrariesForExports(_libraryMap, libraryElement, importDirective, new List<LibraryElement>());
+          }
+        }
+      }
+    }
+    if (_unusedImports.isEmpty) {
+      return null;
+    }
+    return super.visitCompilationUnit(node);
+  }
+  Object visitExportDirective(ExportDirective node) => null;
+  Object visitImportDirective(ImportDirective node) => null;
+  Object visitLibraryDirective(LibraryDirective node) => null;
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    SimpleIdentifier prefixIdentifier = node.prefix;
+    Element element = prefixIdentifier.element;
+    if (element is PrefixElement) {
+      _unusedImports.remove(_prefixElementMap[element]);
+      return null;
+    }
+    return visitIdentifier(element, prefixIdentifier.name);
+  }
+  Object visitSimpleIdentifier(SimpleIdentifier node) => visitIdentifier(node.element, node.name);
+  void set inDefiningCompilationUnit(bool inDefiningCompilationUnit2) {
+    this._inDefiningCompilationUnit = inDefiningCompilationUnit2;
+  }
+
+  /**
+   * Recursively add any exported library elements into the [libraryMap].
+   */
+  void addAdditionalLibrariesForExports(Map<LibraryElement, List<ImportDirective>> map, LibraryElement library, ImportDirective importDirective, List<LibraryElement> exportPath) {
+    if (exportPath.contains(library)) {
+      return;
+    }
+    for (LibraryElement exportedLibraryElt in library.exportedLibraries) {
+      putIntoLibraryMap(exportedLibraryElt, importDirective);
+      exportPath.add(exportedLibraryElt);
+      addAdditionalLibrariesForExports(map, exportedLibraryElt, importDirective, exportPath);
+    }
+  }
+
+  /**
+   * Lookup and return the [Namespace] from the [namespaceMap], if the map does not
+   * have the computed namespace, compute it and cache it in the map. If the import directive is not
+   * resolved or is not resolvable, `null` is returned.
+   *
+   * @param importDirective the import directive used to compute the returned namespace
+   * @return the computed or looked up [Namespace]
+   */
+  Namespace computeNamespace(ImportDirective importDirective) {
+    Namespace namespace = _namespaceMap[importDirective];
+    if (namespace == null) {
+      ImportElement importElement = importDirective.element as ImportElement;
+      if (importElement != null) {
+        NamespaceBuilder builder = new NamespaceBuilder();
+        namespace = builder.createImportNamespace(importElement);
+        _namespaceMap[importDirective] = namespace;
+      }
+    }
+    return namespace;
+  }
+
+  /**
+   * The [libraryMap] is a mapping between a library elements and a list of import
+   * directives, but when adding these mappings into the [libraryMap], this method can be
+   * used to simply add the mapping between the library element an an import directive without
+   * needing to check to see if a list needs to be created.
+   */
+  void putIntoLibraryMap(LibraryElement libraryElement, ImportDirective importDirective) {
+    List<ImportDirective> importList = _libraryMap[libraryElement];
+    if (importList == null) {
+      importList = new List<ImportDirective>();
+      _libraryMap[libraryElement] = importList;
+    }
+    importList.add(importDirective);
+  }
+  Object visitIdentifier(Element element, String name) {
+    if (element == null) {
+      return null;
+    }
+    if (element is MultiplyDefinedElement) {
+      MultiplyDefinedElement multiplyDefinedElement = element as MultiplyDefinedElement;
+      for (Element elt in multiplyDefinedElement.conflictingElements) {
+        visitIdentifier(elt, name);
+      }
+      return null;
+    }
+    LibraryElement containingLibrary = element.library;
+    if (containingLibrary == null) {
+      return null;
+    }
+    if (_currentLibrary == containingLibrary) {
+      return null;
+    }
+    List<ImportDirective> importsFromSameLibrary = _libraryMap[containingLibrary];
+    if (importsFromSameLibrary == null) {
+      return null;
+    }
+    if (importsFromSameLibrary.length == 1) {
+      ImportDirective usedImportDirective = importsFromSameLibrary[0];
+      _unusedImports.remove(usedImportDirective);
+    } else {
+      for (ImportDirective importDirective in importsFromSameLibrary) {
+        Namespace namespace = computeNamespace(importDirective);
+        if (namespace != null && namespace.get(name) != null) {
+          _unusedImports.remove(importDirective);
+        }
+      }
+    }
+    return null;
+  }
+}
+/**
+ * Instances of the class `PubVerifier` traverse an AST structure looking for deviations from
+ * pub best practices.
+ */
+class PubVerifier extends RecursiveASTVisitor<Object> {
+  static String _PUBSPEC_YAML = "pubspec.yaml";
+
+  /**
+   * The analysis context containing the sources to be analyzed
+   */
+  AnalysisContext _context;
+
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  ErrorReporter _errorReporter;
+  PubVerifier(AnalysisContext context, ErrorReporter errorReporter) {
+    this._context = context;
+    this._errorReporter = errorReporter;
+  }
+  Object visitImportDirective(ImportDirective directive) {
+    return null;
+  }
+
+  /**
+   * This verifies that the passed file import directive is not contained in a source inside a
+   * package "lib" directory hierarchy referencing a source outside that package "lib" directory
+   * hierarchy.
+   *
+   * @param uriLiteral the import URL (not `null`)
+   * @param path the file path being verified (not `null`)
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE
+   */
+  bool checkForFileImportInsideLibReferencesFileOutside(StringLiteral uriLiteral, String path) {
+    Source source = getSource(uriLiteral);
+    String fullName = getSourceFullName(source);
+    if (fullName != null) {
+      int pathIndex = 0;
+      int fullNameIndex = fullName.length;
+      while (pathIndex < path.length && JavaString.startsWithBefore(path, "../", pathIndex)) {
+        fullNameIndex = JavaString.lastIndexOf(fullName, '/', fullNameIndex);
+        if (fullNameIndex < 4) {
+          return false;
+        }
+        if (JavaString.startsWithBefore(fullName, "/lib", fullNameIndex - 4)) {
+          String relativePubspecPath = path.substring(0, pathIndex + 3) + _PUBSPEC_YAML;
+          Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePubspecPath);
+          if (pubspecSource.exists()) {
+            _errorReporter.reportError2(PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE, uriLiteral, []);
+          }
+          return true;
+        }
+        pathIndex += 3;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed file import directive is not contained in a source outside a
+   * package "lib" directory hierarchy referencing a source inside that package "lib" directory
+   * hierarchy.
+   *
+   * @param uriLiteral the import URL (not `null`)
+   * @param path the file path being verified (not `null`)
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE
+   */
+  bool checkForFileImportOutsideLibReferencesFileInside(StringLiteral uriLiteral, String path) {
+    if (path.startsWith("lib/")) {
+      if (checkForFileImportOutsideLibReferencesFileInside2(uriLiteral, path, 0)) {
+        return true;
+      }
+    }
+    int pathIndex = path.indexOf("/lib/");
+    while (pathIndex != -1) {
+      if (checkForFileImportOutsideLibReferencesFileInside2(uriLiteral, path, pathIndex + 1)) {
+        return true;
+      }
+      pathIndex = JavaString.indexOf(path, "/lib/", pathIndex + 4);
+    }
+    return false;
+  }
+  bool checkForFileImportOutsideLibReferencesFileInside2(StringLiteral uriLiteral, String path, int pathIndex) {
+    Source source = getSource(uriLiteral);
+    String relativePubspecPath = path.substring(0, pathIndex) + _PUBSPEC_YAML;
+    Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePubspecPath);
+    if (!pubspecSource.exists()) {
+      return false;
+    }
+    String fullName = getSourceFullName(source);
+    if (fullName != null) {
+      if (!fullName.contains("/lib/")) {
+        _errorReporter.reportError2(PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE, uriLiteral, []);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed package import directive does not contain ".."
+   *
+   * @param uriLiteral the import URL (not `null`)
+   * @param path the path to be validated (not `null`)
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT
+   */
+  bool checkForPackageImportContainsDotDot(StringLiteral uriLiteral, String path) {
+    if (path.startsWith("../") || path.contains("/../")) {
+      _errorReporter.reportError2(PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT, uriLiteral, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Answer the source associated with the compilation unit containing the given AST node.
+   *
+   * @param node the node (not `null`)
+   * @return the source or `null` if it could not be determined
+   */
+  Source getSource(ASTNode node) {
+    Source source = null;
+    CompilationUnit unit = node.getAncestor(CompilationUnit);
+    if (unit != null) {
+      CompilationUnitElement element = unit.element;
+      if (element != null) {
+        source = element.source;
+      }
+    }
+    return source;
+  }
+
+  /**
+   * Answer the full name of the given source. The returned value will have all
+   * [File#separatorChar] replace by '/'.
+   *
+   * @param source the source
+   * @return the full name or `null` if it could not be determined
+   */
+  String getSourceFullName(Source source) {
+    if (source != null) {
+      String fullName = source.fullName;
+      if (fullName != null) {
+        return fullName.replaceAll(r'\', '/');
+      }
+    }
+    return null;
+  }
+}
+/**
  * Instances of the class `DeclarationResolver` are used to resolve declarations in an AST
  * structure to already built elements.
  */
@@ -1889,7 +2508,7 @@
    * The name of the method that will be invoked if an attempt is made to invoke an undefined method
    * on an object.
    */
-  static String _NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod";
+  static String NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod";
 
   /**
    * Initialize a newly created visitor to resolve the nodes in a compilation unit.
@@ -1913,7 +2532,7 @@
         node.staticElement = staticMethod;
         Type2 propagatedType = getPropagatedType(leftHandSide);
         MethodElement propagatedMethod = lookUpMethod(leftHandSide, propagatedType, methodName);
-        node.element = select2(staticMethod, propagatedMethod);
+        node.propagatedElement = propagatedMethod;
         if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
           _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_METHOD, operator, [methodName, staticType.displayName]);
         }
@@ -1932,7 +2551,7 @@
         node.staticElement = staticMethod;
         Type2 propagatedType = getPropagatedType(leftOperand);
         MethodElement propagatedMethod = lookUpMethod(leftOperand, propagatedType, methodName);
-        node.element = select2(staticMethod, propagatedMethod);
+        node.propagatedElement = propagatedMethod;
         if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
           _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
         }
@@ -2235,15 +2854,15 @@
     recordResolution2(methodName, staticElement, propagatedElement);
     ArgumentList argumentList = node.argumentList;
     if (staticElement != null) {
-      List<ParameterElement> parameters = computePropagatedParameters(argumentList, staticElement);
+      List<ParameterElement> parameters = computeCorrespondingParameters(argumentList, staticElement);
       if (parameters != null) {
         argumentList.correspondingStaticParameters = parameters;
       }
     }
     if (propagatedElement != null) {
-      List<ParameterElement> parameters = computePropagatedParameters(argumentList, propagatedElement);
+      List<ParameterElement> parameters = computeCorrespondingParameters(argumentList, propagatedElement);
       if (parameters != null) {
-        argumentList.correspondingParameters = parameters;
+        argumentList.correspondingPropagatedParameters = parameters;
       }
     }
     ErrorCode errorCode = checkForInvocationError(target, staticElement);
@@ -2290,7 +2909,7 @@
     node.staticElement = staticMethod;
     Type2 propagatedType = getPropagatedType(operand);
     MethodElement propagatedMethod = lookUpMethod(operand, propagatedType, methodName);
-    node.element = select2(staticMethod, propagatedMethod);
+    node.propagatedElement = propagatedMethod;
     if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
       _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, node.operator, [methodName, staticType.displayName]);
     }
@@ -2341,7 +2960,7 @@
       node.staticElement = staticMethod;
       Type2 propagatedType = getPropagatedType(operand);
       MethodElement propagatedMethod = lookUpMethod(operand, propagatedType, methodName);
-      node.element = select2(staticMethod, propagatedMethod);
+      node.propagatedElement = propagatedMethod;
       if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
         _resolver.reportError6(StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
       }
@@ -2385,16 +3004,16 @@
     return null;
   }
   Object visitSimpleIdentifier(SimpleIdentifier node) {
-    if (node.element != null) {
+    if (node.staticElement != null || node.element != null) {
       return null;
     }
     Element element = resolveSimpleIdentifier(node);
     if (isFactoryConstructorReturnType(node) && element != _resolver.enclosingClass) {
       _resolver.reportError(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS, node, []);
-    } else if (element == null) {
+    } else if (element == null || (element is PrefixElement && !isValidAsPrefix(node))) {
       if (isConstructorReturnType(node)) {
         _resolver.reportError(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
-      } else if (!classDeclaresNoSuchMethod(_resolver.enclosingClass)) {
+      } else {
         _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, node, [node.name]);
       }
     }
@@ -2491,22 +3110,22 @@
    * @param element the element to be invoked
    * @return the error code that should be reported
    */
-  ErrorCode checkForInvocationError(Expression target, Element element2) {
-    if (element2 is PropertyAccessorElement) {
-      FunctionType getterType = ((element2 as PropertyAccessorElement)).type;
+  ErrorCode checkForInvocationError(Expression target, Element element) {
+    if (element is PropertyAccessorElement) {
+      FunctionType getterType = ((element as PropertyAccessorElement)).type;
       if (getterType != null) {
         Type2 returnType = getterType.returnType;
         if (!isExecutableType(returnType)) {
           return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
         }
       }
-    } else if (element2 is ExecutableElement) {
+    } else if (element is ExecutableElement) {
       return null;
-    } else if (element2 == null && target is SuperExpression) {
+    } else if (element == null && target is SuperExpression) {
       return StaticTypeWarningCode.UNDEFINED_SUPER_METHOD;
     } else {
-      if (element2 is PropertyInducingElement) {
-        PropertyAccessorElement getter = ((element2 as PropertyInducingElement)).getter;
+      if (element is PropertyInducingElement) {
+        PropertyAccessorElement getter = ((element as PropertyInducingElement)).getter;
         FunctionType getterType = getter.type;
         if (getterType != null) {
           Type2 returnType = getterType.returnType;
@@ -2514,8 +3133,8 @@
             return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
           }
         }
-      } else if (element2 is VariableElement) {
-        Type2 variableType = ((element2 as VariableElement)).type;
+      } else if (element is VariableElement) {
+        Type2 variableType = ((element as VariableElement)).type;
         if (!isExecutableType(variableType)) {
           return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
         }
@@ -2524,10 +3143,8 @@
           ClassElement enclosingClass = _resolver.enclosingClass;
           if (enclosingClass == null) {
             return StaticTypeWarningCode.UNDEFINED_FUNCTION;
-          } else if (element2 == null) {
-            if (!classDeclaresNoSuchMethod(enclosingClass)) {
-              return StaticTypeWarningCode.UNDEFINED_METHOD;
-            }
+          } else if (element == null) {
+            return StaticTypeWarningCode.UNDEFINED_METHOD;
           } else {
             return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
           }
@@ -2535,7 +3152,7 @@
           Type2 targetType = getStaticType(target);
           if (targetType == null) {
             return StaticTypeWarningCode.UNDEFINED_FUNCTION;
-          } else if (!targetType.isDynamic && !classDeclaresNoSuchMethod2(targetType.element)) {
+          } else if (!targetType.isDynamic) {
             return StaticTypeWarningCode.UNDEFINED_METHOD;
           }
         }
@@ -2545,36 +3162,6 @@
   }
 
   /**
-   * Return `true` if the given class declares a method named "noSuchMethod" and is not the
-   * class 'Object'.
-   *
-   * @param element the class being tested
-   * @return `true` if the given class declares a method named "noSuchMethod"
-   */
-  bool classDeclaresNoSuchMethod(ClassElement classElement) {
-    if (classElement == null) {
-      return false;
-    }
-    MethodElement methodElement = classElement.lookUpMethod(_NO_SUCH_METHOD_METHOD_NAME, _resolver.definingLibrary);
-    return methodElement != null && methodElement.enclosingElement.supertype != null;
-  }
-
-  /**
-   * Return `true` if the given element represents a class that declares a method named
-   * "noSuchMethod" and is not the class 'Object'.
-   *
-   * @param element the element being tested
-   * @return `true` if the given element represents a class that declares a method named
-   *         "noSuchMethod"
-   */
-  bool classDeclaresNoSuchMethod2(Element element) {
-    if (element is ClassElement) {
-      return classDeclaresNoSuchMethod((element as ClassElement));
-    }
-    return false;
-  }
-
-  /**
    * Given a list of arguments and the element that will be invoked using those argument, compute
    * the list of parameters that correspond to the list of arguments. Return the parameters that
    * correspond to the arguments, or `null` if no correspondence could be computed.
@@ -2583,7 +3170,7 @@
    * @param executableElement the element that will be invoked with the arguments
    * @return the parameters that correspond to the arguments
    */
-  List<ParameterElement> computePropagatedParameters(ArgumentList argumentList, Element element2) {
+  List<ParameterElement> computeCorrespondingParameters(ArgumentList argumentList, Element element2) {
     if (element2 is PropertyAccessorElement) {
       FunctionType getterType = ((element2 as PropertyAccessorElement)).type;
       if (getterType != null) {
@@ -2780,6 +3367,28 @@
   }
 
   /**
+   * Return `true` if the given node can validly be resolved to a prefix:
+   *
+   * * it is the prefix in an import directive, or
+   * * it is the prefix in a prefixed identifier.
+   *
+   *
+   * @param node the node being tested
+   * @return `true` if the given node is the prefix in an import directive
+   */
+  bool isValidAsPrefix(SimpleIdentifier node) {
+    ASTNode parent = node.parent;
+    if (parent is ImportDirective) {
+      return identical(((parent as ImportDirective)).prefix, node);
+    } else if (parent is PrefixedIdentifier) {
+      return true;
+    } else if (parent is MethodInvocation) {
+      return identical(((parent as MethodInvocation)).target, node);
+    }
+    return false;
+  }
+
+  /**
    * Looks up the method element with the given name for index expression, reports
    * [StaticWarningCode#UNDEFINED_OPERATOR] if not found.
    *
@@ -2793,7 +3402,7 @@
     MethodElement staticMethod = lookUpMethod(target, staticType, methodName);
     MethodElement propagatedMethod = lookUpMethod(target, propagatedType, methodName);
     node.staticElement = staticMethod;
-    node.element = select2(staticMethod, propagatedMethod);
+    node.propagatedElement = propagatedMethod;
     if (shouldReportMissingMember(staticType, staticMethod) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedMethod))) {
       sc.Token leftBracket = node.leftBracket;
       sc.Token rightBracket = node.rightBracket;
@@ -3315,7 +3924,7 @@
         String name = nameNode.name;
         ParameterElement element = namedParameters[name];
         if (element == null) {
-          ErrorCode errorCode = reportError2 ? CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER : StaticWarningCode.UNDEFINED_NAMED_PARAMETER;
+          ErrorCode errorCode = (reportError2 ? CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER : StaticWarningCode.UNDEFINED_NAMED_PARAMETER) as ErrorCode;
           _resolver.reportError(errorCode, nameNode, [name]);
         } else {
           resolvedParameters[i] = element;
@@ -3332,10 +3941,10 @@
       }
     }
     if (positionalArgumentCount < requiredParameters.length) {
-      ErrorCode errorCode = reportError2 ? CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS : StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS;
+      ErrorCode errorCode = (reportError2 ? CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS : StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS) as ErrorCode;
       _resolver.reportError(errorCode, argumentList, [requiredParameters.length, positionalArgumentCount]);
     } else if (positionalArgumentCount > unnamedParameterCount) {
-      ErrorCode errorCode = reportError2 ? CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS : StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS;
+      ErrorCode errorCode = (reportError2 ? CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS : StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS) as ErrorCode;
       _resolver.reportError(errorCode, argumentList, [unnamedParameterCount, positionalArgumentCount]);
     }
     return resolvedParameters;
@@ -3462,25 +4071,21 @@
     Element selectedElement = select(staticElement, propagatedElement);
     propertyName.element = selectedElement;
     if (shouldReportMissingMember(staticType, staticElement) && (_strictMode || propagatedType == null || shouldReportMissingMember(propagatedType, propagatedElement))) {
-      bool staticNoSuchMethod = staticType != null && classDeclaresNoSuchMethod2(staticType.element);
-      bool propagatedNoSuchMethod = propagatedType != null && classDeclaresNoSuchMethod2(propagatedType.element);
-      if (!staticNoSuchMethod && (_strictMode || !propagatedNoSuchMethod)) {
-        bool isStaticProperty = isStatic(selectedElement);
-        if (propertyName.inSetterContext()) {
-          if (isStaticProperty) {
-            _resolver.reportError(StaticWarningCode.UNDEFINED_SETTER, propertyName, [propertyName.name, staticType.displayName]);
-          } else {
-            _resolver.reportError(StaticTypeWarningCode.UNDEFINED_SETTER, propertyName, [propertyName.name, staticType.displayName]);
-          }
-        } else if (propertyName.inGetterContext()) {
-          if (isStaticProperty) {
-            _resolver.reportError(StaticWarningCode.UNDEFINED_GETTER, propertyName, [propertyName.name, staticType.displayName]);
-          } else {
-            _resolver.reportError(StaticTypeWarningCode.UNDEFINED_GETTER, propertyName, [propertyName.name, staticType.displayName]);
-          }
+      bool isStaticProperty = isStatic(selectedElement);
+      if (propertyName.inSetterContext()) {
+        if (isStaticProperty) {
+          _resolver.reportError(StaticWarningCode.UNDEFINED_SETTER, propertyName, [propertyName.name, staticType.displayName]);
         } else {
-          _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, propertyName, [propertyName.name]);
+          _resolver.reportError(StaticTypeWarningCode.UNDEFINED_SETTER, propertyName, [propertyName.name, staticType.displayName]);
         }
+      } else if (propertyName.inGetterContext()) {
+        if (isStaticProperty) {
+          _resolver.reportError(StaticWarningCode.UNDEFINED_GETTER, propertyName, [propertyName.name, staticType.displayName]);
+        } else {
+          _resolver.reportError(StaticTypeWarningCode.UNDEFINED_GETTER, propertyName, [propertyName.name, staticType.displayName]);
+        }
+      } else {
+        _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, propertyName, [propertyName.name]);
       }
     }
   }
@@ -3607,9 +4212,6 @@
     if (member != null || type == null || type.isDynamic) {
       return false;
     }
-    if (type is InterfaceType) {
-      return !classDeclaresNoSuchMethod(((type as InterfaceType)).element);
-    }
     return true;
   }
 }
@@ -3926,8 +4528,9 @@
     }
     InterfaceType supertype = classElt.supertype;
     ClassElement superclassElement = supertype != null ? supertype.element : null;
+    List<InterfaceType> mixins = classElt.mixins;
     List<InterfaceType> interfaces = classElt.interfaces;
-    if ((superclassElement == null || supertype.isObject) && interfaces.length == 0) {
+    if ((superclassElement == null || supertype.isObject) && mixins.length == 0 && interfaces.length == 0) {
       _interfaceLookup[classElt] = resultMap;
       return resultMap;
     }
@@ -3950,6 +4553,15 @@
         }
       }
     }
+    for (InterfaceType mixinType in mixins) {
+      ClassElement mixinElement = mixinType.element;
+      if (mixinElement == null) {
+        continue;
+      }
+      Map<String, ExecutableElement> mapWithMixinMembers = new Map<String, ExecutableElement>();
+      recordMapWithClassMembers(mapWithMixinMembers, mixinElement);
+      lookupMaps.add(mapWithMixinMembers);
+    }
     for (InterfaceType interfaceType in interfaces) {
       ClassElement interfaceElement = interfaceType.element;
       if (interfaceElement != null) {
@@ -4141,7 +4753,8 @@
    * Record the passed map with the set of all members (methods, getters and setters) in the class
    * into the passed map.
    *
-   * @param map some non-`null`
+   * @param map some non-`null` map to put the methods and accessors from the passed
+   *          [ClassElement] into
    * @param classElt the class element that will be recorded into the passed map
    */
   void recordMapWithClassMembers(Map<String, ExecutableElement> map, ClassElement classElt) {
@@ -4280,6 +4893,24 @@
   }
 
   /**
+   * Return an array of the [CompilationUnit]s that make up the library. The first unit is
+   * always the defining unit.
+   *
+   * @return an array of the [CompilationUnit]s that make up the library. The first unit is
+   *         always the defining unit
+   */
+  List<CompilationUnit> get compilationUnits {
+    List<CompilationUnit> unitArrayList = new List<CompilationUnit>();
+    unitArrayList.add(definingCompilationUnit);
+    for (Source source in _astMap.keys.toSet()) {
+      if (_librarySource != source) {
+        unitArrayList.add(getAST(source));
+      }
+    }
+    return new List.from(unitArrayList);
+  }
+
+  /**
    * Return a collection containing the sources for the compilation units in this library, including
    * the defining compilation unit.
    *
@@ -4396,6 +5027,7 @@
     }
     String uriContent = uriLiteral.stringValue.trim();
     _directiveUris[directive] = uriContent;
+    uriContent = Uri.encodeFull(uriContent);
     try {
       parseUriWithException(uriContent);
       Source source = getSource2(uriContent);
@@ -4969,6 +5601,7 @@
                   nameToPrefixMap[prefixName] = prefix;
                 }
                 importElement.prefix = prefix;
+                prefixNode.staticElement = prefix;
               }
               directive.element = importElement;
               imports.add(importElement);
@@ -5313,6 +5946,7 @@
     if (uriContent == null) {
       return null;
     }
+    uriContent = Uri.encodeFull(uriContent);
     try {
       parseUriWithException(uriContent);
       return _analysisContext.sourceFactory.resolveUri(librarySource, uriContent);
@@ -5350,9 +5984,10 @@
       unit.accept(constantVerifier);
       ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, library.libraryElement, _typeProvider, library.inheritanceManager);
       unit.accept(errorVerifier);
-      if (_enableHints) {
-        new HintVerifier(_analysisContext, errorReporter).visitCompilationUnit(unit);
-      }
+    }
+    if (_enableHints) {
+      HintGenerator hintGenerator = new HintGenerator(library.compilationUnits, _analysisContext, _errorListener);
+      hintGenerator.generateForLibrary();
     }
   }
 }
@@ -5674,7 +6309,7 @@
       try {
         _overrideManager.enterScope();
         propagateTrueState(condition);
-        thenStatement.accept(this);
+        visitStatementInScope(thenStatement);
       } finally {
         thenOverrides = _overrideManager.captureLocalOverrides();
         _overrideManager.exitScope();
@@ -5686,7 +6321,7 @@
       try {
         _overrideManager.enterScope();
         propagateFalseState(condition);
-        elseStatement.accept(this);
+        visitStatementInScope(elseStatement);
       } finally {
         elseOverrides = _overrideManager.captureLocalOverrides();
         _overrideManager.exitScope();
@@ -5798,7 +6433,7 @@
       try {
         _overrideManager.enterScope();
         propagateTrueState(condition);
-        body.accept(this);
+        visitStatementInScope(body);
       } finally {
         _overrideManager.exitScope();
       }
@@ -5886,7 +6521,7 @@
             recordPropagatedType(loopVariable.identifier, iteratorElementType);
           }
         }
-        body.accept(this);
+        visitStatementInScope(body);
       } finally {
         _overrideManager.exitScope();
       }
@@ -5901,7 +6536,7 @@
     _overrideManager.enterScope();
     try {
       propagateTrueState(node.condition);
-      safelyVisit(node.body);
+      visitStatementInScope(node.body);
       node.updaters.accept(this);
     } finally {
       _overrideManager.exitScope();
@@ -5988,7 +6623,7 @@
    */
   void inferFunctionExpressionsParametersTypes(ArgumentList argumentList) {
     for (Expression argument in argumentList.arguments) {
-      ParameterElement parameter = argument.parameterElement;
+      ParameterElement parameter = argument.propagatedParameterElement;
       if (parameter == null) {
         parameter = argument.staticParameterElement;
       }
@@ -6216,8 +6851,8 @@
   TypeProvider get typeProvider => _typeProvider;
   Object visitBlock(Block node) {
     Scope outerScope = _nameScope;
-    _nameScope = new EnclosedScope(_nameScope);
     try {
+      _nameScope = new EnclosedScope(_nameScope);
       super.visitBlock(node);
     } finally {
       _nameScope = outerScope;
@@ -6228,8 +6863,8 @@
     SimpleIdentifier exception = node.exceptionParameter;
     if (exception != null) {
       Scope outerScope = _nameScope;
-      _nameScope = new EnclosedScope(_nameScope);
       try {
+        _nameScope = new EnclosedScope(_nameScope);
         _nameScope.define(exception.element);
         SimpleIdentifier stackTrace = node.stackTraceParameter;
         if (stackTrace != null) {
@@ -6281,38 +6916,39 @@
     return null;
   }
   Object visitDoStatement(DoStatement node) {
-    LabelScope outerScope = _labelScope;
-    _labelScope = new LabelScope.con1(outerScope, false, false);
+    LabelScope outerLabelScope = _labelScope;
     try {
-      super.visitDoStatement(node);
+      _labelScope = new LabelScope.con1(_labelScope, false, false);
+      visitStatementInScope(node.body);
+      safelyVisit(node.condition);
     } finally {
-      _labelScope = outerScope;
+      _labelScope = outerLabelScope;
     }
     return null;
   }
   Object visitForEachStatement(ForEachStatement node) {
-    LabelScope outerLabelScope = _labelScope;
-    _labelScope = new LabelScope.con1(outerLabelScope, false, false);
     Scope outerNameScope = _nameScope;
-    _nameScope = new EnclosedScope(_nameScope);
+    LabelScope outerLabelScope = _labelScope;
     try {
+      _nameScope = new EnclosedScope(_nameScope);
+      _labelScope = new LabelScope.con1(outerLabelScope, false, false);
       visitForEachStatementInScope(node);
     } finally {
-      _nameScope = outerNameScope;
       _labelScope = outerLabelScope;
+      _nameScope = outerNameScope;
     }
     return null;
   }
   Object visitForStatement(ForStatement node) {
-    LabelScope outerLabelScope = _labelScope;
-    _labelScope = new LabelScope.con1(outerLabelScope, false, false);
     Scope outerNameScope = _nameScope;
-    _nameScope = new EnclosedScope(_nameScope);
+    LabelScope outerLabelScope = _labelScope;
     try {
+      _nameScope = new EnclosedScope(_nameScope);
+      _labelScope = new LabelScope.con1(outerLabelScope, false, false);
       visitForStatementInScope(node);
     } finally {
-      _nameScope = outerNameScope;
       _labelScope = outerLabelScope;
+      _nameScope = outerNameScope;
     }
     return null;
   }
@@ -6358,6 +6994,12 @@
     }
     return null;
   }
+  Object visitIfStatement(IfStatement node) {
+    safelyVisit(node.condition);
+    visitStatementInScope(node.thenStatement);
+    visitStatementInScope(node.elseStatement);
+    return null;
+  }
   Object visitLabeledStatement(LabeledStatement node) {
     LabelScope outerScope = addScopesFor(node.labels);
     try {
@@ -6380,8 +7022,8 @@
   Object visitSwitchCase(SwitchCase node) {
     node.expression.accept(this);
     Scope outerNameScope = _nameScope;
-    _nameScope = new EnclosedScope(_nameScope);
     try {
+      _nameScope = new EnclosedScope(_nameScope);
       node.statements.accept(this);
     } finally {
       _nameScope = outerNameScope;
@@ -6390,8 +7032,8 @@
   }
   Object visitSwitchDefault(SwitchDefault node) {
     Scope outerNameScope = _nameScope;
-    _nameScope = new EnclosedScope(_nameScope);
     try {
+      _nameScope = new EnclosedScope(_nameScope);
       node.statements.accept(this);
     } finally {
       _nameScope = outerNameScope;
@@ -6400,15 +7042,15 @@
   }
   Object visitSwitchStatement(SwitchStatement node) {
     LabelScope outerScope = _labelScope;
-    _labelScope = new LabelScope.con1(outerScope, true, false);
-    for (SwitchMember member in node.members) {
-      for (Label label in member.labels) {
-        SimpleIdentifier labelName = label.label;
-        LabelElement labelElement = labelName.element as LabelElement;
-        _labelScope = new LabelScope.con2(_labelScope, labelName.name, labelElement);
-      }
-    }
     try {
+      _labelScope = new LabelScope.con1(outerScope, true, false);
+      for (SwitchMember member in node.members) {
+        for (Label label in member.labels) {
+          SimpleIdentifier labelName = label.label;
+          LabelElement labelElement = labelName.element as LabelElement;
+          _labelScope = new LabelScope.con2(_labelScope, labelName.name, labelElement);
+        }
+      }
       super.visitSwitchStatement(node);
     } finally {
       _labelScope = outerScope;
@@ -6427,9 +7069,10 @@
   }
   Object visitWhileStatement(WhileStatement node) {
     LabelScope outerScope = _labelScope;
-    _labelScope = new LabelScope.con1(outerScope, false, false);
     try {
-      super.visitWhileStatement(node);
+      _labelScope = new LabelScope.con1(outerScope, false, false);
+      safelyVisit(node.condition);
+      visitStatementInScope(node.body);
     } finally {
       _labelScope = outerScope;
     }
@@ -6505,7 +7148,7 @@
   void visitForEachStatementInScope(ForEachStatement node) {
     safelyVisit(node.iterator);
     safelyVisit(node.loopVariable);
-    safelyVisit(node.body);
+    visitStatementInScope(node.body);
   }
 
   /**
@@ -6516,7 +7159,31 @@
    * @param node the statement to be visited
    */
   void visitForStatementInScope(ForStatement node) {
-    super.visitForStatement(node);
+    safelyVisit(node.variables);
+    safelyVisit(node.initialization);
+    safelyVisit(node.condition);
+    node.updaters.accept(this);
+    visitStatementInScope(node.body);
+  }
+
+  /**
+   * Visit the given statement after it's scope has been created. This is used by ResolverVisitor to
+   * correctly visit the 'then' and 'else' statements of an 'if' statement.
+   *
+   * @param node the statement to be visited
+   */
+  void visitStatementInScope(Statement node) {
+    if (node is Block) {
+      visitBlock((node as Block));
+    } else if (node != null) {
+      Scope outerNameScope = _nameScope;
+      try {
+        _nameScope = new EnclosedScope(_nameScope);
+        node.accept(this);
+      } finally {
+        _nameScope = outerNameScope;
+      }
+    }
   }
 
   /**
@@ -6753,7 +7420,7 @@
       Type2 staticType = getStaticType(rightHandSide);
       recordStaticType(node, staticType);
       Type2 overrideType = staticType;
-      Type2 propagatedType = getPropagatedType(rightHandSide);
+      Type2 propagatedType = rightHandSide.propagatedType;
       if (propagatedType != null) {
         if (propagatedType.isMoreSpecificThan(staticType)) {
           recordPropagatedType2(node, propagatedType);
@@ -6768,7 +7435,7 @@
       ExecutableElement staticMethodElement = node.staticElement;
       Type2 staticType = computeStaticReturnType(staticMethodElement);
       recordStaticType(node, staticType);
-      MethodElement propagatedMethodElement = node.element;
+      MethodElement propagatedMethodElement = node.propagatedElement;
       if (propagatedMethodElement != staticMethodElement) {
         Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
         if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
@@ -6821,7 +7488,7 @@
     Type2 staticType = computeStaticReturnType(staticMethodElement);
     staticType = refineBinaryExpressionType(node, staticType);
     recordStaticType(node, staticType);
-    MethodElement propagatedMethodElement = node.element;
+    MethodElement propagatedMethodElement = node.propagatedElement;
     if (propagatedMethodElement != staticMethodElement) {
       Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
       if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
@@ -6847,7 +7514,7 @@
    */
   Object visitCascadeExpression(CascadeExpression node) {
     recordStaticType(node, getStaticType(node.target));
-    recordPropagatedType2(node, getPropagatedType(node.target));
+    recordPropagatedType2(node, node.target.propagatedType);
     return null;
   }
 
@@ -6874,8 +7541,8 @@
       staticType = _dynamicType;
     }
     recordStaticType(node, staticType);
-    Type2 propagatedThenType = getPropagatedType(node.thenExpression);
-    Type2 propagatedElseType = getPropagatedType(node.elseExpression);
+    Type2 propagatedThenType = node.thenExpression.propagatedType;
+    Type2 propagatedElseType = node.elseExpression.propagatedType;
     if (propagatedThenType != null || propagatedElseType != null) {
       if (propagatedThenType == null) {
         propagatedThenType = staticThenType;
@@ -6969,7 +7636,7 @@
     if (staticPropagatedType != null && (staticStaticType == null || staticPropagatedType.isMoreSpecificThan(staticStaticType))) {
       recordPropagatedType2(node, staticPropagatedType);
     }
-    ExecutableElement propagatedMethodElement = node.element;
+    ExecutableElement propagatedMethodElement = node.propagatedElement;
     if (propagatedMethodElement != staticMethodElement) {
       Type2 propagatedStaticType = computeStaticReturnType(propagatedMethodElement);
       if (propagatedStaticType != null && (staticStaticType == null || propagatedStaticType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedStaticType.isMoreSpecificThan(staticPropagatedType))) {
@@ -6993,7 +7660,7 @@
       ExecutableElement staticMethodElement = node.staticElement;
       Type2 staticType = computeArgumentType(staticMethodElement);
       recordStaticType(node, staticType);
-      MethodElement propagatedMethodElement = node.element;
+      MethodElement propagatedMethodElement = node.propagatedElement;
       if (propagatedMethodElement != staticMethodElement) {
         Type2 propagatedType = computeArgumentType(propagatedMethodElement);
         if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
@@ -7004,7 +7671,7 @@
       ExecutableElement staticMethodElement = node.staticElement;
       Type2 staticType = computeStaticReturnType(staticMethodElement);
       recordStaticType(node, staticType);
-      MethodElement propagatedMethodElement = node.element;
+      MethodElement propagatedMethodElement = node.propagatedElement;
       if (propagatedMethodElement != staticMethodElement) {
         Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
         if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
@@ -7095,9 +7762,9 @@
     NodeList<Expression> elements = node.elements;
     int count = elements.length;
     if (count > 0) {
-      Type2 propagatedType = getBestType(elements[0]);
+      Type2 propagatedType = elements[0].bestType;
       for (int i = 1; i < count; i++) {
-        Type2 elementType = getBestType(elements[i]);
+        Type2 elementType = elements[i].bestType;
         if (propagatedType != elementType) {
           propagatedType = _dynamicType;
         } else {
@@ -7150,11 +7817,11 @@
     int count = entries.length;
     if (count > 0) {
       MapLiteralEntry entry = entries[0];
-      Type2 propagatedKeyType = getBestType(entry.key);
-      Type2 propagatedValueType = getBestType(entry.value);
+      Type2 propagatedKeyType = entry.key.bestType;
+      Type2 propagatedValueType = entry.value.bestType;
       for (int i = 1; i < count; i++) {
         entry = entries[i];
-        Type2 elementKeyType = getBestType(entry.key);
+        Type2 elementKeyType = entry.key.bestType;
         if (propagatedKeyType != elementKeyType) {
           propagatedKeyType = _dynamicType;
         } else {
@@ -7163,7 +7830,7 @@
             propagatedKeyType = _dynamicType;
           }
         }
-        Type2 elementValueType = getBestType(entry.value);
+        Type2 elementValueType = entry.value.bestType;
         if (propagatedValueType != elementValueType) {
           propagatedValueType = _dynamicType;
         } else {
@@ -7239,7 +7906,7 @@
     String methodName = methodNameNode.name;
     if (methodName == "then") {
       Expression target = node.realTarget;
-      Type2 targetType = target == null ? null : getBestType(target);
+      Type2 targetType = target == null ? null : target.bestType;
       if (isAsyncFutureType(targetType)) {
         NodeList<Expression> arguments = node.argumentList.arguments;
         if (arguments.length == 1) {
@@ -7266,7 +7933,7 @@
     if (methodName == "\$dom_createEvent") {
       Expression target = node.realTarget;
       if (target != null) {
-        Type2 targetType = getBestType(target);
+        Type2 targetType = target.bestType;
         if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
           LibraryElement library = targetType.element.library;
           if (isHtmlLibrary(library)) {
@@ -7291,7 +7958,7 @@
           }
         }
       } else {
-        Type2 targetType = getBestType(target);
+        Type2 targetType = target.bestType;
         if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
           LibraryElement library = targetType.element.library;
           if (isHtmlLibrary(library)) {
@@ -7304,7 +7971,7 @@
       }
     } else if (methodName == "\$dom_createElement") {
       Expression target = node.realTarget;
-      Type2 targetType = getBestType(target);
+      Type2 targetType = target.bestType;
       if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
         LibraryElement library = targetType.element.library;
         if (isHtmlLibrary(library)) {
@@ -7337,7 +8004,7 @@
   Object visitNamedExpression(NamedExpression node) {
     Expression expression = node.expression;
     recordStaticType(node, getStaticType(expression));
-    recordPropagatedType2(node, getPropagatedType(expression));
+    recordPropagatedType2(node, expression.propagatedType);
     return null;
   }
 
@@ -7352,7 +8019,7 @@
   Object visitParenthesizedExpression(ParenthesizedExpression node) {
     Expression expression = node.expression;
     recordStaticType(node, getStaticType(expression));
-    recordPropagatedType2(node, getPropagatedType(expression));
+    recordPropagatedType2(node, expression.propagatedType);
     return null;
   }
 
@@ -7393,7 +8060,7 @@
       }
     }
     recordStaticType(node, staticType);
-    recordPropagatedType2(node, getPropagatedType(operand));
+    recordPropagatedType2(node, operand.propagatedType);
     return null;
   }
 
@@ -7452,7 +8119,7 @@
         }
       }
       recordStaticType(node, staticType);
-      MethodElement propagatedMethodElement = node.element;
+      MethodElement propagatedMethodElement = node.propagatedElement;
       if (propagatedMethodElement != staticMethodElement) {
         Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
         if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
@@ -7635,6 +8302,10 @@
     }
     return null;
   }
+  Object visitSymbolLiteral(SymbolLiteral node) {
+    recordStaticType(node, _typeProvider.symbolType);
+    return null;
+  }
 
   /**
    * The Dart Language Specification, 12.10: <blockquote>The static type of `this` is the
@@ -7660,7 +8331,7 @@
   Object visitVariableDeclaration(VariableDeclaration node) {
     Expression initializer = node.initializer;
     if (initializer != null) {
-      Type2 rightType = getBestType(initializer);
+      Type2 rightType = initializer.bestType;
       SimpleIdentifier name = node.name;
       recordPropagatedType2(name, rightType);
       VariableElement element = name.element as VariableElement;
@@ -7711,11 +8382,11 @@
   Type2 computePropagatedReturnType2(FunctionBody body) {
     if (body is ExpressionFunctionBody) {
       ExpressionFunctionBody expressionBody = body as ExpressionFunctionBody;
-      return getBestType(expressionBody.expression);
+      return expressionBody.expression.bestType;
     }
     if (body is BlockFunctionBody) {
       List<Type2> result = [null];
-      body.accept(new GeneralizingASTVisitor_8(this, result));
+      body.accept(new GeneralizingASTVisitor_8(result));
       return result[0];
     }
     return null;
@@ -7799,24 +8470,6 @@
   }
 
   /**
-   * Return the propagated type of the given expression if it is available, or the static type if
-   * there is no propagated type.
-   *
-   * @param expression the expression whose type is to be returned
-   * @return the propagated or static type of the given expression
-   */
-  Type2 getBestType(Expression expression) {
-    Type2 type = expression.propagatedType;
-    if (type == null) {
-      type = expression.staticType;
-      if (type == null) {
-        return _dynamicType;
-      }
-    }
-    return type;
-  }
-
-  /**
    * If the given element name can be mapped to the name of a class defined within the given
    * library, return the type specified by the argument.
    *
@@ -7909,17 +8562,6 @@
   Type2 getFirstArgumentAsType2(LibraryElement library, ArgumentList argumentList, Map<String, String> nameMap) => getElementNameAsType(library, getFirstArgumentAsString(argumentList), nameMap);
 
   /**
-   * Return the propagated type of the given expression.
-   *
-   * @param expression the expression whose type is to be returned
-   * @return the propagated type of the given expression
-   */
-  Type2 getPropagatedType(Expression expression) {
-    Type2 type = expression.propagatedType;
-    return type;
-  }
-
-  /**
    * Return the static type of the given expression.
    *
    * @param expression the expression whose type is to be returned
@@ -8105,15 +8747,14 @@
   set thisType_J2DAccessor(__v) => _thisType = __v;
 }
 class GeneralizingASTVisitor_8 extends GeneralizingASTVisitor<Object> {
-  final StaticTypeAnalyzer StaticTypeAnalyzer_this;
   List<Type2> result;
-  GeneralizingASTVisitor_8(this.StaticTypeAnalyzer_this, this.result) : super();
+  GeneralizingASTVisitor_8(this.result) : super();
   Object visitExpression(Expression node) => null;
   Object visitReturnStatement(ReturnStatement node) {
     Type2 type;
     Expression expression = node.expression;
     if (expression != null) {
-      type = StaticTypeAnalyzer_this.getBestType(expression);
+      type = expression.bestType;
     } else {
       type = BottomTypeImpl.instance;
     }
@@ -8638,7 +9279,7 @@
     InterfaceType superclassType = null;
     ExtendsClause extendsClause = node.extendsClause;
     if (extendsClause != null) {
-      ErrorCode errorCode = node.withClause == null ? CompileTimeErrorCode.EXTENDS_NON_CLASS : CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS;
+      ErrorCode errorCode = (node.withClause == null ? CompileTimeErrorCode.EXTENDS_NON_CLASS : CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS) as ErrorCode;
       superclassType = resolveType(extendsClause.superclass, errorCode, errorCode);
       if (superclassType != typeProvider.objectType) {
         classElement.validMixin = false;
@@ -8826,6 +9467,7 @@
             } else {
               reportError(StaticWarningCode.NEW_WITH_NON_TYPE, prefixedIdentifier.identifier, [prefixedIdentifier.identifier.name]);
             }
+            setElement(prefix, element);
             return null;
           } else if (element != null) {
             name.name = prefixedIdentifier.identifier;
@@ -8874,7 +9516,11 @@
       elementValid = false;
     }
     if (!elementValid) {
-      setElement(typeName, _dynamicType.element);
+      if (element is MultiplyDefinedElement) {
+        setElement(typeName, element);
+      } else {
+        setElement(typeName, _dynamicType.element);
+      }
       typeName.staticType = _dynamicType;
       node.type = _dynamicType;
       return null;
@@ -9369,12 +10015,12 @@
     List<ParameterElement> parameters = getElements(parameterList);
     FunctionTypeAliasElementImpl aliasElement = new FunctionTypeAliasElementImpl(null);
     aliasElement.synthetic = true;
-    aliasElement.parameters = parameters;
+    aliasElement.shareParameters(parameters);
     aliasElement.returnType = computeReturnType(returnType2);
     FunctionTypeImpl type = new FunctionTypeImpl.con2(aliasElement);
     ClassElement definingClass = element.getAncestor(ClassElement);
     if (definingClass != null) {
-      aliasElement.typeVariables = definingClass.typeVariables;
+      aliasElement.shareTypeVariables(definingClass.typeVariables);
       type.typeArguments = definingClass.type.typeArguments;
     } else {
       FunctionTypeAliasElement alias = element.getAncestor(FunctionTypeAliasElement);
@@ -9654,51 +10300,6 @@
 class LibraryImportScope extends Scope {
 
   /**
-   * @return `true` if the given [Identifier] is the part of type annotation.
-   */
-  static bool isTypeAnnotation(Identifier identifier) {
-    ASTNode parent = identifier.parent;
-    if (parent is TypeName) {
-      ASTNode parent2 = parent.parent;
-      if (parent2 is FunctionDeclaration) {
-        FunctionDeclaration decl = parent2 as FunctionDeclaration;
-        return identical(decl.returnType, parent);
-      }
-      if (parent2 is FunctionTypeAlias) {
-        FunctionTypeAlias decl = parent2 as FunctionTypeAlias;
-        return identical(decl.returnType, parent);
-      }
-      if (parent2 is MethodDeclaration) {
-        MethodDeclaration decl = parent2 as MethodDeclaration;
-        return identical(decl.returnType, parent);
-      }
-      if (parent2 is VariableDeclarationList) {
-        VariableDeclarationList decl = parent2 as VariableDeclarationList;
-        return identical(decl.type, parent);
-      }
-      if (parent2 is SimpleFormalParameter) {
-        SimpleFormalParameter decl = parent2 as SimpleFormalParameter;
-        return identical(decl.type, parent);
-      }
-      if (parent2 is TypeParameter) {
-        TypeParameter decl = parent2 as TypeParameter;
-        return identical(decl.bound, parent);
-      }
-      if (parent2 is TypeArgumentList) {
-        ASTNode parent3 = parent2.parent;
-        if (parent3 is TypeName) {
-          TypeName typeName = parent3 as TypeName;
-          if (identical((typeName).typeArguments, parent2)) {
-            return isTypeAnnotation(typeName.name);
-          }
-        }
-      }
-      return false;
-    }
-    return false;
-  }
-
-  /**
    * The element representing the library in which this scope is enclosed.
    */
   LibraryElement _definingLibrary;
@@ -9760,8 +10361,7 @@
       if (enclosingLibrary != null) {
         libName2 = enclosingLibrary.definingCompilationUnit.displayName;
       }
-      ErrorCode errorCode = isTypeAnnotation(identifier) ? StaticWarningCode.AMBIGUOUS_IMPORT : CompileTimeErrorCode.AMBIGUOUS_IMPORT;
-      _errorListener.onError(new AnalysisError.con2(source, identifier.offset, identifier.length, errorCode, [foundEltName, libName1, libName2]));
+      _errorListener.onError(new AnalysisError.con2(source, identifier.offset, identifier.length, StaticWarningCode.AMBIGUOUS_IMPORT, [foundEltName, libName1, libName2]));
       return foundElement;
     }
     if (foundElement != null) {
@@ -10579,7 +11179,7 @@
    * @param constructor the constant constructor declaration to validate
    */
   void validateInitializers(ConstructorDeclaration constructor) {
-    List<ParameterElement> parameterElements = constructor.parameters.elements;
+    List<ParameterElement> parameterElements = constructor.parameters.parameterElements;
     NodeList<ConstructorInitializer> initializers = constructor.initializers;
     for (ConstructorInitializer initializer in initializers) {
       if (initializer is ConstructorFieldInitializer) {
@@ -10630,209 +11230,6 @@
   }
 }
 /**
- * Instances of the class `DeadCodeVerifier` traverse an AST structure looking for cases of
- * [HintCode#DEAD_CODE].
- *
- * @coverage dart.engine.resolver
- */
-class DeadCodeVerifier extends RecursiveASTVisitor<Object> {
-
-  /**
-   * The error reporter by which errors will be reported.
-   */
-  ErrorReporter _errorReporter;
-
-  /**
-   * Create a new instance of the [DeadCodeVerifier].
-   *
-   * @param errorReporter the error reporter
-   */
-  DeadCodeVerifier(ErrorReporter errorReporter) {
-    this._errorReporter = errorReporter;
-  }
-  Object visitBinaryExpression(BinaryExpression node) {
-    sc.Token operator = node.operator;
-    bool isAmpAmp = identical(operator.type, sc.TokenType.AMPERSAND_AMPERSAND);
-    bool isBarBar = identical(operator.type, sc.TokenType.BAR_BAR);
-    if (isAmpAmp || isBarBar) {
-      Expression lhsCondition = node.leftOperand;
-      ValidResult lhsResult = getConstantBooleanValue(lhsCondition);
-      if (lhsResult != null) {
-        if (identical(lhsResult, ValidResult.RESULT_TRUE) && isBarBar) {
-          _errorReporter.reportError2(HintCode.DEAD_CODE, node.rightOperand, []);
-          safelyVisit(lhsCondition);
-          return null;
-        } else if (identical(lhsResult, ValidResult.RESULT_FALSE) && isAmpAmp) {
-          _errorReporter.reportError2(HintCode.DEAD_CODE, node.rightOperand, []);
-          safelyVisit(lhsCondition);
-          return null;
-        }
-      }
-    }
-    return super.visitBinaryExpression(node);
-  }
-
-  /**
-   * For each [Block], this method reports and error on all statements between the end of the
-   * block and the first return statement (assuming there it is not at the end of the block.)
-   *
-   * @param node the block to evaluate
-   */
-  Object visitBlock(Block node) {
-    NodeList<Statement> statements = node.statements;
-    int size = statements.length;
-    for (int i = 0; i < size; i++) {
-      Statement currentStatement = statements[i];
-      safelyVisit(currentStatement);
-      if (currentStatement is ReturnStatement && i != size - 1) {
-        Statement nextStatement = statements[i + 1];
-        Statement lastStatement = statements[size - 1];
-        int offset = nextStatement.offset;
-        int length = lastStatement.end - offset;
-        _errorReporter.reportError3(HintCode.DEAD_CODE, offset, length, []);
-        return null;
-      }
-    }
-    return null;
-  }
-  Object visitConditionalExpression(ConditionalExpression node) {
-    Expression conditionExpression = node.condition;
-    ValidResult result = getConstantBooleanValue(conditionExpression);
-    if (result != null) {
-      if (identical(result, ValidResult.RESULT_TRUE)) {
-        _errorReporter.reportError2(HintCode.DEAD_CODE, node.elseExpression, []);
-        safelyVisit(node.thenExpression);
-        return null;
-      } else {
-        _errorReporter.reportError2(HintCode.DEAD_CODE, node.thenExpression, []);
-        safelyVisit(node.elseExpression);
-        return null;
-      }
-    }
-    return super.visitConditionalExpression(node);
-  }
-  Object visitIfStatement(IfStatement node) {
-    Expression conditionExpression = node.condition;
-    ValidResult result = getConstantBooleanValue(conditionExpression);
-    if (result != null) {
-      if (identical(result, ValidResult.RESULT_TRUE)) {
-        Statement elseStatement = node.elseStatement;
-        if (elseStatement != null) {
-          _errorReporter.reportError2(HintCode.DEAD_CODE, elseStatement, []);
-          safelyVisit(node.thenStatement);
-          return null;
-        }
-      } else {
-        _errorReporter.reportError2(HintCode.DEAD_CODE, node.thenStatement, []);
-        safelyVisit(node.elseStatement);
-        return null;
-      }
-    }
-    return super.visitIfStatement(node);
-  }
-  Object visitTryStatement(TryStatement node) {
-    safelyVisit(node.body);
-    safelyVisit(node.finallyClause);
-    NodeList<CatchClause> catchClauses = node.catchClauses;
-    int numOfCatchClauses = catchClauses.length;
-    List<Type2> visitedTypes = new List<Type2>();
-    for (int i = 0; i < numOfCatchClauses; i++) {
-      CatchClause catchClause = catchClauses[i];
-      if (catchClause.onKeyword != null) {
-        TypeName typeName = catchClause.exceptionType;
-        if (typeName != null && typeName.type != null) {
-          Type2 currentType = typeName.type;
-          if (currentType.isObject) {
-            safelyVisit(catchClause);
-            if (i + 1 != numOfCatchClauses) {
-              CatchClause nextCatchClause = catchClauses[i + 1];
-              CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
-              int offset = nextCatchClause.offset;
-              int length = lastCatchClause.end - offset;
-              _errorReporter.reportError3(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
-              return null;
-            }
-          }
-          for (Type2 type in visitedTypes) {
-            if (currentType.isSubtypeOf(type)) {
-              CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
-              int offset = catchClause.offset;
-              int length = lastCatchClause.end - offset;
-              _errorReporter.reportError3(HintCode.DEAD_CODE_ON_CATCH_SUBTYPE, offset, length, [currentType.displayName, type.displayName]);
-              return null;
-            }
-          }
-          visitedTypes.add(currentType);
-        }
-        safelyVisit(catchClause);
-      } else {
-        safelyVisit(catchClause);
-        if (i + 1 != numOfCatchClauses) {
-          CatchClause nextCatchClause = catchClauses[i + 1];
-          CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
-          int offset = nextCatchClause.offset;
-          int length = lastCatchClause.end - offset;
-          _errorReporter.reportError3(HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length, []);
-          return null;
-        }
-      }
-    }
-    return null;
-  }
-  Object visitWhileStatement(WhileStatement node) {
-    Expression conditionExpression = node.condition;
-    safelyVisit(conditionExpression);
-    ValidResult result = getConstantBooleanValue(conditionExpression);
-    if (result != null) {
-      if (identical(result, ValidResult.RESULT_FALSE)) {
-        _errorReporter.reportError2(HintCode.DEAD_CODE, node.body, []);
-        return null;
-      }
-    }
-    safelyVisit(node.body);
-    return null;
-  }
-
-  /**
-   * Given some [Expression], this method returns [ValidResult#RESULT_TRUE] if it is
-   * `true`, [ValidResult#RESULT_FALSE] if it is `false`, or `null` if the
-   * expression is not a constant boolean value.
-   *
-   * @param expression the expression to evaluate
-   * @return [ValidResult#RESULT_TRUE] if it is `true`, [ValidResult#RESULT_FALSE]
-   *         if it is `false`, or `null` if the expression is not a constant boolean
-   *         value
-   */
-  ValidResult getConstantBooleanValue(Expression expression) {
-    if (expression is BooleanLiteral) {
-      if (((expression as BooleanLiteral)).value) {
-        return ValidResult.RESULT_TRUE;
-      } else {
-        return ValidResult.RESULT_FALSE;
-      }
-    } else {
-      EvaluationResultImpl result = expression.accept(new ConstantVisitor());
-      if (identical(result, ValidResult.RESULT_TRUE)) {
-        return ValidResult.RESULT_TRUE;
-      } else if (identical(result, ValidResult.RESULT_FALSE)) {
-        return ValidResult.RESULT_FALSE;
-      }
-      return null;
-    }
-  }
-
-  /**
-   * If the given node is not `null`, visit this instance of the dead code verifier.
-   *
-   * @param node the node to be visited
-   */
-  void safelyVisit(ASTNode node) {
-    if (node != null) {
-      node.accept(this);
-    }
-  }
-}
-/**
  * Instances of the class `ErrorVerifier` traverse an AST structure looking for additional
  * errors and warnings not covered by the parser and resolver.
  *
@@ -11045,6 +11442,7 @@
       checkForInvalidAssignment(node);
     }
     checkForAssignmentToFinal(node);
+    checkForArgumentTypeNotAssignable2(node.rightHandSide);
     return super.visitAssignmentExpression(node);
   }
   Object visitBinaryExpression(BinaryExpression node) {
@@ -11331,12 +11729,19 @@
     checkForStaticAccessToInstanceMember(node.target, node.methodName);
     return super.visitMethodInvocation(node);
   }
+  Object visitNativeClause(NativeClause node) {
+    if (!_isInSystemLibrary) {
+      _errorReporter.reportError2(ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE, node, []);
+    }
+    return super.visitNativeClause(node);
+  }
   Object visitNativeFunctionBody(NativeFunctionBody node) {
     checkForNativeFunctionBodyInNonSDKCode(node);
     return super.visitNativeFunctionBody(node);
   }
   Object visitPostfixExpression(PostfixExpression node) {
     checkForAssignmentToFinal2(node.operand);
+    checkForIntNotAssignable(node.operand);
     return super.visitPostfixExpression(node);
   }
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
@@ -11349,6 +11754,7 @@
     if (node.operator.type.isIncrementOperator) {
       checkForAssignmentToFinal2(node.operand);
     }
+    checkForIntNotAssignable(node.operand);
     return super.visitPrefixExpression(node);
   }
   Object visitPropertyAccess(PropertyAccess node) {
@@ -11857,7 +12263,7 @@
     if (redirectedElement == null) {
       TypeName constructorTypeName = redirectedNode.type;
       Type2 redirectedType = constructorTypeName.type;
-      if (redirectedType != null && redirectedType.element != null && redirectedType.element != DynamicElementImpl.instance) {
+      if (redirectedType != null && redirectedType.element != null && !redirectedType.isDynamic) {
         String constructorStrName = constructorTypeName.name.name;
         if (redirectedNode.name != null) {
           constructorStrName += ".${redirectedNode.name.name}";
@@ -12010,7 +12416,7 @@
     }
     ParameterElement staticParameterElement = argument.staticParameterElement;
     Type2 staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
-    ParameterElement propagatedParameterElement = argument.parameterElement;
+    ParameterElement propagatedParameterElement = argument.propagatedParameterElement;
     Type2 propagatedParameterType = propagatedParameterElement == null ? null : propagatedParameterElement.type;
     return checkForArgumentTypeNotAssignable3(argument, staticParameterType, propagatedParameterType, errorCode);
   }
@@ -12025,35 +12431,48 @@
    * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
    * @see CompileTimeErrorCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
    */
-  bool checkForArgumentTypeNotAssignable3(Expression expression, Type2 expectedStaticType, Type2 expectedPropagatedType, ErrorCode errorCode) {
-    Type2 staticArgumentType = getStaticType(expression);
-    if (staticArgumentType == null || expectedStaticType == null) {
+  bool checkForArgumentTypeNotAssignable3(Expression expression, Type2 expectedStaticType, Type2 expectedPropagatedType, ErrorCode errorCode) => checkForArgumentTypeNotAssignable4(expression, expectedStaticType, getStaticType(expression), expectedPropagatedType, expression.propagatedType, errorCode);
+
+  /**
+   * This verifies that the passed expression can be assigned to its corresponding parameters.
+   *
+   * @param expression the expression to evaluate
+   * @param expectedStaticType the expected static type of the parameter
+   * @param actualStaticType the actual static type of the argument
+   * @param expectedPropagatedType the expected propagated type of the parameter, may be
+   *          `null`
+   * @param actualPropagatedType the expected propagated type of the parameter, may be `null`
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool checkForArgumentTypeNotAssignable4(Expression expression, Type2 expectedStaticType, Type2 actualStaticType, Type2 expectedPropagatedType, Type2 actualPropagatedType, ErrorCode errorCode) {
+    if (actualStaticType == null || expectedStaticType == null) {
       return false;
     }
     if (_strictMode) {
-      if (staticArgumentType.isAssignableTo(expectedStaticType)) {
+      if (actualStaticType.isAssignableTo(expectedStaticType)) {
         return false;
       }
       _errorReporter.reportError2(errorCode, expression, [
-          staticArgumentType.displayName,
+          actualStaticType.displayName,
           expectedStaticType.displayName]);
       return true;
     }
-    Type2 propagatedArgumentType = getPropagatedType(expression);
-    if (propagatedArgumentType == null || expectedPropagatedType == null) {
-      if (staticArgumentType.isAssignableTo(expectedStaticType)) {
+    if (actualPropagatedType == null || expectedPropagatedType == null) {
+      if (actualStaticType.isAssignableTo(expectedStaticType)) {
         return false;
       }
       _errorReporter.reportError2(errorCode, expression, [
-          staticArgumentType.displayName,
+          actualStaticType.displayName,
           expectedStaticType.displayName]);
       return true;
     }
-    if (staticArgumentType.isAssignableTo(expectedStaticType) || staticArgumentType.isAssignableTo(expectedPropagatedType) || propagatedArgumentType.isAssignableTo(expectedStaticType) || propagatedArgumentType.isAssignableTo(expectedPropagatedType)) {
+    if (actualStaticType.isAssignableTo(expectedStaticType) || actualStaticType.isAssignableTo(expectedPropagatedType) || actualPropagatedType.isAssignableTo(expectedStaticType) || actualPropagatedType.isAssignableTo(expectedPropagatedType)) {
       return false;
     }
     _errorReporter.reportError2(errorCode, expression, [
-        (propagatedArgumentType == null ? staticArgumentType : propagatedArgumentType).displayName,
+        (actualPropagatedType == null ? actualStaticType : actualPropagatedType).displayName,
         (expectedPropagatedType == null ? expectedStaticType : expectedPropagatedType).displayName]);
     return true;
   }
@@ -12075,6 +12494,7 @@
    *
    * @param node the expression to evaluate
    * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ASSIGNMENT_TO_CONST
    * @see StaticWarningCode#ASSIGNMENT_TO_FINAL
    * @see StaticWarningCode#ASSIGNMENT_TO_METHOD
    */
@@ -12086,17 +12506,17 @@
     if (expression is PropertyAccess) {
       element = ((expression as PropertyAccess)).propertyName.element;
     }
+    if (element is PropertyAccessorElement) {
+      PropertyAccessorElement accessor = element as PropertyAccessorElement;
+      element = accessor.variable;
+    }
     if (element is VariableElement) {
-      VariableElement leftVar = element as VariableElement;
-      if (leftVar.isFinal) {
-        _errorReporter.reportError2(StaticWarningCode.ASSIGNMENT_TO_FINAL, expression, []);
+      VariableElement variable = element as VariableElement;
+      if (variable.isConst) {
+        _errorReporter.reportError2(StaticWarningCode.ASSIGNMENT_TO_CONST, expression, []);
         return true;
       }
-      return false;
-    }
-    if (element is PropertyAccessorElement) {
-      PropertyAccessorElement leftAccessor = element as PropertyAccessorElement;
-      if (!leftAccessor.isSetter) {
+      if (variable.isFinal) {
         _errorReporter.reportError2(StaticWarningCode.ASSIGNMENT_TO_FINAL, expression, []);
         return true;
       }
@@ -12864,7 +13284,7 @@
       }
       return true;
     }
-    Type2 propagatedType = getPropagatedType(expression);
+    Type2 propagatedType = expression.propagatedType;
     if (propagatedType != null && propagatedType.isAssignableTo(fieldType)) {
       return false;
     }
@@ -13113,9 +13533,9 @@
         SwitchCase switchCase = switchMember as SwitchCase;
         Expression expression = switchCase.expression;
         if (firstType == null) {
-          firstType = getBestType(expression);
+          firstType = expression.bestType;
         } else {
-          Type2 nType = getBestType(expression);
+          Type2 nType = expression.bestType;
           if (firstType != nType) {
             _errorReporter.reportError2(CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, expression, [expression.toSource(), firstType.displayName]);
             foundError = true;
@@ -13149,6 +13569,33 @@
   }
 
   /**
+   * This verifies that an 'int' can be assigned to the parameter corresponding to the given
+   * expression. This is used for prefix and postfix expressions where the argument value is
+   * implicit.
+   *
+   * @param argument the expression to which the operator is being applied
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool checkForIntNotAssignable(Expression argument) {
+    if (argument == null) {
+      return false;
+    }
+    ErrorCode errorCode;
+    if (_isInConstInstanceCreation || _isEnclosingConstructorConst) {
+      errorCode = CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE;
+    } else {
+      errorCode = StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE;
+    }
+    ParameterElement staticParameterElement = argument.staticParameterElement;
+    Type2 staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
+    ParameterElement propagatedParameterElement = argument.propagatedParameterElement;
+    Type2 propagatedParameterType = propagatedParameterElement == null ? null : propagatedParameterElement.type;
+    return checkForArgumentTypeNotAssignable4(argument, staticParameterType, _typeProvider.intType, propagatedParameterType, _typeProvider.intType, errorCode);
+  }
+
+  /**
    * Given an assignment using a compound assignment operator, this verifies that the given
    * assignment is valid.
    *
@@ -13163,7 +13610,7 @@
     }
     VariableElement leftElement = getVariableElement(lhs);
     Type2 leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.type;
-    MethodElement invokedMethod = node.element;
+    MethodElement invokedMethod = node.staticElement;
     if (invokedMethod == null) {
       return false;
     }
@@ -13194,7 +13641,7 @@
     Type2 leftType = (leftElement == null) ? getStaticType(lhs) : leftElement.type;
     Type2 staticRightType = getStaticType(rhs);
     bool isStaticAssignable = staticRightType.isAssignableTo(leftType);
-    Type2 propagatedRightType = getPropagatedType(rhs);
+    Type2 propagatedRightType = rhs.propagatedType;
     if (_strictMode || propagatedRightType == null) {
       if (!isStaticAssignable) {
         _errorReporter.reportError2(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [staticRightType.displayName, leftType.displayName]);
@@ -13574,39 +14021,22 @@
     if (_enclosingClass.isAbstract) {
       return false;
     }
-    Set<ExecutableElement> missingOverrides = new Set<ExecutableElement>();
+    List<MethodElement> methods = _enclosingClass.methods;
+    List<PropertyAccessorElement> accessors = _enclosingClass.accessors;
     Set<String> methodsInEnclosingClass = new Set<String>();
     Set<String> accessorsInEnclosingClass = new Set<String>();
-    List<MethodElement> methods = _enclosingClass.methods;
     for (MethodElement method in methods) {
       javaSetAdd(methodsInEnclosingClass, method.name);
     }
-    List<PropertyAccessorElement> accessors = _enclosingClass.accessors;
     for (PropertyAccessorElement accessor in accessors) {
       javaSetAdd(accessorsInEnclosingClass, accessor.name);
     }
-    Map<String, ExecutableElement> membersInheritedFromSuperclasses = _inheritanceManager.getMapOfMembersInheritedFromClasses(_enclosingClass);
-    for (MapEntry<String, ExecutableElement> entry in getMapEntrySet(membersInheritedFromSuperclasses)) {
-      ExecutableElement executableElt = entry.getValue();
-      if (executableElt is MethodElement) {
-        MethodElement methodElt = executableElt as MethodElement;
-        if (methodElt.isAbstract) {
-          String methodName = entry.getKey();
-          if (!methodsInEnclosingClass.contains(methodName)) {
-            javaSetAdd(missingOverrides, executableElt);
-          }
-        }
-      } else if (executableElt is PropertyAccessorElement) {
-        PropertyAccessorElement propertyAccessorElt = executableElt as PropertyAccessorElement;
-        if (propertyAccessorElt.isAbstract) {
-          String accessorName = entry.getKey();
-          if (!accessorsInEnclosingClass.contains(accessorName)) {
-            javaSetAdd(missingOverrides, executableElt);
-          }
-        }
-      }
+    if (methodsInEnclosingClass.contains(ElementResolver.NO_SUCH_METHOD_METHOD_NAME)) {
+      return false;
     }
+    Set<ExecutableElement> missingOverrides = new Set<ExecutableElement>();
     Map<String, ExecutableElement> membersInheritedFromInterfaces = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
+    Map<String, ExecutableElement> membersInheritedFromSuperclasses = _inheritanceManager.getMapOfMembersInheritedFromClasses(_enclosingClass);
     for (MapEntry<String, ExecutableElement> entry in getMapEntrySet(membersInheritedFromInterfaces)) {
       ExecutableElement executableElt = entry.getValue();
       ExecutableElement elt = membersInheritedFromSuperclasses[executableElt.name];
@@ -13619,12 +14049,12 @@
       }
       if (executableElt is MethodElement) {
         String methodName = entry.getKey();
-        if (!methodsInEnclosingClass.contains(methodName)) {
+        if (!methodsInEnclosingClass.contains(methodName) && !memberHasConcreteMethodImplementationInSuperclassChain(_enclosingClass, methodName, new List<ClassElement>())) {
           javaSetAdd(missingOverrides, executableElt);
         }
       } else if (executableElt is PropertyAccessorElement) {
         String accessorName = entry.getKey();
-        if (!accessorsInEnclosingClass.contains(accessorName)) {
+        if (!accessorsInEnclosingClass.contains(accessorName) && !memberHasConcreteAccessorImplementationInSuperclassChain(_enclosingClass, accessorName, new List<ClassElement>())) {
           javaSetAdd(missingOverrides, executableElt);
         }
       }
@@ -13905,7 +14335,7 @@
         _errorReporter.reportError3(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName, builder.toString()]);
         return true;
       } else if (list.length == 2) {
-        ErrorCode errorCode = supertype != null && _enclosingClass == supertype.element ? CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS : CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS;
+        ErrorCode errorCode = (supertype != null && _enclosingClass == supertype.element ? CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS : CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS) as ErrorCode;
         _errorReporter.reportError3(errorCode, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName]);
         return true;
       }
@@ -14115,7 +14545,7 @@
       return true;
     }
     bool isStaticAssignable = staticReturnType.isAssignableTo(expectedReturnType);
-    Type2 propagatedReturnType = getPropagatedType(returnExpression);
+    Type2 propagatedReturnType = returnExpression.propagatedType;
     if (_strictMode || propagatedReturnType == null) {
       if (isStaticAssignable) {
         return false;
@@ -14203,7 +14633,7 @@
    */
   bool checkForTypeAliasCannotReferenceItself_function(FunctionTypeAlias node) {
     FunctionTypeAliasElement element = node.element;
-    if (!hasFunctionTypeAliasSelfReference(element)) {
+    if (!hasTypedefSelfReference(element)) {
       return false;
     }
     _errorReporter.reportError2(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
@@ -14218,7 +14648,7 @@
    */
   bool checkForTypeAliasCannotReferenceItself_mixin(ClassTypeAlias node) {
     ClassElement element = node.element;
-    if (!hasClassTypeAliasSelfReference(element, new Set<ClassElement>())) {
+    if (!hasTypedefSelfReference(element)) {
       return false;
     }
     _errorReporter.reportError2(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
@@ -14432,21 +14862,6 @@
   }
 
   /**
-   * Return the propagated type of the given expression, or the static type if there is no
-   * propagated type information.
-   *
-   * @param expression the expression whose type is to be returned
-   * @return the propagated or static type of the given expression, whichever is best
-   */
-  Type2 getBestType(Expression expression) {
-    Type2 type = getPropagatedType(expression);
-    if (type == null) {
-      type = getStaticType(expression);
-    }
-    return type;
-  }
-
-  /**
    * Returns the Type (return type) for a given getter.
    *
    * @param propertyAccessorElement
@@ -14462,14 +14877,6 @@
   }
 
   /**
-   * Return the propagated type of the given expression that is to be used for type analysis.
-   *
-   * @param expression the expression whose type is to be returned
-   * @return the propagated type of the given expression
-   */
-  Type2 getPropagatedType(Expression expression) => expression.propagatedType;
-
-  /**
    * Returns the Type (first and only parameter) for a given setter.
    *
    * @param propertyAccessorElement
@@ -14515,78 +14922,6 @@
   }
 
   /**
-   * @return <code>true</code> if given [ClassElement] has direct or indirect reference to
-   *         itself using only other typedef [ClassElement]s.
-   */
-  bool hasClassTypeAliasSelfReference(ClassElement element2, Set<ClassElement> seenMixins) {
-    if (seenMixins.contains(element2)) {
-      return true;
-    }
-    javaSetAdd(seenMixins, element2);
-    for (InterfaceType mixin in element2.mixins) {
-      ClassElement mixinElement = mixin.element;
-      if (!mixinElement.isTypedef) {
-        continue;
-      }
-      if (hasClassTypeAliasSelfReference(mixinElement, seenMixins)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Checks if "target" is referenced by "current".
-   */
-  bool hasFunctionTypeAliasReference(Set<FunctionTypeAliasElement> visited, FunctionTypeAliasElement target, Element currentElement) {
-    if (currentElement is! FunctionTypeAliasElement) {
-      return false;
-    }
-    FunctionTypeAliasElement current = currentElement as FunctionTypeAliasElement;
-    if (target == current) {
-      return true;
-    }
-    if (visited.contains(current)) {
-      return false;
-    }
-    javaSetAdd(visited, current);
-    return hasFunctionTypeAliasReference2(visited, target, current);
-  }
-
-  /**
-   * Checks if "target" is referenced by "current".
-   */
-  bool hasFunctionTypeAliasReference2(Set<FunctionTypeAliasElement> visited, FunctionTypeAliasElement target, FunctionTypeAliasElement current) {
-    FunctionType type = current.type;
-    Set<Type2> referencedTypes = new Set();
-    if (type != null) {
-      for (TypeVariableElement typeVariable in current.typeVariables) {
-        Type2 bound = typeVariable.bound;
-        javaSetAdd(referencedTypes, bound);
-      }
-      javaSetAdd(referencedTypes, type.returnType);
-      for (ParameterElement parameter in type.parameters) {
-        javaSetAdd(referencedTypes, parameter.type);
-      }
-    }
-    for (Type2 referencedType in referencedTypes) {
-      if (referencedType != null && hasFunctionTypeAliasReference(visited, target, referencedType.element)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * @return <code>true</code> if given [FunctionTypeAliasElement] has direct or indirect
-   *         reference to itself using other [FunctionTypeAliasElement]s.
-   */
-  bool hasFunctionTypeAliasSelfReference(FunctionTypeAliasElement target) {
-    Set<FunctionTypeAliasElement> visited = new Set();
-    return hasFunctionTypeAliasReference2(visited, target, target);
-  }
-
-  /**
    * @return `true` if the given constructor redirects to itself, directly or indirectly
    */
   bool hasRedirectingFactoryConstructorCycle(ConstructorElement element) {
@@ -14606,6 +14941,39 @@
   }
 
   /**
+   * @return <code>true</code> if given [Element] has direct or indirect reference to itself
+   *         form anywhere except [ClassElement] or type variable bounds.
+   */
+  bool hasTypedefSelfReference(Element target) {
+    Set<Element> checked = new Set<Element>();
+    List<Element> toCheck = new List<Element>();
+    toCheck.add(target);
+    bool firstIteration = true;
+    while (true) {
+      Element current;
+      while (true) {
+        if (toCheck.isEmpty) {
+          return false;
+        }
+        current = toCheck.removeAt(toCheck.length - 1);
+        if (target == current) {
+          if (firstIteration) {
+            firstIteration = false;
+            break;
+          } else {
+            return true;
+          }
+        }
+        if (current != null && !checked.contains(current)) {
+          break;
+        }
+      }
+      current.accept(new GeneralizingElementVisitor_11(target, toCheck));
+      javaSetAdd(checked, current);
+    }
+  }
+
+  /**
    * @return `true` if the given [ASTNode] is the part of constant constructor
    *         invocation.
    */
@@ -14640,13 +15008,95 @@
     }
     return false;
   }
+
+  /**
+   * Return `true` iff the passed [ClassElement] has a concrete implementation of the
+   * passed accessor name in the superclass chain.
+   */
+  bool memberHasConcreteAccessorImplementationInSuperclassChain(ClassElement classElement, String accessorName, List<ClassElement> superclassChain) {
+    if (superclassChain.contains(classElement)) {
+      return false;
+    } else {
+      superclassChain.add(classElement);
+    }
+    for (PropertyAccessorElement accessor in classElement.accessors) {
+      if (accessor.name == accessorName) {
+        if (!accessor.isAbstract) {
+          return true;
+        }
+      }
+    }
+    for (InterfaceType mixinType in classElement.mixins) {
+      if (mixinType != null) {
+        ClassElement mixinElement = mixinType.element;
+        if (mixinElement != null) {
+          for (PropertyAccessorElement accessor in mixinElement.accessors) {
+            if (accessor.name == accessorName) {
+              if (!accessor.isAbstract) {
+                return true;
+              }
+            }
+          }
+        }
+      }
+    }
+    InterfaceType superType = classElement.supertype;
+    if (superType != null) {
+      ClassElement superClassElt = superType.element;
+      if (superClassElt != null) {
+        return memberHasConcreteAccessorImplementationInSuperclassChain(superClassElt, accessorName, superclassChain);
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` iff the passed [ClassElement] has a concrete implementation of the
+   * passed method name in the superclass chain.
+   */
+  bool memberHasConcreteMethodImplementationInSuperclassChain(ClassElement classElement, String methodName, List<ClassElement> superclassChain) {
+    if (superclassChain.contains(classElement)) {
+      return false;
+    } else {
+      superclassChain.add(classElement);
+    }
+    for (MethodElement method in classElement.methods) {
+      if (method.name == methodName) {
+        if (!method.isAbstract) {
+          return true;
+        }
+      }
+    }
+    for (InterfaceType mixinType in classElement.mixins) {
+      if (mixinType != null) {
+        ClassElement mixinElement = mixinType.element;
+        if (mixinElement != null) {
+          for (MethodElement method in mixinElement.methods) {
+            if (method.name == methodName) {
+              if (!method.isAbstract) {
+                return true;
+              }
+            }
+          }
+        }
+      }
+    }
+    InterfaceType superType = classElement.supertype;
+    if (superType != null) {
+      ClassElement superClassElt = superType.element;
+      if (superClassElt != null) {
+        return memberHasConcreteMethodImplementationInSuperclassChain(superClassElt, methodName, superclassChain);
+      }
+    }
+    return false;
+  }
 }
 /**
  * This enum holds one of four states of a field initialization state through a constructor
  * signature, not initialized, initialized in the field declaration, initialized in the field
  * formal, and finally, initialized in the initializers list.
  */
-class INIT_STATE implements Comparable<INIT_STATE> {
+class INIT_STATE implements Enum<INIT_STATE> {
   static final INIT_STATE NOT_INIT = new INIT_STATE('NOT_INIT', 0);
   static final INIT_STATE INIT_IN_DECLARATION = new INIT_STATE('INIT_IN_DECLARATION', 1);
   static final INIT_STATE INIT_IN_FIELD_FORMAL = new INIT_STATE('INIT_IN_FIELD_FORMAL', 2);
@@ -14667,171 +15117,58 @@
   int get hashCode => ordinal;
   String toString() => name;
 }
-/**
- * Instances of the class `HintVerifier` traverse an AST structure looking for additional
- * additional suggestions not mentioned in the Dart Language Specification.
- *
- * @coverage dart.engine.resolver
- */
-class HintVerifier {
-  DeadCodeVerifier _deadCodeVerifier;
-  HintVerifier(AnalysisContext context, ErrorReporter errorReporter) {
-    _deadCodeVerifier = new DeadCodeVerifier(errorReporter);
+class GeneralizingElementVisitor_11 extends GeneralizingElementVisitor<Object> {
+  Element target;
+  List<Element> toCheck;
+  GeneralizingElementVisitor_11(this.target, this.toCheck) : super();
+  bool _inClass = false;
+  Object visitClassElement(ClassElement element) {
+    addTypeToCheck(element.supertype);
+    for (InterfaceType mixin in element.mixins) {
+      addTypeToCheck(mixin);
+    }
+    _inClass = !element.isTypedef;
+    try {
+      return super.visitClassElement(element);
+    } finally {
+      _inClass = false;
+    }
   }
-  void visitCompilationUnit(CompilationUnit node) {
-    node.accept(_deadCodeVerifier);
+  Object visitExecutableElement(ExecutableElement element) {
+    if (element.isSynthetic) {
+      return null;
+    }
+    addTypeToCheck(element.returnType);
+    return super.visitExecutableElement(element);
   }
-}
-/**
- * Instances of the class `PubVerifier` traverse an AST structure looking for deviations from
- * pub best practices.
- */
-class PubVerifier extends RecursiveASTVisitor<Object> {
-  static String _PUBSPEC_YAML = "pubspec.yaml";
-
-  /**
-   * The analysis context containing the sources to be analyzed
-   */
-  AnalysisContext _context;
-
-  /**
-   * The error reporter by which errors will be reported.
-   */
-  ErrorReporter _errorReporter;
-  PubVerifier(AnalysisContext context, ErrorReporter errorReporter) {
-    this._context = context;
-    this._errorReporter = errorReporter;
+  Object visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
+    addTypeToCheck(element.returnType);
+    return super.visitFunctionTypeAliasElement(element);
   }
-  Object visitImportDirective(ImportDirective directive) {
-    return null;
+  Object visitParameterElement(ParameterElement element) {
+    addTypeToCheck(element.type);
+    return super.visitParameterElement(element);
   }
-
-  /**
-   * This verifies that the passed file import directive is not contained in a source inside a
-   * package "lib" directory hierarchy referencing a source outside that package "lib" directory
-   * hierarchy.
-   *
-   * @param uriLiteral the import URL (not `null`)
-   * @param path the file path being verified (not `null`)
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE
-   */
-  bool checkForFileImportInsideLibReferencesFileOutside(StringLiteral uriLiteral, String path) {
-    Source source = getSource(uriLiteral);
-    String fullName = getSourceFullName(source);
-    if (fullName != null) {
-      int pathIndex = 0;
-      int fullNameIndex = fullName.length;
-      while (pathIndex < path.length && JavaString.startsWithBefore(path, "../", pathIndex)) {
-        fullNameIndex = JavaString.lastIndexOf(fullName, '/', fullNameIndex);
-        if (fullNameIndex < 4) {
-          return false;
-        }
-        if (JavaString.startsWithBefore(fullName, "/lib", fullNameIndex - 4)) {
-          String relativePubspecPath = path.substring(0, pathIndex + 3) + _PUBSPEC_YAML;
-          Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePubspecPath);
-          if (pubspecSource.exists()) {
-            _errorReporter.reportError2(PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE, uriLiteral, []);
-          }
-          return true;
-        }
-        pathIndex += 3;
+  Object visitTypeVariableElement(TypeVariableElement element) => null;
+  Object visitVariableElement(VariableElement element) {
+    addTypeToCheck(element.type);
+    return super.visitVariableElement(element);
+  }
+  void addTypeToCheck(Type2 type) {
+    if (type == null) {
+      return;
+    }
+    Element element = type.element;
+    if (_inClass && target == element) {
+      return;
+    }
+    toCheck.add(element);
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type as InterfaceType;
+      for (Type2 typeArgument in interfaceType.typeArguments) {
+        addTypeToCheck(typeArgument);
       }
     }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed file import directive is not contained in a source outside a
-   * package "lib" directory hierarchy referencing a source inside that package "lib" directory
-   * hierarchy.
-   *
-   * @param uriLiteral the import URL (not `null`)
-   * @param path the file path being verified (not `null`)
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE
-   */
-  bool checkForFileImportOutsideLibReferencesFileInside(StringLiteral uriLiteral, String path) {
-    if (path.startsWith("lib/")) {
-      if (checkForFileImportOutsideLibReferencesFileInside2(uriLiteral, path, 0)) {
-        return true;
-      }
-    }
-    int pathIndex = path.indexOf("/lib/");
-    while (pathIndex != -1) {
-      if (checkForFileImportOutsideLibReferencesFileInside2(uriLiteral, path, pathIndex + 1)) {
-        return true;
-      }
-      pathIndex = JavaString.indexOf(path, "/lib/", pathIndex + 4);
-    }
-    return false;
-  }
-  bool checkForFileImportOutsideLibReferencesFileInside2(StringLiteral uriLiteral, String path, int pathIndex) {
-    Source source = getSource(uriLiteral);
-    String relativePubspecPath = path.substring(0, pathIndex) + _PUBSPEC_YAML;
-    Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePubspecPath);
-    if (!pubspecSource.exists()) {
-      return false;
-    }
-    String fullName = getSourceFullName(source);
-    if (fullName != null) {
-      if (!fullName.contains("/lib/")) {
-        _errorReporter.reportError2(PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE, uriLiteral, []);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed package import directive does not contain ".."
-   *
-   * @param uriLiteral the import URL (not `null`)
-   * @param path the path to be validated (not `null`)
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT
-   */
-  bool checkForPackageImportContainsDotDot(StringLiteral uriLiteral, String path) {
-    if (path.startsWith("../") || path.contains("/../")) {
-      _errorReporter.reportError2(PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT, uriLiteral, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Answer the source associated with the compilation unit containing the given AST node.
-   *
-   * @param node the node (not `null`)
-   * @return the source or `null` if it could not be determined
-   */
-  Source getSource(ASTNode node) {
-    Source source = null;
-    CompilationUnit unit = node.getAncestor(CompilationUnit);
-    if (unit != null) {
-      CompilationUnitElement element = unit.element;
-      if (element != null) {
-        source = element.source;
-      }
-    }
-    return source;
-  }
-
-  /**
-   * Answer the full name of the given source. The returned value will have all
-   * [File#separatorChar] replace by '/'.
-   *
-   * @param source the source
-   * @return the full name or `null` if it could not be determined
-   */
-  String getSourceFullName(Source source) {
-    if (source != null) {
-      String fullName = source.fullName;
-      if (fullName != null) {
-        return fullName.replaceAll(r'\', '/');
-      }
-    }
-    return null;
   }
 }
 /**
@@ -14842,7 +15179,7 @@
  *
  * @coverage dart.engine.resolver
  */
-class ResolverErrorCode implements Comparable<ResolverErrorCode>, ErrorCode {
+class ResolverErrorCode implements Enum<ResolverErrorCode>, ErrorCode {
   static final ResolverErrorCode BREAK_LABEL_ON_SWITCH_MEMBER = new ResolverErrorCode('BREAK_LABEL_ON_SWITCH_MEMBER', 0, ErrorType.COMPILE_TIME_ERROR, "Break label resolves to case or default statement");
   static final ResolverErrorCode CONTINUE_LABEL_ON_SWITCH = new ResolverErrorCode('CONTINUE_LABEL_ON_SWITCH', 1, ErrorType.COMPILE_TIME_ERROR, "A continue label resolves to switch, must be loop or switch member");
   static final ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART = new ResolverErrorCode('MISSING_LIBRARY_DIRECTIVE_WITH_PART', 2, ErrorType.COMPILE_TIME_ERROR, "Libraries that have parts must have a library directive");
diff --git a/pkg/analyzer_experimental/lib/src/generated/scanner.dart b/pkg/analyzer_experimental/lib/src/generated/scanner.dart
index 1d7676e..0f816df 100644
--- a/pkg/analyzer_experimental/lib/src/generated/scanner.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/scanner.dart
@@ -135,7 +135,7 @@
  *
  * @coverage dart.engine.parser
  */
-class ScannerErrorCode implements Comparable<ScannerErrorCode>, ErrorCode {
+class ScannerErrorCode implements Enum<ScannerErrorCode>, ErrorCode {
   static final ScannerErrorCode CHARACTER_EXPECTED_AFTER_SLASH = new ScannerErrorCode('CHARACTER_EXPECTED_AFTER_SLASH', 0, "Character expected after slash");
   static final ScannerErrorCode ILLEGAL_CHARACTER = new ScannerErrorCode('ILLEGAL_CHARACTER', 1, "Illegal character %x");
   static final ScannerErrorCode MISSING_DIGIT = new ScannerErrorCode('MISSING_DIGIT', 2, "Decimal digit expected");
@@ -209,7 +209,7 @@
  *
  * @coverage dart.engine.parser
  */
-class Keyword implements Comparable<Keyword> {
+class Keyword implements Enum<Keyword> {
   static final Keyword ASSERT = new Keyword.con1('ASSERT', 0, "assert");
   static final Keyword BREAK = new Keyword.con1('BREAK', 1, "break");
   static final Keyword CASE = new Keyword.con1('CASE', 2, "case");
@@ -503,7 +503,7 @@
       instrumentation.metric2("tokensCount", tokenCounter);
       return firstToken();
     } finally {
-      instrumentation.log();
+      instrumentation.log2(2);
     }
   }
 
@@ -1233,7 +1233,7 @@
     while (true) {
       next = advance();
       if (0xA == next || 0xD == next || -1 == next) {
-        appendCommentToken(TokenType.SINGLE_LINE_COMMENT, getString(_tokenStart, 0));
+        appendCommentToken(TokenType.SINGLE_LINE_COMMENT, getString(_tokenStart, -1));
         return next;
       }
     }
@@ -1800,7 +1800,7 @@
  *
  * @coverage dart.engine.parser
  */
-class TokenClass implements Comparable<TokenClass> {
+class TokenClass implements Enum<TokenClass> {
 
   /**
    * A value used to indicate that the token type is not part of any specific class of token.
@@ -1958,7 +1958,7 @@
  *
  * @coverage dart.engine.parser
  */
-class TokenType implements Comparable<TokenType> {
+class TokenType implements Enum<TokenType> {
 
   /**
    * The type of the token that marks the end of the input.
diff --git a/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart b/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
index 143b072..71f1e68 100644
--- a/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
@@ -272,7 +272,7 @@
           if (revision != null) {
             _sdkVersion = revision;
           }
-        } on IOException catch (exception) {
+        } on JavaIOException catch (exception) {
         }
       }
     }
diff --git a/pkg/analyzer_experimental/lib/src/generated/source.dart b/pkg/analyzer_experimental/lib/src/generated/source.dart
index e6463ff..cf901a3 100644
--- a/pkg/analyzer_experimental/lib/src/generated/source.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/source.dart
@@ -135,6 +135,9 @@
    * @return the source representing the contained URI
    */
   Source resolveUri(Source containingSource, String containedUri) {
+    if (containedUri == null) {
+      return null;
+    }
     try {
       return resolveUri2(containingSource, parseUriWithException(containedUri));
     } on URISyntaxException catch (exception) {
@@ -165,10 +168,9 @@
    *
    * @param source the source whose contents are being overridden
    * @param contents the new contents of the source
+   * @return `true` if the new cached contents are different from the old, else `false`
    */
-  void setContents(Source source, String contents) {
-    _contentCache.setContents(source, contents);
-  }
+  bool setContents(Source source, String contents) => _contentCache.setContents(source, contents);
 
   /**
    * Set the analysis context that this source factory is associated with to the given context.
@@ -420,7 +422,7 @@
  *
  * @coverage dart.engine.source
  */
-class SourceKind implements Comparable<SourceKind> {
+class SourceKind implements Enum<SourceKind> {
 
   /**
    * A source containing HTML. The HTML might or might not contain Dart scripts.
@@ -462,7 +464,7 @@
  *
  * @coverage dart.engine.source
  */
-class UriKind implements Comparable<UriKind> {
+class UriKind implements Enum<UriKind> {
 
   /**
    * A 'dart:' URI.
@@ -877,14 +879,16 @@
    *
    * @param source the source whose contents are being overridden
    * @param contents the new contents of the source
+   * @return `true` if the new cached contents are different than the old, else `false`
    */
-  void setContents(Source source, String contents) {
+  bool setContents(Source source, String contents) {
     if (contents == null) {
-      _contentMap.remove(source);
       _stampMap.remove(source);
+      return _contentMap.remove(source) != null;
     } else {
-      _contentMap[source] = contents;
       _stampMap[source] = JavaSystem.currentTimeMillis();
+      String originalContents = javaMapPut(_contentMap, source, contents);
+      return contents != originalContents;
     }
   }
 }
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/generated/source_io.dart b/pkg/analyzer_experimental/lib/src/generated/source_io.dart
index c2277eb..23f6c1b 100644
--- a/pkg/analyzer_experimental/lib/src/generated/source_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/source_io.dart
@@ -56,7 +56,14 @@
     this._contentCache = contentCache;
     this._file = file;
     this._uriKind = uriKind;
-    this._encoding = "${uriKind.encoding}${file.toURI().toString()}";
+    if (file.getPath().indexOf(':') > 2) {
+      try {
+        throw new IllegalArgumentException("Invalid source path: ${file}");
+      } on IllegalArgumentException catch (e) {
+        AnalysisEngine.instance.logger.logError3(e);
+        throw e;
+      }
+    }
   }
   bool operator ==(Object object) => object != null && this.runtimeType == object.runtimeType && _file == ((object as FileBasedSource))._file;
   bool exists() => _contentCache.getContents(this) != null || (_file.exists() && !_file.isDirectory());
@@ -70,7 +77,12 @@
     }
     receiver.accept2(_file.readAsStringSync(), _file.lastModified());
   }
-  String get encoding => _encoding;
+  String get encoding {
+    if (_encoding == null) {
+      _encoding = "${_uriKind.encoding}${_file.toURI().toString()}";
+    }
+    return _encoding;
+  }
   String get fullName => _file.getAbsolutePath();
   int get modificationStamp {
     int stamp = _contentCache.getModificationStamp(this);
@@ -226,7 +238,7 @@
     JavaFile pkgDir = new JavaFile.relative(packagesDirectory, pkgName);
     try {
       pkgDir = pkgDir.getCanonicalFile();
-    } on IOException catch (e) {
+    } on JavaIOException catch (e) {
       if (!e.toString().contains("Required key not available")) {
         AnalysisEngine.instance.logger.logError2("Canonical failed: ${pkgDir}", e);
       } else if (_CanLogRequiredKeyIoException) {
diff --git a/pkg/analyzer_experimental/lib/src/generated/utilities_collection.dart b/pkg/analyzer_experimental/lib/src/generated/utilities_collection.dart
new file mode 100644
index 0000000..9e33a1a
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/generated/utilities_collection.dart
@@ -0,0 +1,92 @@
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+library engine.utilities.collection;
+import 'java_core.dart';
+/**
+ * The class `BooleanArray` defines methods for operating on integers as if they were arrays
+ * of booleans. These arrays can be indexed by either integers or by enumeration constants.
+ */
+class BooleanArray {
+
+  /**
+   * Return the value of the element at the given index.
+   *
+   * @param array the array being accessed
+   * @param index the index of the element being accessed
+   * @return the value of the element at the given index
+   * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
+   */
+  static bool get(int array, Enum<Object> index) => get2(array, index.ordinal);
+
+  /**
+   * Return the value of the element at the given index.
+   *
+   * @param array the array being accessed
+   * @param index the index of the element being accessed
+   * @return the value of the element at the given index
+   * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
+   */
+  static bool get2(int array, int index) {
+    checkIndex(index);
+    return (array & (1 << index)) > 0;
+  }
+
+  /**
+   * Set the value of the element at the given index to the given value.
+   *
+   * @param array the array being modified
+   * @param index the index of the element being set
+   * @param value the value to be assigned to the element
+   * @return the updated value of the array
+   * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
+   */
+  static int set(int array, Enum<Object> index, bool value) => set2(array, index.ordinal, value);
+
+  /**
+   * Set the value of the element at the given index to the given value.
+   *
+   * @param array the array being modified
+   * @param index the index of the element being set
+   * @param value the value to be assigned to the element
+   * @return the updated value of the array
+   * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
+   */
+  static int set2(int array, int index, bool value) {
+    checkIndex(index);
+    if (value) {
+      return array | (1 << index);
+    } else {
+      return array & ~(1 << index);
+    }
+  }
+
+  /**
+   * Throw an exception if the index is not within the bounds allowed for an integer-encoded array
+   * of boolean values.
+   *
+   * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
+   */
+  static void checkIndex(int index) {
+    if (index < 0 || index > 30) {
+      throw new RangeError("Index not between 0 and 30: ${index}");
+    }
+  }
+}
+/**
+ * The class `ListUtilities` defines utility methods useful for working with [List
+ ].
+ */
+class ListUtilities {
+
+  /**
+   * Add all of the elements in the given array to the given list.
+   *
+   * @param list the list to which the elements are to be added
+   * @param elements the elements to be added to the list
+   */
+  static void addAll(List list, List<Object> elements) {
+    for (Object element in elements) {
+      list.add(element);
+    }
+  }
+}
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart b/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
index 714c4ce..c7879f6 100644
--- a/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart
@@ -1,6 +1,7 @@
 // This code was auto-generated, is not intended to be edited, and is subject to
 // significant change. Please see the README file for more information.
 library engine.utilities.dart;
+import 'java_core.dart';
 /**
  * The enumeration `ParameterKind` defines the different kinds of parameters. There are two
  * basic kinds of parameters: required and optional. Optional parameters are further divided into
@@ -8,7 +9,7 @@
  *
  * @coverage dart.engine.utilities
  */
-class ParameterKind implements Comparable<ParameterKind> {
+class ParameterKind implements Enum<ParameterKind> {
   static final ParameterKind REQUIRED = new ParameterKind('REQUIRED', 0, false);
   static final ParameterKind POSITIONAL = new ParameterKind('POSITIONAL', 1, true);
   static final ParameterKind NAMED = new ParameterKind('NAMED', 2, true);
diff --git a/pkg/analyzer_experimental/lib/src/services/formatter_impl.dart b/pkg/analyzer_experimental/lib/src/services/formatter_impl.dart
index c778711..cb2b7b9 100644
--- a/pkg/analyzer_experimental/lib/src/services/formatter_impl.dart
+++ b/pkg/analyzer_experimental/lib/src/services/formatter_impl.dart
@@ -4,8 +4,7 @@
 
 library formatter_impl;
 
-
-import 'dart:io';
+import 'dart:math';
 
 import 'package:analyzer_experimental/analyzer.dart';
 import 'package:analyzer_experimental/src/generated/parser.dart';
@@ -41,7 +40,7 @@
 class FormatterException implements Exception {
 
   /// A message describing the error.
-  final message;
+  final String message;
 
   /// Creates a new FormatterException with an optional error [message].
   const FormatterException([this.message = '']);
@@ -56,15 +55,15 @@
 /// Specifies the kind of code snippet to format.
 class CodeKind {
 
-  final index;
+  final int _index;
 
-  const CodeKind(this.index);
+  const CodeKind._(this._index);
 
   /// A compilation unit snippet.
-  static const COMPILATION_UNIT = const CodeKind(0);
+  static const COMPILATION_UNIT = const CodeKind._(0);
 
   /// A statement snippet.
-  static const STATEMENT = const CodeKind(1);
+  static const STATEMENT = const CodeKind._(1);
 
 }
 
@@ -77,7 +76,7 @@
   /// Format the specified portion (from [offset] with [length]) of the given
   /// [source] string, optionally providing an [indentationLevel].
   String format(CodeKind kind, String source, {int offset, int end,
-    int indentationLevel:0});
+    int indentationLevel: 0});
 
 }
 
@@ -91,7 +90,7 @@
   CodeFormatterImpl(this.options);
 
   String format(CodeKind kind, String source, {int offset, int end,
-      int indentationLevel:0}) {
+      int indentationLevel: 0}) {
 
     var start = tokenize(source);
     checkForErrors();
@@ -119,7 +118,7 @@
     throw new FormatterException('Unsupported format kind: $kind');
   }
 
-  checkForErrors() {
+  void checkForErrors() {
     if (errors.length > 0) {
       throw new FormatterException.forError(errors);
     }
@@ -139,15 +138,18 @@
 }
 
 
-
 /// An AST visitor that drives formatting heuristics.
 class SourceVisitor implements ASTVisitor {
 
   /// The writer to which the source is to be written.
-  SourceWriter writer;
+  final SourceWriter writer;
 
+  /// Cached line info for calculating blank lines.
   LineInfo lineInfo;
 
+  /// Cached previous token for calculating preceding whitespace.
+  Token previousToken;
+
   /// Initialize a newly created visitor to write source code representing
   /// the visited nodes to the given [writer].
   SourceVisitor(FormatterOptions options, this.lineInfo) :
@@ -216,6 +218,7 @@
     writer.unindent();
     writer.newline();
     writer.print('}');
+    previousToken = node.rightBracket;
   }
 
   visitBlockFunctionBody(BlockFunctionBody node) {
@@ -254,23 +257,26 @@
   }
 
   visitClassDeclaration(ClassDeclaration node) {
-    visitToken(node.abstractKeyword, ' ');
-    writer.print('class ');
+    emitToken(node.abstractKeyword, ' ');
+    emitToken(node.classKeyword, ' ');
     visit(node.name);
     visit(node.typeParameters);
     visitPrefixed(' ', node.extendsClause);
     visitPrefixed(' ', node.withClause);
     visitPrefixed(' ', node.implementsClause);
-    writer.print(' {');
+//    writer.print(' {');
+//    writer.print(' ');
+//    emit(node.leftBracket);
+    emitPrefixedToken(' ', node.leftBracket);
     writer.indent();
-    for (var member in node.members) {
-      writer.newline();
-      visit(member);
+
+    for (var i = 0; i < node.members.length; i++) {
+      visit(node.members[i]);
     }
 
     writer.unindent();
-    writer.newline();
-    writer.print('}');
+
+    emit(node.rightBracket, min: 1);
   }
 
   visitClassTypeAlias(ClassTypeAlias node) {
@@ -297,8 +303,9 @@
     visit(scriptTag);
     var prefix = scriptTag == null ? '' : ' ';
     visitPrefixedList(prefix, directives, ' ');
-    prefix = scriptTag == null && directives.isEmpty ? '' : ' ';
-    visitPrefixedListWithBlanks(prefix, node.declarations);
+    //prefix = scriptTag == null && directives.isEmpty ? '' : ' ';
+    prefix = '';
+    visitPrefixedList(prefix, node.declarations);
 
     //TODO(pquitslund): move this?
     writer.newline();
@@ -313,9 +320,9 @@
   }
 
   visitConstructorDeclaration(ConstructorDeclaration node) {
-    visitToken(node.externalKeyword, ' ');
-    visitToken(node.constKeyword, ' ');
-    visitToken(node.factoryKeyword, ' ');
+    emitToken(node.externalKeyword, ' ');
+    emitToken(node.constKeyword, ' ');
+    emitToken(node.factoryKeyword, ' ');
     visit(node.returnType);
     visitPrefixed('.', node.name);
     visit(node.parameters);
@@ -325,7 +332,7 @@
   }
 
   visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    visitToken(node.keyword, '.');
+    emitToken(node.keyword, '.');
     visit(node.fieldName);
     writer.print(' = ');
     visit(node.expression);
@@ -343,7 +350,7 @@
   }
 
   visitDeclaredIdentifier(DeclaredIdentifier node) {
-    visitToken(node.keyword, ' ');
+    emitToken(node.keyword, ' ');
     visitSuffixed(node.type, ' ');
     visit(node.identifier);
   }
@@ -403,13 +410,13 @@
   }
 
   visitFieldDeclaration(FieldDeclaration node) {
-    visitToken(node.keyword, ' ');
+    emitToken(node.keyword, ' ');
     visit(node.fields);
     writer.print(';');
   }
 
   visitFieldFormalParameter(FieldFormalParameter node) {
-    visitToken(node.keyword, ' ');
+    emitToken(node.keyword, ' ');
     visitSuffixed(node.type, ' ');
     writer.print('this.');
     visit(node.identifier);
@@ -470,7 +477,7 @@
 
   visitFunctionDeclaration(FunctionDeclaration node) {
     visitSuffixed(node.returnType, ' ');
-    visitToken(node.propertyKeyword, ' ');
+    emitToken(node.propertyKeyword, ' ');
     visit(node.name);
     visit(node.functionExpression);
   }
@@ -529,14 +536,16 @@
     visit(node.uri);
     visitPrefixed(' as ', node.prefix);
     visitPrefixedList(' ', node.combinators, ' ');
-    writer.print(';');
+//    writer.print(';');
+    emit(node.semicolon);
+//    writer.newline();
   }
 
   visitIndexExpression(IndexExpression node) {
     if (node.isCascaded) {
       writer.print('..');
     } else {
-      visit(node.array);
+      visit(node.target);
     }
     writer.print('[');
     visit(node.index);
@@ -544,7 +553,7 @@
   }
 
   visitInstanceCreationExpression(InstanceCreationExpression node) {
-    visitToken(node.keyword, ' ');
+    emitToken(node.keyword, ' ');
     visit(node.constructorName);
     visit(node.argumentList);
   }
@@ -627,11 +636,11 @@
   }
 
   visitMethodDeclaration(MethodDeclaration node) {
-    visitToken(node.externalKeyword, ' ');
-    visitToken(node.modifierKeyword, ' ');
+    emitToken(node.externalKeyword, ' ');
+    emitToken(node.modifierKeyword, ' ');
     visitSuffixed(node.returnType, ' ');
-    visitToken(node.propertyKeyword, ' ');
-    visitToken(node.operatorKeyword, ' ');
+    emitToken(node.propertyKeyword, ' ');
+    emitToken(node.operatorKeyword, ' ');
     visit(node.name);
     if (!node.isGetter) {
       visit(node.parameters);
@@ -744,13 +753,14 @@
   }
 
   visitSimpleFormalParameter(SimpleFormalParameter node) {
-    visitToken(node.keyword, ' ');
+    emitToken(node.keyword, ' ');
     visitSuffixed(node.type, ' ');
     visit(node.identifier);
   }
 
   visitSimpleIdentifier(SimpleIdentifier node) {
-    writer.print(node.token.lexeme);
+    emit(node.token);
+//    writer.print(node.token.lexeme);
   }
 
   visitSimpleStringLiteral(SimpleStringLiteral node) {
@@ -845,7 +855,7 @@
   }
 
   visitVariableDeclarationList(VariableDeclarationList node) {
-    visitToken(node.keyword, ' ');
+    emitToken(node.keyword, ' ');
     visitSuffixed(node.type, ' ');
     visitList(node.variables, ', ');
   }
@@ -901,11 +911,20 @@
     visit(body);
   }
 
-  /// Safely visit the given [token], printing the suffix after the [token]
-  /// node if it is non-null.
-  visitToken(Token token, String suffix) {
+  /// Emit the given [token], printing the prefix before the [token]
+  /// if it is non-null.
+  emitPrefixedToken(String prefix, Token token) {
     if (token != null) {
-      writer.print(token.lexeme);
+      writer.print(prefix);
+      emit(token);
+    }
+  }
+
+  /// Emit the given [token], printing the suffix after the [token]
+  /// node if it is non-null.
+  emitToken(Token token, String suffix) {
+    if (token != null) {
+      emit(token);
       writer.print(suffix);
     }
   }
@@ -940,13 +959,14 @@
   }
 
   /// Print a list of [nodes], separated by the given [separator].
-  visitPrefixedList(String prefix, NodeList<ASTNode> nodes, String separator) {
+  visitPrefixedList(String prefix, NodeList<ASTNode> nodes,
+      [String separator = null]) {
     if (nodes != null) {
       var size = nodes.length;
       if (size > 0) {
         writer.print(prefix);
         for (var i = 0; i < size; i++) {
-          if (i > 0) {
+          if (i > 0 && separator != null) {
             writer.print(separator);
           }
           nodes[i].accept(this);
@@ -955,29 +975,45 @@
     }
   }
 
-  /// Print a list of [nodes], preserving blank lines between nodes.
-  visitPrefixedListWithBlanks(String prefix,
-      NodeList<ASTNode> nodes) {
-    if (nodes != null) {
-      var size = nodes.length;
-      if (size > 0) {
-        writer.print(prefix);
-        for (var i = 0; i < size; i++) {
-          if (i > 0) {
-            // Emit blanks lines
-            var lastLine =
-                lineInfo.getLocation(nodes[i-1].endToken.offset).lineNumber;
-            var currentLine =
-                lineInfo.getLocation(nodes[i].beginToken.offset).lineNumber;
-            var blanks = currentLine - lastLine;
-            for (var i = 0; i < blanks; i++) {
-              writer.newline();
-            }
-          }
-          nodes[i].accept(this);
-        }
-      }
+  /// Emit the given [token], preceeded by any detected newlines or a minimum
+  /// as specified by [min].
+  emit(Token token, {min: 0}) {
+    var comment = token.precedingComments;
+    var currentToken = comment != null ? comment : token;
+    var newlines = max(min, countNewlinesBetween(previousToken, currentToken));
+    writer.newlines(newlines);
+    while (comment != null) {
+      writer.print(comment.toString().trim());
+      writer.newline();
+      comment = comment.next;
     }
+
+    previousToken = token;
+    writer.print(token.lexeme);
+  }
+
+  /// Count the blanks between these two nodes.
+  int countBlankLinesBetween(ASTNode lastNode, ASTNode currentNode) =>
+      countNewlinesBetween(lastNode.endToken, currentNode.beginToken);
+
+  /// Count newlines preceeding this [node].
+  int countPrecedingNewlines(ASTNode node) =>
+      countNewlinesBetween(node.beginToken.previous, node.beginToken);
+
+  /// Count newlines succeeding this [node].
+  int countSucceedingNewlines(ASTNode node) => node == null ? 0 :
+      countNewlinesBetween(node.endToken, node.endToken.next);
+
+  /// Count the blanks between these two nodes.
+  int countNewlinesBetween(Token last, Token current) {
+    if (last == null || current == null) {
+      return 0;
+    }
+    var lastLine =
+        lineInfo.getLocation(last.offset).lineNumber;
+    var currentLine =
+        lineInfo.getLocation(current.offset).lineNumber;
+    return  currentLine - lastLine;
   }
 
 }
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/services/runtime/coverage/coverage_impl.dart b/pkg/analyzer_experimental/lib/src/services/runtime/coverage/coverage_impl.dart
index 109ca39..c1f3956 100644
--- a/pkg/analyzer_experimental/lib/src/services/runtime/coverage/coverage_impl.dart
+++ b/pkg/analyzer_experimental/lib/src/services/runtime/coverage/coverage_impl.dart
@@ -8,11 +8,9 @@
 import 'dart:async';
 import 'dart:collection' show SplayTreeMap;
 import 'dart:io';
-import 'dart:json' as json;
 
 import 'package:path/path.dart' as pathos;
 
-import 'package:analyzer_experimental/src/generated/source.dart' show Source, SourceRange;
 import 'package:analyzer_experimental/src/generated/scanner.dart' show StringScanner;
 import 'package:analyzer_experimental/src/generated/parser.dart' show Parser;
 import 'package:analyzer_experimental/src/generated/ast.dart';
@@ -20,7 +18,6 @@
 
 import '../log.dart' as log;
 import 'models.dart';
-import 'utils.dart';
 
 /// Run the [targetPath] with code coverage rewriting.
 /// Redirects stdandard process streams.
diff --git a/pkg/analyzer_experimental/lib/src/services/writer.dart b/pkg/analyzer_experimental/lib/src/services/writer.dart
index 4171733..d73a1fa 100644
--- a/pkg/analyzer_experimental/lib/src/services/writer.dart
+++ b/pkg/analyzer_experimental/lib/src/services/writer.dart
@@ -19,21 +19,23 @@
     }
   }
 
-  addSpace() {
+  void addSpace() {
     addSpaces(1);
   }
 
-  addSpaces(int n) {
+  void addSpaces(int n) {
     if (n > 0) {
       tokens.add(new SpaceToken(n));
     }
   }
 
-  addToken(LineToken token) {
+  void addToken(LineToken token) {
     tokens.add(token);
   }
 
-  _indent(int n) {
+  bool isWhitespace() => tokens.every((tok) => tok is SpaceToken);
+
+  void _indent(int n) {
     tokens.add(useTabs ? new TabToken(n) : new SpaceToken(n * spacesPerIndent));
   }
 
@@ -87,47 +89,59 @@
     currentLine = new Line(indent: indentCount);
   }
 
-  indent() {
+  void indent() {
     ++indentCount;
   }
 
-  unindent() {
+  void unindent() {
     --indentCount;
   }
 
-  print(x) {
+  void print(x) {
     currentLine.addToken(new LineToken(x));
   }
 
-  newline() {
+  void newline() {
+    if (currentLine.isWhitespace()) {
+      currentLine.tokens.clear();
+    }
     currentLine.addToken(new NewlineToken(this.lineSeparator));
     buffer.write(currentLine.toString());
     currentLine = new Line(indent: indentCount);
   }
 
-  space() {
+  void newlines(int num) {
+    while (num-- > 0) {
+      newline();
+    }
+  }
+
+  void space() {
     spaces(1);
   }
 
-  spaces(n) {
+  void spaces(n) {
     currentLine.addSpaces(n);
   }
 
-  println(String s) {
+  void println(String s) {
     print(s);
     newline();
   }
 
   String toString() {
     var source = new StringBuffer(buffer.toString());
-    source.write(currentLine);
+    if (!currentLine.isWhitespace()) {
+      source.write(currentLine);
+    }
     return source.toString();
   }
+
 }
 
 
 const SPACE = ' ';
-final SPACES = [
+const SPACES = const [
           '',
           ' ',
           '  ',
@@ -146,7 +160,7 @@
           '               ',
           '                ',
 ];
-final TABS = [
+const TABS = const [
           '',
           '\t',
           '\t\t',
diff --git a/pkg/analyzer_experimental/test/generated/ast_test.dart b/pkg/analyzer_experimental/test/generated/ast_test.dart
index ba2c406..a839e84 100644
--- a/pkg/analyzer_experimental/test/generated/ast_test.dart
+++ b/pkg/analyzer_experimental/test/generated/ast_test.dart
@@ -401,11 +401,11 @@
   static SwitchDefault switchDefault2(List<Statement> statements) => switchDefault(new List<Label>(), statements);
   static SwitchStatement switchStatement(Expression expression, List<SwitchMember> members) => new SwitchStatement.full(TokenFactory.token(Keyword.SWITCH), TokenFactory.token3(TokenType.OPEN_PAREN), expression, TokenFactory.token3(TokenType.CLOSE_PAREN), TokenFactory.token3(TokenType.OPEN_CURLY_BRACKET), list(members), TokenFactory.token3(TokenType.CLOSE_CURLY_BRACKET));
   static SymbolLiteral symbolLiteral(List<String> components) {
-    List<SimpleIdentifier> identifierList = new List<SimpleIdentifier>();
+    List<Token> identifierList = new List<Token>();
     for (String component in components) {
-      identifierList.add(identifier3(component));
+      identifierList.add(TokenFactory.token4(TokenType.IDENTIFIER, component));
     }
-    return new SymbolLiteral.full(TokenFactory.token3(TokenType.HASH), identifierList);
+    return new SymbolLiteral.full(TokenFactory.token3(TokenType.HASH), new List.from(identifierList));
   }
   static ThisExpression thisExpression() => new ThisExpression.full(TokenFactory.token(Keyword.THIS));
   static ThrowExpression throwExpression() => throwExpression2(null);
@@ -717,7 +717,7 @@
     });
   }
 }
-class AssignmentKind implements Comparable<AssignmentKind> {
+class AssignmentKind implements Enum<AssignmentKind> {
   static final AssignmentKind BINARY = new AssignmentKind('BINARY', 0);
   static final AssignmentKind COMPOUND_LEFT = new AssignmentKind('COMPOUND_LEFT', 1);
   static final AssignmentKind COMPOUND_RIGHT = new AssignmentKind('COMPOUND_RIGHT', 2);
@@ -750,7 +750,7 @@
   int get hashCode => ordinal;
   String toString() => name;
 }
-class WrapperKind implements Comparable<WrapperKind> {
+class WrapperKind implements Enum<WrapperKind> {
   static final WrapperKind PREFIXED_LEFT = new WrapperKind('PREFIXED_LEFT', 0);
   static final WrapperKind PREFIXED_RIGHT = new WrapperKind('PREFIXED_RIGHT', 1);
   static final WrapperKind PROPERTY_LEFT = new WrapperKind('PROPERTY_LEFT', 2);
@@ -796,7 +796,7 @@
         "}"]);
     CompilationUnit unit = ParserTestCase.parseCompilationUnit(source, []);
     List<ASTNode> nodes = new List<ASTNode>();
-    BreadthFirstVisitor<Object> visitor = new BreadthFirstVisitor_15(nodes);
+    BreadthFirstVisitor<Object> visitor = new BreadthFirstVisitor_16(nodes);
     visitor.visitAllNodes(unit);
     EngineTestCase.assertSize(59, nodes);
     EngineTestCase.assertInstanceOf(CompilationUnit, nodes[0]);
@@ -814,9 +814,9 @@
     });
   }
 }
-class BreadthFirstVisitor_15 extends BreadthFirstVisitor<Object> {
+class BreadthFirstVisitor_16 extends BreadthFirstVisitor<Object> {
   List<ASTNode> nodes;
-  BreadthFirstVisitor_15(this.nodes) : super();
+  BreadthFirstVisitor_16(this.nodes) : super();
   Object visitNode(ASTNode node) {
     nodes.add(node);
     return super.visitNode(node);
diff --git a/pkg/analyzer_experimental/test/generated/element_test.dart b/pkg/analyzer_experimental/test/generated/element_test.dart
index 23b15b9..c5d24f1 100644
--- a/pkg/analyzer_experimental/test/generated/element_test.dart
+++ b/pkg/analyzer_experimental/test/generated/element_test.dart
@@ -64,6 +64,17 @@
     ElementLocationImpl location = new ElementLocationImpl.con2(encoding);
     JUnitTestCase.assertEquals(encoding, location.encoding);
   }
+  void test_hashCode_equal() {
+    String encoding = "a;b;c";
+    ElementLocationImpl first = new ElementLocationImpl.con2(encoding);
+    ElementLocationImpl second = new ElementLocationImpl.con2(encoding);
+    JUnitTestCase.assertTrue(first.hashCode == second.hashCode);
+  }
+  void test_hashCode_equalWithDifferentUriKind() {
+    ElementLocationImpl first = new ElementLocationImpl.con2("fa;fb;c");
+    ElementLocationImpl second = new ElementLocationImpl.con2("pa;pb;c");
+    JUnitTestCase.assertTrue(first.hashCode == second.hashCode);
+  }
   static dartSuite() {
     _ut.group('ElementLocationImplTest', () {
       _ut.test('test_create_encoding', () {
@@ -98,6 +109,14 @@
         final __test = new ElementLocationImplTest();
         runJUnitTest(__test, __test.test_getEncoding);
       });
+      _ut.test('test_hashCode_equal', () {
+        final __test = new ElementLocationImplTest();
+        runJUnitTest(__test, __test.test_hashCode_equal);
+      });
+      _ut.test('test_hashCode_equalWithDifferentUriKind', () {
+        final __test = new ElementLocationImplTest();
+        runJUnitTest(__test, __test.test_hashCode_equalWithDifferentUriKind);
+      });
     });
   }
 }
@@ -2339,7 +2358,7 @@
   }
   void test_isSubtypeOf_baseCase_classFunction() {
     ClassElementImpl functionElement = ElementFactory.classElement2("Function", []);
-    InterfaceTypeImpl functionType = new InterfaceTypeImpl_20(functionElement);
+    InterfaceTypeImpl functionType = new InterfaceTypeImpl_21(functionElement);
     FunctionType f = ElementFactory.functionElement("f").type;
     JUnitTestCase.assertTrue(f.isSubtypeOf(functionType));
   }
@@ -2799,8 +2818,8 @@
     });
   }
 }
-class InterfaceTypeImpl_20 extends InterfaceTypeImpl {
-  InterfaceTypeImpl_20(ClassElement arg0) : super.con1(arg0);
+class InterfaceTypeImpl_21 extends InterfaceTypeImpl {
+  InterfaceTypeImpl_21(ClassElement arg0) : super.con1(arg0);
   bool get isDartCoreFunction => true;
 }
 main() {
diff --git a/pkg/analyzer_experimental/test/generated/parser_test.dart b/pkg/analyzer_experimental/test/generated/parser_test.dart
index 2cb648e..077e787 100644
--- a/pkg/analyzer_experimental/test/generated/parser_test.dart
+++ b/pkg/analyzer_experimental/test/generated/parser_test.dart
@@ -31,52 +31,64 @@
     JUnitTestCase.assertEquals(5, identifier.offset);
   }
   void test_computeStringValue_emptyInterpolationPrefix() {
-    JUnitTestCase.assertEquals("", computeStringValue("'''"));
+    JUnitTestCase.assertEquals("", computeStringValue("'''", true, false));
   }
   void test_computeStringValue_escape_b() {
-    JUnitTestCase.assertEquals("\b", computeStringValue("'\\b'"));
+    JUnitTestCase.assertEquals("\b", computeStringValue("'\\b'", true, true));
   }
   void test_computeStringValue_escape_f() {
-    JUnitTestCase.assertEquals("\f", computeStringValue("'\\f'"));
+    JUnitTestCase.assertEquals("\f", computeStringValue("'\\f'", true, true));
   }
   void test_computeStringValue_escape_n() {
-    JUnitTestCase.assertEquals("\n", computeStringValue("'\\n'"));
+    JUnitTestCase.assertEquals("\n", computeStringValue("'\\n'", true, true));
   }
   void test_computeStringValue_escape_notSpecial() {
-    JUnitTestCase.assertEquals(":", computeStringValue("'\\:'"));
+    JUnitTestCase.assertEquals(":", computeStringValue("'\\:'", true, true));
   }
   void test_computeStringValue_escape_r() {
-    JUnitTestCase.assertEquals("\r", computeStringValue("'\\r'"));
+    JUnitTestCase.assertEquals("\r", computeStringValue("'\\r'", true, true));
   }
   void test_computeStringValue_escape_t() {
-    JUnitTestCase.assertEquals("\t", computeStringValue("'\\t'"));
+    JUnitTestCase.assertEquals("\t", computeStringValue("'\\t'", true, true));
   }
   void test_computeStringValue_escape_u_fixed() {
-    JUnitTestCase.assertEquals("\u4321", computeStringValue("'\\u4321'"));
+    JUnitTestCase.assertEquals("\u4321", computeStringValue("'\\u4321'", true, true));
   }
   void test_computeStringValue_escape_u_variable() {
-    JUnitTestCase.assertEquals("\u0123", computeStringValue("'\\u{123}'"));
+    JUnitTestCase.assertEquals("\u0123", computeStringValue("'\\u{123}'", true, true));
   }
   void test_computeStringValue_escape_v() {
-    JUnitTestCase.assertEquals("\u000B", computeStringValue("'\\v'"));
+    JUnitTestCase.assertEquals("\u000B", computeStringValue("'\\v'", true, true));
   }
   void test_computeStringValue_escape_x() {
-    JUnitTestCase.assertEquals("\u00FF", computeStringValue("'\\xFF'"));
+    JUnitTestCase.assertEquals("\u00FF", computeStringValue("'\\xFF'", true, true));
   }
   void test_computeStringValue_noEscape_single() {
-    JUnitTestCase.assertEquals("text", computeStringValue("'text'"));
+    JUnitTestCase.assertEquals("text", computeStringValue("'text'", true, true));
   }
   void test_computeStringValue_noEscape_triple() {
-    JUnitTestCase.assertEquals("text", computeStringValue("'''text'''"));
+    JUnitTestCase.assertEquals("text", computeStringValue("'''text'''", true, true));
   }
   void test_computeStringValue_raw_single() {
-    JUnitTestCase.assertEquals("text", computeStringValue("r'text'"));
+    JUnitTestCase.assertEquals("text", computeStringValue("r'text'", true, true));
   }
   void test_computeStringValue_raw_triple() {
-    JUnitTestCase.assertEquals("text", computeStringValue("r'''text'''"));
+    JUnitTestCase.assertEquals("text", computeStringValue("r'''text'''", true, true));
   }
   void test_computeStringValue_raw_withEscape() {
-    JUnitTestCase.assertEquals("two\\nlines", computeStringValue("r'two\\nlines'"));
+    JUnitTestCase.assertEquals("two\\nlines", computeStringValue("r'two\\nlines'", true, true));
+  }
+  void test_computeStringValue_triple_internalQuote_first_empty() {
+    JUnitTestCase.assertEquals("'", computeStringValue("''''", true, false));
+  }
+  void test_computeStringValue_triple_internalQuote_first_nonEmpty() {
+    JUnitTestCase.assertEquals("'text", computeStringValue("''''text", true, false));
+  }
+  void test_computeStringValue_triple_internalQuote_last_empty() {
+    JUnitTestCase.assertEquals("", computeStringValue("'''", false, true));
+  }
+  void test_computeStringValue_triple_internalQuote_last_nonEmpty() {
+    JUnitTestCase.assertEquals("text", computeStringValue("text'''", false, true));
   }
   void test_constFactory() {
     ParserTestCase.parse("parseClassMember", <Object> ["C"], "const factory C() = A;");
@@ -326,7 +338,7 @@
   }
   void test_parseAssignableExpression_expression_index() {
     IndexExpression expression = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "(x)[y]");
-    JUnitTestCase.assertNotNull(expression.array);
+    JUnitTestCase.assertNotNull(expression.target);
     JUnitTestCase.assertNotNull(expression.leftBracket);
     JUnitTestCase.assertNotNull(expression.index);
     JUnitTestCase.assertNotNull(expression.rightBracket);
@@ -353,7 +365,7 @@
   }
   void test_parseAssignableExpression_identifier_index() {
     IndexExpression expression = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "x[y]");
-    JUnitTestCase.assertNotNull(expression.array);
+    JUnitTestCase.assertNotNull(expression.target);
     JUnitTestCase.assertNotNull(expression.leftBracket);
     JUnitTestCase.assertNotNull(expression.index);
     JUnitTestCase.assertNotNull(expression.rightBracket);
@@ -366,7 +378,7 @@
   }
   void test_parseAssignableExpression_super_index() {
     IndexExpression expression = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "super[y]");
-    EngineTestCase.assertInstanceOf(SuperExpression, expression.array);
+    EngineTestCase.assertInstanceOf(SuperExpression, expression.target);
     JUnitTestCase.assertNotNull(expression.leftBracket);
     JUnitTestCase.assertNotNull(expression.index);
     JUnitTestCase.assertNotNull(expression.rightBracket);
@@ -454,7 +466,7 @@
   }
   void test_parseCascadeSection_i() {
     IndexExpression section = ParserTestCase.parse5("parseCascadeSection", "..[i]", []);
-    JUnitTestCase.assertNull(section.array);
+    JUnitTestCase.assertNull(section.target);
     JUnitTestCase.assertNotNull(section.leftBracket);
     JUnitTestCase.assertNotNull(section.index);
     JUnitTestCase.assertNotNull(section.rightBracket);
@@ -2828,7 +2840,7 @@
   }
   void test_parsePostfixExpression_none_indexExpression() {
     IndexExpression expression = ParserTestCase.parse5("parsePostfixExpression", "a[0]", []);
-    JUnitTestCase.assertNotNull(expression.array);
+    JUnitTestCase.assertNotNull(expression.target);
     JUnitTestCase.assertNotNull(expression.index);
   }
   void test_parsePostfixExpression_none_methodInvocation() {
@@ -3197,18 +3209,25 @@
   void test_parseSymbolLiteral_multiple() {
     SymbolLiteral literal = ParserTestCase.parse5("parseSymbolLiteral", "#a.b.c", []);
     JUnitTestCase.assertNotNull(literal.poundSign);
-    NodeList<SimpleIdentifier> components = literal.components;
-    EngineTestCase.assertSize(3, components);
-    JUnitTestCase.assertEquals("a", components[0].name);
-    JUnitTestCase.assertEquals("b", components[1].name);
-    JUnitTestCase.assertEquals("c", components[2].name);
+    List<Token> components = literal.components;
+    EngineTestCase.assertLength(3, components);
+    JUnitTestCase.assertEquals("a", components[0].lexeme);
+    JUnitTestCase.assertEquals("b", components[1].lexeme);
+    JUnitTestCase.assertEquals("c", components[2].lexeme);
+  }
+  void test_parseSymbolLiteral_operator() {
+    SymbolLiteral literal = ParserTestCase.parse5("parseSymbolLiteral", "#==", []);
+    JUnitTestCase.assertNotNull(literal.poundSign);
+    List<Token> components = literal.components;
+    EngineTestCase.assertLength(1, components);
+    JUnitTestCase.assertEquals("==", components[0].lexeme);
   }
   void test_parseSymbolLiteral_single() {
     SymbolLiteral literal = ParserTestCase.parse5("parseSymbolLiteral", "#a", []);
     JUnitTestCase.assertNotNull(literal.poundSign);
-    NodeList<SimpleIdentifier> components = literal.components;
-    EngineTestCase.assertSize(1, components);
-    JUnitTestCase.assertEquals("a", components[0].name);
+    List<Token> components = literal.components;
+    EngineTestCase.assertLength(1, components);
+    JUnitTestCase.assertEquals("a", components[0].lexeme);
   }
   void test_parseThrowExpression() {
     ThrowExpression expression = ParserTestCase.parse5("parseThrowExpression", "throw x;", []);
@@ -3753,13 +3772,15 @@
    * Invoke the method [Parser#computeStringValue] with the given argument.
    *
    * @param lexeme the argument to the method
+   * @param first `true` if this is the first token in a string literal
+   * @param last `true` if this is the last token in a string literal
    * @return the result of invoking the method
    * @throws Exception if the method could not be invoked or throws an exception
    */
-  String computeStringValue(String lexeme) {
-    AnalysisErrorListener listener = new AnalysisErrorListener_21();
+  String computeStringValue(String lexeme, bool first, bool last) {
+    AnalysisErrorListener listener = new AnalysisErrorListener_22();
     Parser parser = new Parser(null, listener);
-    return invokeParserMethodImpl(parser, "computeStringValue", <Object> [lexeme], null) as String;
+    return invokeParserMethodImpl(parser, "computeStringValue", <Object> [lexeme, first, last], null) as String;
   }
 
   /**
@@ -3930,6 +3951,22 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_computeStringValue_raw_withEscape);
       });
+      _ut.test('test_computeStringValue_triple_internalQuote_first_empty', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_computeStringValue_triple_internalQuote_first_empty);
+      });
+      _ut.test('test_computeStringValue_triple_internalQuote_first_nonEmpty', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_computeStringValue_triple_internalQuote_first_nonEmpty);
+      });
+      _ut.test('test_computeStringValue_triple_internalQuote_last_empty', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_computeStringValue_triple_internalQuote_last_empty);
+      });
+      _ut.test('test_computeStringValue_triple_internalQuote_last_nonEmpty', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_computeStringValue_triple_internalQuote_last_nonEmpty);
+      });
       _ut.test('test_constFactory', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_constFactory);
@@ -5654,6 +5691,10 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseSymbolLiteral_multiple);
       });
+      _ut.test('test_parseSymbolLiteral_operator', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseSymbolLiteral_operator);
+      });
       _ut.test('test_parseSymbolLiteral_single', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseSymbolLiteral_single);
@@ -5965,7 +6006,7 @@
     });
   }
 }
-class AnalysisErrorListener_21 implements AnalysisErrorListener {
+class AnalysisErrorListener_22 implements AnalysisErrorListener {
   void onError(AnalysisError event) {
     JUnitTestCase.fail("Unexpected compilation error: ${event.message} (${event.offset}, ${event.length})");
   }
@@ -9256,7 +9297,7 @@
   'parseStatements_1': new MethodTrampoline(1, (Parser target, arg0) => target.parseStatements(arg0)),
   'advance_0': new MethodTrampoline(0, (Parser target) => target.advance()),
   'appendScalarValue_5': new MethodTrampoline(5, (Parser target, arg0, arg1, arg2, arg3, arg4) => target.appendScalarValue(arg0, arg1, arg2, arg3, arg4)),
-  'computeStringValue_1': new MethodTrampoline(1, (Parser target, arg0) => target.computeStringValue(arg0)),
+  'computeStringValue_3': new MethodTrampoline(3, (Parser target, arg0, arg1, arg2) => target.computeStringValue(arg0, arg1, arg2)),
   'convertToFunctionDeclaration_1': new MethodTrampoline(1, (Parser target, arg0) => target.convertToFunctionDeclaration(arg0)),
   'couldBeStartOfCompilationUnitMember_0': new MethodTrampoline(0, (Parser target) => target.couldBeStartOfCompilationUnitMember()),
   'createSyntheticIdentifier_0': new MethodTrampoline(0, (Parser target) => target.createSyntheticIdentifier()),
diff --git a/pkg/analyzer_experimental/test/generated/resolver_test.dart b/pkg/analyzer_experimental/test/generated/resolver_test.dart
index 6087c87..99404c3 100644
--- a/pkg/analyzer_experimental/test/generated/resolver_test.dart
+++ b/pkg/analyzer_experimental/test/generated/resolver_test.dart
@@ -1465,13 +1465,13 @@
         "  A() {}",
         "}"]));
     resolve(source);
-    assertNoErrors();
+    assertErrors([ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
     verify([source]);
   }
   void test_finalNotInitialized_hasNativeClause_noConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A native 'something' {", "  final int x;", "}"]));
     resolve(source);
-    assertNoErrors();
+    assertErrors([ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
     verify([source]);
   }
   void test_finalNotInitialized_initializer() {
@@ -1635,19 +1635,19 @@
         "import 'lib.dart';"]));
     addSource2("/lib.dart", "library lib;");
     resolve(source);
-    assertNoErrors();
+    assertErrors([HintCode.UNUSED_IMPORT, HintCode.UNUSED_IMPORT]);
     verify([source]);
   }
   void test_importOfNonLibrary_libraryDeclared() {
-    Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';"]));
-    addSource2("/part.dart", EngineTestCase.createSource(["library lib1;"]));
+    Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';", "A a;"]));
+    addSource2("/part.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
     resolve(source);
     assertNoErrors();
     verify([source]);
   }
   void test_importOfNonLibrary_libraryNotDeclared() {
-    Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';"]));
-    addSource2("/part.dart", EngineTestCase.createSource([""]));
+    Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';", "A a;"]));
+    addSource2("/part.dart", EngineTestCase.createSource(["class A {}"]));
     resolve(source);
     assertNoErrors();
     verify([source]);
@@ -2142,6 +2142,46 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_nonAbstractClassInheritsAbstractMemberOne_abstractOverridesConcrete_accessor() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  int get g => 0;",
+        "}",
+        "abstract class B extends A {",
+        "  int get g;",
+        "}",
+        "class C extends B {",
+        "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonAbstractClassInheritsAbstractMemberOne_abstractOverridesConcrete_method() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m(p) {}",
+        "}",
+        "abstract class B extends A {",
+        "  m(p);",
+        "}",
+        "class C extends B {",
+        "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class A {",
+        "  m(p);",
+        "}",
+        "class B extends A {",
+        "  noSuchMethod(invocation) {}",
+        "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_nonBoolExpression_functionType() {
     Source source = addSource(EngineTestCase.createSource([
         "bool makeAssertion() => true;",
@@ -2458,13 +2498,14 @@
     verify([source]);
   }
   void test_prefixCollidesWithTopLevelMembers() {
-    addSource2("/lib.dart", "library lib;");
+    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {}"]));
     Source source = addSource(EngineTestCase.createSource([
-        "import '/lib.dart' as p;",
+        "import 'lib.dart' as p;",
         "typedef P();",
         "p2() {}",
         "var p3;",
-        "class p4 {}"]));
+        "class p4 {}",
+        "p.A a;"]));
     resolve(source);
     assertNoErrors();
     verify([source]);
@@ -2718,6 +2759,12 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_typeAliasCannotReferenceItself_typeVariableBounds() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A<T extends A>();"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_typeArgumentNotMatchingBounds_const() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -2830,31 +2877,6 @@
     assertNoErrors();
     verify([source]);
   }
-  void test_undefinedGetter_noSuchMethod_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  noSuchMethod(invocation) {}",
-        "}",
-        "f() {",
-        "  (new A()).g;",
-        "}"]));
-    resolve(source);
-    assertNoErrors();
-  }
-  void test_undefinedGetter_noSuchMethod_getter2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  noSuchMethod(invocation) {}",
-        "}",
-        "class B {",
-        "  A a = new A();",
-        "  m() {",
-        "    a.g;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors();
-  }
   void test_undefinedGetter_typeSubstitution() {
     Source source = addSource(EngineTestCase.createSource([
         "class A<E> {",
@@ -2876,17 +2898,6 @@
     assertNoErrors();
     verify([source]);
   }
-  void test_undefinedIdentifier_noSuchMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  noSuchMethod(invocation) {}",
-        "  f() {",
-        "    var v = a;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertNoErrors();
-  }
   void test_undefinedIdentifier_show() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart' show a;"]));
     addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
@@ -2904,17 +2915,6 @@
     resolve(source);
     assertNoErrors();
   }
-  void test_undefinedMethod_noSuchMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  noSuchMethod(invocation) {}",
-        "}",
-        "f() {",
-        "  (new A()).m();",
-        "}"]));
-    resolve(source);
-    assertNoErrors();
-  }
   void test_undefinedOperator_index() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2935,17 +2935,6 @@
     assertNoErrors();
     verify([source]);
   }
-  void test_undefinedSetter_noSuchMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  noSuchMethod(invocation) {}",
-        "}",
-        "f() {",
-        "  (new A()).s = 1;",
-        "}"]));
-    resolve(source);
-    assertNoErrors();
-  }
   void test_undefinedSuperMethod_field() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -3527,6 +3516,18 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_newWithUndefinedConstructorDefault);
       });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_abstractOverridesConcrete_accessor', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_abstractOverridesConcrete_accessor);
+      });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_abstractOverridesConcrete_method', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_abstractOverridesConcrete_method);
+      });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod);
+      });
       _ut.test('test_nonBoolExpression_functionType', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_nonBoolExpression_functionType);
@@ -3747,6 +3748,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_returnClass_withTypeAlias);
       });
+      _ut.test('test_typeAliasCannotReferenceItself_typeVariableBounds', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_typeVariableBounds);
+      });
       _ut.test('test_typeArgumentNotMatchingBounds_const', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_typeArgumentNotMatchingBounds_const);
@@ -3791,14 +3796,6 @@
         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);
-      });
-      _ut.test('test_undefinedGetter_noSuchMethod_getter2', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_undefinedGetter_noSuchMethod_getter2);
-      });
       _ut.test('test_undefinedGetter_typeSubstitution', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedGetter_typeSubstitution);
@@ -3807,10 +3804,6 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedIdentifier_hide);
       });
-      _ut.test('test_undefinedIdentifier_noSuchMethod', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_undefinedIdentifier_noSuchMethod);
-      });
       _ut.test('test_undefinedIdentifier_show', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedIdentifier_show);
@@ -3823,10 +3816,6 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedMethod_functionExpression_directCall);
       });
-      _ut.test('test_undefinedMethod_noSuchMethod', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_undefinedMethod_noSuchMethod);
-      });
       _ut.test('test_undefinedOperator_index', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedOperator_index);
@@ -3835,10 +3824,6 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedOperator_tilde);
       });
-      _ut.test('test_undefinedSetter_noSuchMethod', () {
-        final __test = new NonErrorResolverTest();
-        runJUnitTest(__test, __test.test_undefinedSetter_noSuchMethod);
-      });
       _ut.test('test_undefinedSuperMethod_field', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_undefinedSuperMethod_field);
@@ -5044,6 +5029,46 @@
     assertErrors([HintCode.DEAD_CODE]);
     verify([source]);
   }
+  void test_unusedImport() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
+    resolve(source);
+    assertErrors([HintCode.UNUSED_IMPORT]);
+    verify([source]);
+  }
+  void test_unusedImport_as() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart';",
+        "import 'lib1.dart' as one;",
+        "one.A a;"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    resolve(source);
+    assertErrors([HintCode.UNUSED_IMPORT]);
+    verify([source]);
+  }
+  void test_unusedImport_hide() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart';",
+        "import 'lib1.dart' hide A;",
+        "A a;"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    resolve(source);
+    assertErrors([HintCode.UNUSED_IMPORT]);
+    verify([source]);
+  }
+  void test_unusedImport_show() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart' show A;",
+        "import 'lib1.dart' show B;",
+        "A a;"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
+    resolve(source);
+    assertErrors([HintCode.UNUSED_IMPORT]);
+    verify([source]);
+  }
   static dartSuite() {
     _ut.group('HintCodeTest', () {
       _ut.test('test_deadCode_deadBlock_conditionalElse', () {
@@ -5146,6 +5171,22 @@
         final __test = new HintCodeTest();
         runJUnitTest(__test, __test.test_deadCode_statementAfterReturn_twoReturns);
       });
+      _ut.test('test_unusedImport', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport);
+      });
+      _ut.test('test_unusedImport_as', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_as);
+      });
+      _ut.test('test_unusedImport_hide', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_hide);
+      });
+      _ut.test('test_unusedImport_show', () {
+        final __test = new HintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_show);
+      });
     });
   }
 }
@@ -5785,6 +5826,150 @@
     _typeProvider = new TestTypeProvider();
     _inheritanceManager = createInheritanceManager();
   }
+  void test_getMapOfMembersInheritedFromClasses_accessor_extends() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.supertype = classA.type;
+    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    JUnitTestCase.assertSame(getterG, map[getterName]);
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_getMapOfMembersInheritedFromClasses_accessor_implements() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    JUnitTestCase.assertNull(map[getterName]);
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_getMapOfMembersInheritedFromClasses_accessor_with() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    JUnitTestCase.assertSame(getterG, map[getterName]);
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_getMapOfMembersInheritedFromClasses_method_extends() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.supertype = classA.type;
+    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    JUnitTestCase.assertSame(methodM, map[methodName]);
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_getMapOfMembersInheritedFromClasses_method_implements() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    JUnitTestCase.assertNull(map[methodName]);
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_getMapOfMembersInheritedFromClasses_method_with() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    JUnitTestCase.assertSame(methodM, map[methodName]);
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_getMapOfMembersInheritedFromInterfaces_accessor_extends() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.supertype = classA.type;
+    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    JUnitTestCase.assertSame(getterG, map[getterName]);
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_getMapOfMembersInheritedFromInterfaces_accessor_implements() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    JUnitTestCase.assertSame(getterG, map[getterName]);
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_getMapOfMembersInheritedFromInterfaces_accessor_with() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement> [getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    JUnitTestCase.assertSame(getterG, map[getterName]);
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_getMapOfMembersInheritedFromInterfaces_method_extends() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.supertype = classA.type;
+    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    JUnitTestCase.assertSame(methodM, map[methodName]);
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_getMapOfMembersInheritedFromInterfaces_method_implements() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    JUnitTestCase.assertSame(methodM, map[methodName]);
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
+  void test_getMapOfMembersInheritedFromInterfaces_method_with() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.mixins = <InterfaceType> [classA.type];
+    Map<String, ExecutableElement> map = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    JUnitTestCase.assertSame(methodM, map[methodName]);
+    assertNoErrors(classA);
+    assertNoErrors(classB);
+  }
   void test_lookupInheritance_interface_getter() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -6100,6 +6285,54 @@
   }
   static dartSuite() {
     _ut.group('InheritanceManagerTest', () {
+      _ut.test('test_getMapOfMembersInheritedFromClasses_accessor_extends', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_accessor_extends);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromClasses_accessor_implements', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_accessor_implements);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromClasses_accessor_with', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_accessor_with);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromClasses_method_extends', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_method_extends);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromClasses_method_implements', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_method_implements);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromClasses_method_with', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromClasses_method_with);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_accessor_extends', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_accessor_extends);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_accessor_implements', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_accessor_implements);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_accessor_with', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_accessor_with);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_method_extends', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_method_extends);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_method_implements', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_method_implements);
+      });
+      _ut.test('test_getMapOfMembersInheritedFromInterfaces_method_with', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_getMapOfMembersInheritedFromInterfaces_method_with);
+      });
       _ut.test('test_lookupInheritance_interface_getter', () {
         final __test = new InheritanceManagerTest();
         runJUnitTest(__test, __test.test_lookupInheritance_interface_getter);
@@ -6299,115 +6532,6 @@
     assertErrors([CompileTimeErrorCode.AMBIGUOUS_EXPORT]);
     verify([source]);
   }
-  void test_ambiguousImport_as() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "f(p) {p as N;}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
-  }
-  void test_ambiguousImport_extends() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "class A extends N {}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
-    resolve(source);
-    assertErrors([
-        CompileTimeErrorCode.AMBIGUOUS_IMPORT,
-        CompileTimeErrorCode.EXTENDS_NON_CLASS]);
-  }
-  void test_ambiguousImport_function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "g() { return f(); }"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f() {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f() {}"]));
-    resolve(source);
-    assertErrors([
-        CompileTimeErrorCode.AMBIGUOUS_IMPORT,
-        StaticTypeWarningCode.UNDEFINED_FUNCTION]);
-  }
-  void test_ambiguousImport_implements() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "class A implements N {}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
-    resolve(source);
-    assertErrors([
-        CompileTimeErrorCode.AMBIGUOUS_IMPORT,
-        CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
-  }
-  void test_ambiguousImport_instanceCreation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "f() {new N();}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
-  }
-  void test_ambiguousImport_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "f(p) {p is N;}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
-  }
-  void test_ambiguousImport_qualifier() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "g() { N.FOO; }"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
-  }
-  void test_ambiguousImport_typeArgument_instanceCreation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "class A<T> {}",
-        "f() {new A<N>();}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
-  }
-  void test_ambiguousImport_varRead() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "f() { g(v); }",
-        "g(p) {}"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "var v;"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "var v;"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
-  }
-  void test_ambiguousImport_varWrite() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "f() { v = 0; }"]));
-    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "var v;"]));
-    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "var v;"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
-  }
   void test_argumentDefinitionTestNonParameter() {
     Source source = addSource(EngineTestCase.createSource(["f() {", " var v = 0;", " return ?v;", "}"]));
     resolve(source);
@@ -7399,18 +7523,22 @@
   void test_importInternalLibrary() {
     Source source = addSource(EngineTestCase.createSource(["import 'dart:_interceptors';"]));
     resolve(source);
-    assertErrors([CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY]);
+    assertErrors([
+        CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY,
+        HintCode.UNUSED_IMPORT]);
     verify([source]);
   }
   void test_importInternalLibrary_collection() {
     Source source = addSource(EngineTestCase.createSource(["import 'dart:_collection-dev';"]));
     resolve(source);
-    assertErrors([CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY]);
+    assertErrors([
+        CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY,
+        HintCode.UNUSED_IMPORT]);
     verify([source]);
   }
   void test_importOfNonLibrary() {
-    Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';"]));
-    addSource2("/part.dart", EngineTestCase.createSource(["part of lib;"]));
+    Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';", "A a;"]));
+    addSource2("/part.dart", EngineTestCase.createSource(["part of lib;", "class A{}"]));
     resolve(source);
     assertErrors([CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY]);
     verify([source]);
@@ -7926,6 +8054,12 @@
     assertErrors([CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS]);
     verify([source]);
   }
+  void test_nativeClauseInNonSDKCode() {
+    Source source = addSource(EngineTestCase.createSource(["class A native 'string' {}"]));
+    resolve(source);
+    assertErrors([ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
+    verify([source]);
+  }
   void test_nativeFunctionBodyInNonSDKCode_function() {
     Source source = addSource(EngineTestCase.createSource(["int m(a) native 'string';"]));
     resolve(source);
@@ -8222,29 +8356,29 @@
     verify([source]);
   }
   void test_prefixCollidesWithTopLevelMembers_functionTypeAlias() {
-    addSource2("/lib.dart", "library lib;");
-    Source source = addSource(EngineTestCase.createSource(["import '/lib.dart' as p;", "typedef p();"]));
+    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "typedef p();", "p.A a;"]));
     resolve(source);
     assertErrors([CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
     verify([source]);
   }
   void test_prefixCollidesWithTopLevelMembers_topLevelFunction() {
-    addSource2("/lib.dart", "library lib;");
-    Source source = addSource(EngineTestCase.createSource(["import '/lib.dart' as p;", "p() {}"]));
+    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "p() {}", "p.A a;"]));
     resolve(source);
     assertErrors([CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
     verify([source]);
   }
   void test_prefixCollidesWithTopLevelMembers_topLevelVariable() {
-    addSource2("/lib.dart", "library lib;");
-    Source source = addSource(EngineTestCase.createSource(["import '/lib.dart' as p;", "var p = null;"]));
+    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "var p = null;", "p.A a;"]));
     resolve(source);
     assertErrors([CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
     verify([source]);
   }
   void test_prefixCollidesWithTopLevelMembers_type() {
-    addSource2("/lib.dart", "library lib;");
-    Source source = addSource(EngineTestCase.createSource(["import '/lib.dart' as p;", "class p {}"]));
+    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "class p {}", "p.A a;"]));
     resolve(source);
     assertErrors([CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
     verify([source]);
@@ -8620,6 +8754,23 @@
     assertErrors([CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
+  void test_typeAliasCannotReferenceItself_parameterType_typeArgument() {
+    Source source = addSource(EngineTestCase.createSource(["typedef A(List<A> a);"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+  void test_typeAliasCannotReferenceItself_returnClass_withTypeAlias() {
+    Source source = addSource(EngineTestCase.createSource([
+        "typedef C A();",
+        "typedef A B();",
+        "class C {",
+        "  B a;",
+        "}"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
   void test_typeAliasCannotReferenceItself_returnType() {
     Source source = addSource(EngineTestCase.createSource(["typedef A A();"]));
     resolve(source);
@@ -8634,12 +8785,6 @@
         CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
-  void test_typeAliasCannotReferenceItself_typeVariableBounds() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A<T extends A>();"]));
-    resolve(source);
-    assertErrors([CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
-    verify([source]);
-  }
   void test_typeAliasCannotRereferenceItself_mixin_direct() {
     Source source = addSource(EngineTestCase.createSource(["typedef M = Object with M;"]));
     resolve(source);
@@ -8888,46 +9033,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_ambiguousExport);
       });
-      _ut.test('test_ambiguousImport_as', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_ambiguousImport_as);
-      });
-      _ut.test('test_ambiguousImport_extends', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_ambiguousImport_extends);
-      });
-      _ut.test('test_ambiguousImport_function', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_ambiguousImport_function);
-      });
-      _ut.test('test_ambiguousImport_implements', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_ambiguousImport_implements);
-      });
-      _ut.test('test_ambiguousImport_instanceCreation', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_ambiguousImport_instanceCreation);
-      });
-      _ut.test('test_ambiguousImport_is', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_ambiguousImport_is);
-      });
-      _ut.test('test_ambiguousImport_qualifier', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_ambiguousImport_qualifier);
-      });
-      _ut.test('test_ambiguousImport_typeArgument_instanceCreation', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_ambiguousImport_typeArgument_instanceCreation);
-      });
-      _ut.test('test_ambiguousImport_varRead', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_ambiguousImport_varRead);
-      });
-      _ut.test('test_ambiguousImport_varWrite', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_ambiguousImport_varWrite);
-      });
       _ut.test('test_argumentDefinitionTestNonParameter', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_argumentDefinitionTestNonParameter);
@@ -9644,6 +9749,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_multipleSuperInitializers);
       });
+      _ut.test('test_nativeClauseInNonSDKCode', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_nativeClauseInNonSDKCode);
+      });
       _ut.test('test_nativeFunctionBodyInNonSDKCode_function', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_nativeFunctionBodyInNonSDKCode_function);
@@ -9960,6 +10069,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_parameterType_required);
       });
+      _ut.test('test_typeAliasCannotReferenceItself_parameterType_typeArgument', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_parameterType_typeArgument);
+      });
+      _ut.test('test_typeAliasCannotReferenceItself_returnClass_withTypeAlias', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_returnClass_withTypeAlias);
+      });
       _ut.test('test_typeAliasCannotReferenceItself_returnType', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_returnType);
@@ -9968,10 +10085,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_returnType_indirect);
       });
-      _ut.test('test_typeAliasCannotReferenceItself_typeVariableBounds', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_typeVariableBounds);
-      });
       _ut.test('test_typeAliasCannotRereferenceItself_mixin_direct', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_typeAliasCannotRereferenceItself_mixin_direct);
@@ -10517,13 +10630,13 @@
     leftHandSide.staticType = intType;
     AssignmentExpression assignment = ASTFactory.assignmentExpression(leftHandSide, TokenType.PLUS_EQ, ASTFactory.integer(1));
     resolveNode(assignment, []);
-    JUnitTestCase.assertSame(getMethod(_typeProvider.numType, "+"), assignment.element);
+    JUnitTestCase.assertSame(getMethod(_typeProvider.numType, "+"), assignment.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitAssignmentExpression_simple() {
     AssignmentExpression expression = ASTFactory.assignmentExpression(ASTFactory.identifier3("x"), TokenType.EQ, ASTFactory.integer(0));
     resolveNode(expression, []);
-    JUnitTestCase.assertNull(expression.element);
+    JUnitTestCase.assertNull(expression.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitBinaryExpression() {
@@ -10532,7 +10645,7 @@
     left.staticType = numType;
     BinaryExpression expression = ASTFactory.binaryExpression(left, TokenType.PLUS, ASTFactory.identifier3("j"));
     resolveNode(expression, []);
-    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.element);
+    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitBreakStatement_withLabel() {
@@ -10705,7 +10818,7 @@
     operand.staticType = numType;
     PostfixExpression expression = ASTFactory.postfixExpression(operand, TokenType.PLUS_PLUS);
     resolveNode(expression, []);
-    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.element);
+    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitPrefixedIdentifier_dynamic() {
@@ -10743,7 +10856,7 @@
     operand.staticType = numType;
     PrefixExpression expression = ASTFactory.prefixExpression(TokenType.PLUS_PLUS, operand);
     resolveNode(expression, []);
-    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.element);
+    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
     _listener.assertNoErrors();
   }
   void test_visitPropertyAccess_getter_identifier() {
@@ -10918,7 +11031,7 @@
    */
   Element resolve5(IndexExpression node, List<Element> definedElements) {
     resolveNode(node, definedElements);
-    return node.element;
+    return node.staticElement;
   }
 
   /**
@@ -11420,12 +11533,6 @@
         StaticWarningCode.UNDEFINED_IDENTIFIER,
         StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
-  void fail_undefinedIdentifier_function() {
-    Source source = addSource(EngineTestCase.createSource(["int a() => b;"]));
-    resolve(source);
-    assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER]);
-    verify([source]);
-  }
   void fail_undefinedSetter() {
     Source source = addSource(EngineTestCase.createSource(["class C {}", "f(var p) {", "  C.m = 0;", "}"]));
     resolve(source);
@@ -11444,6 +11551,83 @@
     assertErrors([StaticWarningCode.UNDEFINED_STATIC_METHOD_OR_GETTER]);
     verify([source]);
   }
+  void test_ambiguousImport_as() {
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'lib1.dart';",
+        "import 'lib2.dart';",
+        "f(p) {p as N;}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+  void test_ambiguousImport_extends() {
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'lib1.dart';",
+        "import 'lib2.dart';",
+        "class A extends N {}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([
+        StaticWarningCode.AMBIGUOUS_IMPORT,
+        CompileTimeErrorCode.EXTENDS_NON_CLASS]);
+  }
+  void test_ambiguousImport_function() {
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'lib1.dart';",
+        "import 'lib2.dart';",
+        "g() { return f(); }"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f() {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f() {}"]));
+    resolve(source);
+    assertErrors([
+        StaticWarningCode.AMBIGUOUS_IMPORT,
+        StaticTypeWarningCode.UNDEFINED_FUNCTION]);
+  }
+  void test_ambiguousImport_implements() {
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'lib1.dart';",
+        "import 'lib2.dart';",
+        "class A implements N {}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([
+        StaticWarningCode.AMBIGUOUS_IMPORT,
+        CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
+  }
+  void test_ambiguousImport_instanceCreation() {
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart';",
+        "import 'lib2.dart';",
+        "f() {new N();}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+  void test_ambiguousImport_is() {
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'lib1.dart';",
+        "import 'lib2.dart';",
+        "f(p) {p is N;}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+  void test_ambiguousImport_qualifier() {
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'lib1.dart';",
+        "import 'lib2.dart';",
+        "g() { N.FOO; }"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
   void test_ambiguousImport_typeAnnotation() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
@@ -11479,6 +11663,38 @@
     resolve(source);
     assertErrors([StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
+  void test_ambiguousImport_typeArgument_instanceCreation() {
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'lib1.dart';",
+        "import 'lib2.dart';",
+        "class A<T> {}",
+        "f() {new A<N>();}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+  void test_ambiguousImport_varRead() {
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'lib1.dart';",
+        "import 'lib2.dart';",
+        "f() { g(v); }",
+        "g(p) {}"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "var v;"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "var v;"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+  void test_ambiguousImport_varWrite() {
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'lib1.dart';",
+        "import 'lib2.dart';",
+        "f() { v = 0; }"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "var v;"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "var v;"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
   void test_argumentTypeNotAssignable_annotation_namedConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -11648,6 +11864,25 @@
     assertErrors([StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
+  void test_assignmentToConst_instanceVariable() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static const v = 0;",
+        "}",
+        "f() {",
+        "  A a = new A();",
+        "  a.v = 1;",
+        "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ASSIGNMENT_TO_CONST]);
+    verify([source]);
+  }
+  void test_assignmentToConst_localVariable() {
+    Source source = addSource(EngineTestCase.createSource(["f() {", "  const x = 0;", "  x = 1;", "}"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.ASSIGNMENT_TO_CONST]);
+    verify([source]);
+  }
   void test_assignmentToFinal_instanceVariable() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -11988,7 +12223,10 @@
     addSource2("/lib1.dart", "library lib;");
     addSource2("/lib2.dart", "library lib;");
     resolve(source);
-    assertErrors([StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAME]);
+    assertErrors([
+        StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAME,
+        HintCode.UNUSED_IMPORT,
+        HintCode.UNUSED_IMPORT]);
     verify([source]);
   }
   void test_inconsistentMethodInheritanceGetterAndMethod() {
@@ -12362,12 +12600,13 @@
     verify([source]);
   }
   void test_newWithNonType_fromLibrary() {
-    Source source1 = addSource2("lib.dart", "");
+    Source source1 = addSource2("lib.dart", "class B {}");
     Source source2 = addSource2("lib2.dart", EngineTestCase.createSource([
         "import 'lib.dart' as lib;",
         "void f() {",
         "  var a = new lib.A();",
-        "}"]));
+        "}",
+        "lib.B b;"]));
     resolve(source1);
     resolve(source2);
     assertErrors([StaticWarningCode.NEW_WITH_NON_TYPE]);
@@ -12790,11 +13029,29 @@
     assertErrors([StaticWarningCode.UNDEFINED_GETTER]);
     verify([source1]);
   }
+  void test_undefinedIdentifier_function() {
+    Source source = addSource(EngineTestCase.createSource(["int a() => b;"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
+  void test_undefinedIdentifier_function_prefix() {
+    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as b;", "", "int a() => b;", "b.C c;"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER]);
+    verify([source]);
+  }
   void test_undefinedIdentifier_initializer() {
     Source source = addSource(EngineTestCase.createSource(["var a = b;"]));
     resolve(source);
     assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
+  void test_undefinedIdentifier_initializer_prefix() {
+    addSource2("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
+    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as b;", "", "var a = b;", "b.C c;"]));
+    resolve(source);
+    assertErrors([StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
   void test_undefinedIdentifier_metadata() {
     Source source = addSource(EngineTestCase.createSource(["@undefined class A {}"]));
     resolve(source);
@@ -12812,6 +13069,34 @@
   }
   static dartSuite() {
     _ut.group('StaticWarningCodeTest', () {
+      _ut.test('test_ambiguousImport_as', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_as);
+      });
+      _ut.test('test_ambiguousImport_extends', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_extends);
+      });
+      _ut.test('test_ambiguousImport_function', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_function);
+      });
+      _ut.test('test_ambiguousImport_implements', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_implements);
+      });
+      _ut.test('test_ambiguousImport_instanceCreation', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_instanceCreation);
+      });
+      _ut.test('test_ambiguousImport_is', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_is);
+      });
+      _ut.test('test_ambiguousImport_qualifier', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_qualifier);
+      });
       _ut.test('test_ambiguousImport_typeAnnotation', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_ambiguousImport_typeAnnotation);
@@ -12820,6 +13105,18 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_ambiguousImport_typeArgument_annotation);
       });
+      _ut.test('test_ambiguousImport_typeArgument_instanceCreation', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_typeArgument_instanceCreation);
+      });
+      _ut.test('test_ambiguousImport_varRead', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_varRead);
+      });
+      _ut.test('test_ambiguousImport_varWrite', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_ambiguousImport_varWrite);
+      });
       _ut.test('test_argumentTypeNotAssignable_annotation_namedConstructor', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_annotation_namedConstructor);
@@ -12888,6 +13185,14 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_argumentTypeNotAssignable_new_required);
       });
+      _ut.test('test_assignmentToConst_instanceVariable', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToConst_instanceVariable);
+      });
+      _ut.test('test_assignmentToConst_localVariable', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_assignmentToConst_localVariable);
+      });
       _ut.test('test_assignmentToFinal_instanceVariable', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_assignmentToFinal_instanceVariable);
@@ -13364,10 +13669,22 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedGetter_fromLibrary);
       });
+      _ut.test('test_undefinedIdentifier_function', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedIdentifier_function);
+      });
+      _ut.test('test_undefinedIdentifier_function_prefix', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedIdentifier_function_prefix);
+      });
       _ut.test('test_undefinedIdentifier_initializer', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedIdentifier_initializer);
       });
+      _ut.test('test_undefinedIdentifier_initializer_prefix', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_undefinedIdentifier_initializer_prefix);
+      });
       _ut.test('test_undefinedIdentifier_metadata', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedIdentifier_metadata);
@@ -13855,7 +14172,7 @@
       JUnitTestCase.assertEquals(typeC, scope.lookup(ASTFactory.identifier3(typeNameC), importingLibrary));
       errorListener.assertNoErrors();
       Element element = scope.lookup(ASTFactory.identifier3(typeNameB), importingLibrary);
-      errorListener.assertErrors2([CompileTimeErrorCode.AMBIGUOUS_IMPORT]);
+      errorListener.assertErrors2([StaticWarningCode.AMBIGUOUS_IMPORT]);
       EngineTestCase.assertInstanceOf(MultiplyDefinedElement, element);
       List<Element> conflictingElements = ((element as MultiplyDefinedElement)).conflictingElements;
       JUnitTestCase.assertEquals(typeB1, conflictingElements[0]);
@@ -13894,13 +14211,13 @@
   void test_getDefiningLibrary() {
     LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
-    Scope scope = new LibraryImportScope(definingLibrary, errorListener);
+    LibraryImportScope scope = new LibraryImportScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(definingLibrary, scope.definingLibrary);
   }
   void test_getErrorListener() {
     LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
-    Scope scope = new LibraryImportScope(definingLibrary, errorListener);
+    LibraryImportScope scope = new LibraryImportScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(errorListener, scope.errorListener);
   }
   void test_prefixedAndNonPrefixed() {
@@ -14026,7 +14343,7 @@
     if (operandType == null || operandType.isDynamic) {
       return null;
     }
-    return checkResolved2(node, node.element, MethodElement);
+    return checkResolved2(node, node.staticElement, MethodElement);
   }
   Object visitCommentReference(CommentReference node) => null;
   Object visitCompilationUnit(CompilationUnit node) {
@@ -14059,7 +14376,7 @@
     if (targetType == null || targetType.isDynamic) {
       return null;
     }
-    return checkResolved2(node, node.element, MethodElement);
+    return checkResolved2(node, node.staticElement, MethodElement);
   }
   Object visitLibraryDirective(LibraryDirective node) => checkResolved2(node, node.element, LibraryElement);
   Object visitNamedExpression(NamedExpression node) => node.expression.accept(this);
@@ -14074,7 +14391,7 @@
     if (operandType == null || operandType.isDynamic) {
       return null;
     }
-    return checkResolved2(node, node.element, MethodElement);
+    return checkResolved2(node, node.staticElement, MethodElement);
   }
   Object visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefix = node.prefix;
@@ -14094,7 +14411,7 @@
     if (operandType == null || operandType.isDynamic) {
       return null;
     }
-    return checkResolved2(node, node.element, MethodElement);
+    return checkResolved2(node, node.staticElement, MethodElement);
   }
   Object visitPropertyAccess(PropertyAccess node) {
     Expression target = node.realTarget;
@@ -14186,13 +14503,13 @@
   void test_getDefiningLibrary() {
     LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
-    Scope scope = new LibraryScope(definingLibrary, errorListener);
+    LibraryScope scope = new LibraryScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(definingLibrary, scope.definingLibrary);
   }
   void test_getErrorListener() {
     LibraryElement definingLibrary = createTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
-    Scope scope = new LibraryScope(definingLibrary, errorListener);
+    LibraryScope scope = new LibraryScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(errorListener, scope.errorListener);
   }
   static dartSuite() {
@@ -14278,7 +14595,6 @@
     AssignmentExpression node = ASTFactory.assignmentExpression(identifier, TokenType.PLUS_EQ, resolvedInteger(1));
     MethodElement plusMethod = getMethod(numType, "+");
     node.staticElement = plusMethod;
-    node.element = plusMethod;
     JUnitTestCase.assertSame(numType, analyze(node));
     _listener.assertNoErrors();
   }
@@ -14310,19 +14626,19 @@
   }
   void test_visitBinaryExpression_plusID() {
     BinaryExpression node = ASTFactory.binaryExpression(resolvedInteger(1), TokenType.PLUS, resolvedDouble(2.0));
-    setStaticElement(node, getMethod(_typeProvider.numType, "+"));
+    node.staticElement = getMethod(_typeProvider.numType, "+");
     JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
     _listener.assertNoErrors();
   }
   void test_visitBinaryExpression_plusII() {
     BinaryExpression node = ASTFactory.binaryExpression(resolvedInteger(1), TokenType.PLUS, resolvedInteger(2));
-    setStaticElement(node, getMethod(_typeProvider.numType, "+"));
+    node.staticElement = getMethod(_typeProvider.numType, "+");
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
   void test_visitBinaryExpression_slash() {
     BinaryExpression node = ASTFactory.binaryExpression(resolvedInteger(2), TokenType.SLASH, resolvedInteger(2));
-    setStaticElement(node, getMethod(_typeProvider.numType, "/"));
+    node.staticElement = getMethod(_typeProvider.numType, "/");
     JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
     _listener.assertNoErrors();
   }
@@ -14332,13 +14648,13 @@
     MethodElement operator = ElementFactory.methodElement("*", typeA, [_typeProvider.doubleType]);
     classA.methods = <MethodElement> [operator];
     BinaryExpression node = ASTFactory.binaryExpression(ASTFactory.asExpression(ASTFactory.identifier3("a"), ASTFactory.typeName(classA, [])), TokenType.PLUS, resolvedDouble(2.0));
-    setStaticElement(node, operator);
+    node.staticElement = operator;
     JUnitTestCase.assertSame(typeA, analyze(node));
     _listener.assertNoErrors();
   }
   void test_visitBinaryExpression_starID() {
     BinaryExpression node = ASTFactory.binaryExpression(resolvedInteger(1), TokenType.PLUS, resolvedDouble(2.0));
-    setStaticElement(node, getMethod(_typeProvider.numType, "*"));
+    node.staticElement = getMethod(_typeProvider.numType, "*");
     JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
     _listener.assertNoErrors();
   }
@@ -14506,7 +14822,6 @@
     IndexExpression node = ASTFactory.indexExpression(identifier, resolvedInteger(2));
     MethodElement indexMethod = listType.element.methods[0];
     node.staticElement = indexMethod;
-    node.element = indexMethod;
     JUnitTestCase.assertSame(listType.typeArguments[0], analyze(node));
     _listener.assertNoErrors();
   }
@@ -14516,7 +14831,6 @@
     IndexExpression node = ASTFactory.indexExpression(identifier, resolvedInteger(2));
     MethodElement indexMethod = listType.element.methods[1];
     node.staticElement = indexMethod;
-    node.element = indexMethod;
     ASTFactory.assignmentExpression(node, TokenType.EQ, ASTFactory.integer(0));
     JUnitTestCase.assertSame(listType.typeArguments[0], analyze(node));
     _listener.assertNoErrors();
@@ -14531,7 +14845,6 @@
     IndexExpression indexExpression = ASTFactory.indexExpression(identifier, ASTFactory.integer(0));
     MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType);
     indexExpression.staticElement = indexMethod;
-    indexExpression.element = indexMethod;
     JUnitTestCase.assertSame(intType, analyze(indexExpression));
     _listener.assertNoErrors();
   }
@@ -14545,7 +14858,6 @@
     IndexExpression indexExpression = ASTFactory.indexExpression(identifier, ASTFactory.integer(0));
     MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType);
     indexExpression.staticElement = indexMethod;
-    indexExpression.element = indexMethod;
     ASTFactory.assignmentExpression(indexExpression, TokenType.EQ, ASTFactory.integer(0));
     JUnitTestCase.assertSame(intType, analyze(indexExpression));
     _listener.assertNoErrors();
@@ -14696,7 +15008,6 @@
     PrefixExpression node = ASTFactory.prefixExpression(TokenType.MINUS, resolvedInteger(0));
     MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
     node.staticElement = minusMethod;
-    node.element = minusMethod;
     JUnitTestCase.assertSame(_typeProvider.numType, analyze(node));
     _listener.assertNoErrors();
   }
@@ -14704,7 +15015,6 @@
     PrefixExpression node = ASTFactory.prefixExpression(TokenType.MINUS_MINUS, resolvedInteger(0));
     MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
     node.staticElement = minusMethod;
-    node.element = minusMethod;
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
@@ -14717,7 +15027,6 @@
     PrefixExpression node = ASTFactory.prefixExpression(TokenType.PLUS_PLUS, resolvedInteger(0));
     MethodElement plusMethod = getMethod(_typeProvider.numType, "+");
     node.staticElement = plusMethod;
-    node.element = plusMethod;
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
@@ -14725,7 +15034,6 @@
     PrefixExpression node = ASTFactory.prefixExpression(TokenType.TILDE, resolvedInteger(0));
     MethodElement tildeMethod = getMethod(_typeProvider.intType, "~");
     node.staticElement = tildeMethod;
-    node.element = tildeMethod;
     JUnitTestCase.assertSame(_typeProvider.intType, analyze(node));
     _listener.assertNoErrors();
   }
@@ -14766,6 +15074,9 @@
     JUnitTestCase.assertSame(thisType, analyze2(node, thisType));
     _listener.assertNoErrors();
   }
+  void test_visitSymbolLiteral() {
+    JUnitTestCase.assertSame(_typeProvider.symbolType, analyze(ASTFactory.symbolLiteral(["a"])));
+  }
   void test_visitThisExpression() {
     InterfaceType thisType = ElementFactory.classElement("B", ElementFactory.classElement2("A", []).type, []).type;
     Expression node = ASTFactory.thisExpression();
@@ -14988,14 +15299,6 @@
   }
 
   /**
-   * Sets the element for the node and remembers it as the static resolution.
-   */
-  void setStaticElement(BinaryExpression node, MethodElement element2) {
-    node.staticElement = element2;
-    node.element = element2;
-  }
-
-  /**
    * Set the type of the given parameter to the given type.
    *
    * @param parameter the parameter whose type is to be set
@@ -15268,6 +15571,10 @@
         final __test = new StaticTypeAnalyzerTest();
         runJUnitTest(__test, __test.test_visitSuperExpression);
       });
+      _ut.test('test_visitSymbolLiteral', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitSymbolLiteral);
+      });
       _ut.test('test_visitThisExpression', () {
         final __test = new StaticTypeAnalyzerTest();
         runJUnitTest(__test, __test.test_visitThisExpression);
@@ -15295,12 +15602,50 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_unusedImport_export() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two two;"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class Two {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_unusedImport_export_infiniteLoop() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two one;"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "export 'lib3.dart';", "class Two {}"]));
+    addSource2("/lib3.dart", EngineTestCase.createSource(["library lib3;", "export 'lib2.dart';", "class Three {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
+  void test_unusedImport_export2() {
+    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two one;"]));
+    addSource2("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
+    addSource2("/lib2.dart", EngineTestCase.createSource(["library lib2;", "export 'lib3.dart';", "class Two {}"]));
+    addSource2("/lib3.dart", EngineTestCase.createSource(["library lib3;", "class Three {}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   static dartSuite() {
     _ut.group('NonHintCodeTest', () {
       _ut.test('test_deadCode_deadCatch_onCatchSubtype', () {
         final __test = new NonHintCodeTest();
         runJUnitTest(__test, __test.test_deadCode_deadCatch_onCatchSubtype);
       });
+      _ut.test('test_unusedImport_export', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_export);
+      });
+      _ut.test('test_unusedImport_export2', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_export2);
+      });
+      _ut.test('test_unusedImport_export_infiniteLoop', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_export_infiniteLoop);
+      });
     });
   }
 }
@@ -15308,7 +15653,7 @@
   void test_define_duplicate() {
     LibraryElement definingLibrary2 = createTestLibrary();
     GatheringErrorListener errorListener2 = new GatheringErrorListener();
-    Scope rootScope = new Scope_18(definingLibrary2, errorListener2);
+    Scope rootScope = new Scope_19(definingLibrary2, errorListener2);
     EnclosedScope scope = new EnclosedScope(rootScope);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
     VariableElement element2 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
@@ -15319,7 +15664,7 @@
   void test_define_normal() {
     LibraryElement definingLibrary3 = createTestLibrary();
     GatheringErrorListener errorListener3 = new GatheringErrorListener();
-    Scope rootScope = new Scope_19(definingLibrary3, errorListener3);
+    Scope rootScope = new Scope_20(definingLibrary3, errorListener3);
     EnclosedScope outerScope = new EnclosedScope(rootScope);
     EnclosedScope innerScope = new EnclosedScope(outerScope);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
@@ -15341,18 +15686,18 @@
     });
   }
 }
-class Scope_18 extends Scope {
+class Scope_19 extends Scope {
   LibraryElement definingLibrary2;
   GatheringErrorListener errorListener2;
-  Scope_18(this.definingLibrary2, this.errorListener2) : super();
+  Scope_19(this.definingLibrary2, this.errorListener2) : super();
   LibraryElement get definingLibrary => definingLibrary2;
   AnalysisErrorListener get errorListener => errorListener2;
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
 }
-class Scope_19 extends Scope {
+class Scope_20 extends Scope {
   LibraryElement definingLibrary3;
   GatheringErrorListener errorListener3;
-  Scope_19(this.definingLibrary3, this.errorListener3) : super();
+  Scope_20(this.definingLibrary3, this.errorListener3) : super();
   LibraryElement get definingLibrary => definingLibrary3;
   AnalysisErrorListener get errorListener => errorListener3;
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
@@ -15567,13 +15912,13 @@
   }
   void test_getDefiningLibrary() {
     LibraryElement definingLibrary = createTestLibrary();
-    Scope scope = new ScopeTest_TestScope(definingLibrary, null);
+    ScopeTest_TestScope scope = new ScopeTest_TestScope(definingLibrary, null);
     JUnitTestCase.assertEquals(definingLibrary, scope.definingLibrary);
   }
   void test_getErrorListener() {
     LibraryElement definingLibrary = new LibraryElementImpl(new AnalysisContextImpl(), ASTFactory.libraryIdentifier2(["test"]));
     GatheringErrorListener errorListener = new GatheringErrorListener();
-    Scope scope = new ScopeTest_TestScope(definingLibrary, errorListener);
+    ScopeTest_TestScope scope = new ScopeTest_TestScope(definingLibrary, errorListener);
     JUnitTestCase.assertEquals(errorListener, scope.errorListener);
   }
   void test_isPrivateName_nonPrivate() {
@@ -15878,7 +16223,7 @@
     verify([source]);
   }
   void test_import_hide() {
-    addSource2("lib1.dart", EngineTestCase.createSource(["library lib1;", "set foo(value) {}"]));
+    addSource2("lib1.dart", EngineTestCase.createSource(["library lib1;", "set foo(value) {}", "class A {}"]));
     addSource2("lib2.dart", EngineTestCase.createSource(["library lib2;", "set foo(value) {}"]));
     Source source = addSource2("lib3.dart", EngineTestCase.createSource([
         "import 'lib1.dart' hide foo;",
@@ -15886,7 +16231,8 @@
         "",
         "main() {",
         "  foo = 0;",
-        "}"]));
+        "}",
+        "A a;"]));
     resolve(source);
     assertNoErrors();
     verify([source]);
@@ -15903,6 +16249,18 @@
     assertNoErrors();
     verify([source]);
   }
+  void test_import_spaceInUri() {
+    addSource2("sub folder/lib.dart", EngineTestCase.createSource(["library lib;", "foo() {}"]));
+    Source source = addSource2("app.dart", EngineTestCase.createSource([
+        "import 'sub folder/lib.dart';",
+        "",
+        "main() {",
+        "  foo();",
+        "}"]));
+    resolve(source);
+    assertNoErrors();
+    verify([source]);
+  }
   void test_indexExpression_typeParameters() {
     Source source = addSource(EngineTestCase.createSource([
         "f() {",
@@ -16313,6 +16671,10 @@
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_import_prefix);
       });
+      _ut.test('test_import_spaceInUri', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_import_spaceInUri);
+      });
       _ut.test('test_indexExpression_typeParameters', () {
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_indexExpression_typeParameters);
diff --git a/pkg/analyzer_experimental/test/generated/scanner_test.dart b/pkg/analyzer_experimental/test/generated/scanner_test.dart
index 55ee345..e3dbb64 100644
--- a/pkg/analyzer_experimental/test/generated/scanner_test.dart
+++ b/pkg/analyzer_experimental/test/generated/scanner_test.dart
@@ -1,9 +1,7 @@
 // This code was auto-generated, is not intended to be edited, and is subject to
 // significant change. Please see the README file for more information.
 library engine.scanner_test;
-import 'dart:collection';
 import 'package:analyzer_experimental/src/generated/java_core.dart';
-import 'package:analyzer_experimental/src/generated/java_engine.dart';
 import 'package:analyzer_experimental/src/generated/java_junit.dart';
 import 'package:analyzer_experimental/src/generated/source.dart';
 import 'package:analyzer_experimental/src/generated/error.dart';
@@ -2149,7 +2147,7 @@
   }
   Token scan(String source, GatheringErrorListener listener);
   void assertComment(TokenType commentType, String source) {
-    Token token = scan2(source);
+    Token token = scan2("${source}\n");
     JUnitTestCase.assertNotNull(token);
     JUnitTestCase.assertEquals(TokenType.EOF, token.type);
     Token comment = token.precedingComments;
diff --git a/pkg/analyzer_experimental/test/services/formatter_test.dart b/pkg/analyzer_experimental/test/services/formatter_test.dart
index 41e5379..b232cd1 100644
--- a/pkg/analyzer_experimental/test/services/formatter_test.dart
+++ b/pkg/analyzer_experimental/test/services/formatter_test.dart
@@ -4,9 +4,7 @@
 
 import 'package:unittest/unittest.dart';
 
-import 'package:analyzer_experimental/src/generated/ast.dart';
 import 'package:analyzer_experimental/src/generated/scanner.dart';
-import 'package:analyzer_experimental/src/services/formatter.dart';
 import 'package:analyzer_experimental/src/services/formatter_impl.dart';
 import 'package:analyzer_experimental/src/services/writer.dart';
 
@@ -57,6 +55,20 @@
         );
     });
 
+    test('CU w/class decl comment', () {
+      expectCUFormatsTo(
+          'import "foo";\n\n'
+          '//Killer class\n'
+          'class A {\n'
+          '}',
+          'import "foo";\n\n'
+          '//Killer class\n'
+          'class A {\n'
+          '}\n'
+        );
+    });
+
+
     test('CU (method indent)', () {
       expectCUFormatsTo(
           'class A {\n'
@@ -99,7 +111,7 @@
           'class A {\n'
           ' int x() { \n'
           'if (true) {return 42;\n'
-          '} else { return false; }\n'
+          '} else { return 13; }\n'
           '   }'
           '}',
           'class A {\n'
@@ -107,7 +119,7 @@
           '    if (true) {\n'
           '      return 42;\n'
           '    } else {\n'
-          '      return false;\n'
+          '      return 13;\n'
           '    }\n'
           '  }\n'
           '}\n'
@@ -131,15 +143,18 @@
       expectCUFormatsTo(
           'class A {\n'
           '}\n\n'
-          'class B {\n'
+          'class B {\n\n\n'
+          '  int b() => 42;\n\n'
+          '  int c() => b();\n\n'
           '}\n',
           'class A {\n'
           '}\n\n'
-          'class B {\n'
+          'class B {\n\n\n'
+          '  int b() => 42;\n\n'
+          '  int c() => b();\n\n'
           '}\n'
         );
     });
-    
 
     test('stmt', () {
       expectStmtFormatsTo(
@@ -168,7 +183,6 @@
         );
     });
 
-
     test('initialIndent', () {
       var formatter = new CodeFormatter(
           new FormatterOptions(initialIndentationLevel: 2));
@@ -210,6 +224,11 @@
       expect(line.toString(), equals('  foo'));
     });
 
+    test('isWhitespace', () {
+      var line = new Line(indent: 1);
+      expect(line.isWhitespace(), isTrue);
+    });
+
   });
 
 
@@ -231,6 +250,12 @@
       expect(writer.toString(), equals('foo\n'));
     });
 
+    test('newline trims whitespace', () {
+      var writer = new SourceWriter(indentCount:2);
+      writer.newline();
+      expect(writer.toString(), equals('\n'));
+    });
+
     test('basic print (with indents)', () {
       var writer = new SourceWriter();
       writer.print('foo');
diff --git a/pkg/analyzer_experimental/test/services/test_utils.dart b/pkg/analyzer_experimental/test/services/test_utils.dart
index 0f4433c..62b77159 100644
--- a/pkg/analyzer_experimental/test/services/test_utils.dart
+++ b/pkg/analyzer_experimental/test/services/test_utils.dart
@@ -4,8 +4,6 @@
 
 library test_utils;
 
-import 'dart:collection';
-
 import 'package:unittest/unittest.dart';
 
 import 'package:analyzer_experimental/src/generated/engine.dart' show AnalysisContext, AnalysisContextImpl;
diff --git a/pkg/barback/lib/barback.dart b/pkg/barback/lib/barback.dart
index 539d732..d10827f 100644
--- a/pkg/barback/lib/barback.dart
+++ b/pkg/barback/lib/barback.dart
@@ -7,6 +7,7 @@
 export 'src/asset.dart';
 export 'src/asset_id.dart';
 export 'src/barback.dart';
+export 'src/build_result.dart';
 export 'src/errors.dart';
 export 'src/package_provider.dart';
 export 'src/transform.dart' show Transform;
diff --git a/pkg/barback/lib/src/asset_cascade.dart b/pkg/barback/lib/src/asset_cascade.dart
index 40a615c..2ffe489 100644
--- a/pkg/barback/lib/src/asset_cascade.dart
+++ b/pkg/barback/lib/src/asset_cascade.dart
@@ -7,11 +7,10 @@
 import 'dart:async';
 import 'dart:collection';
 
-import 'package:stack_trace/stack_trace.dart';
-
 import 'asset.dart';
 import 'asset_id.dart';
 import 'asset_node.dart';
+import 'build_result.dart';
 import 'cancelable_future.dart';
 import 'errors.dart';
 import 'change_batch.dart';
@@ -24,7 +23,7 @@
 ///
 /// This keeps track of which [Transformer]s are applied to which assets, and
 /// re-runs those transformers when their dependencies change. The transformed
-/// assets are accessible via [getAssetById].
+/// asset nodes are accessible via [getAssetNode].
 ///
 /// A cascade consists of one or more [Phases], each of which has one or more
 /// [Transformer]s that run in parallel, potentially on the same inputs. The
@@ -37,7 +36,7 @@
 
   /// The [PackageGraph] that tracks all [AssetCascade]s for all dependencies of
   /// the current app.
-  final PackageGraph _graph;
+  final PackageGraph graph;
 
   /// The controllers for the [AssetNode]s that provide information about this
   /// cascade's package's source assets.
@@ -89,7 +88,7 @@
   /// It loads source assets within [package] using [provider] and then uses
   /// [transformerPhases] to generate output files from them.
   //TODO(rnystrom): Better way of specifying transformers and their ordering.
-  AssetCascade(this._graph, this.package,
+  AssetCascade(this.graph, this.package,
       Iterable<Iterable<Transformer>> transformerPhases) {
     // Flatten the phases to a list so we can traverse backwards to wire up
     // each phase to its next.
@@ -103,16 +102,20 @@
     for (var transformers in phases.reversed) {
       nextPhase = new Phase(this, _phases.length, transformers.toList(),
           nextPhase);
+      nextPhase.onDirty.listen((_) {
+        _newChanges = true;
+        _waitForProcess();
+      });
       _phases.insert(0, nextPhase);
     }
   }
 
   /// Gets the asset identified by [id].
   ///
-  /// If [id] is for a generated or transformed asset, this will wait until
-  /// it has been created and return it. If the asset cannot be found, throws
-  /// [AssetNotFoundException].
-  Future<Asset> getAssetById(AssetId id) {
+  /// If [id] is for a generated or transformed asset, this will wait until it
+  /// has been created and return it. If the asset cannot be found, returns
+  /// null.
+  Future<AssetNode> getAssetNode(AssetId id) {
     assert(id.package == package);
 
     // TODO(rnystrom): Waiting for the entire build to complete is unnecessary
@@ -127,17 +130,17 @@
       var node = _getAssetNode(id);
 
       // If the requested asset is available, we can just return it.
-      if (node != null) return node.asset;
+      if (node != null) return node;
 
       // If there's a build running, that build might generate the asset, so we
       // wait for it to complete and then try again.
       if (_processDone != null) {
-        return _processDone.then((_) => getAssetById(id));
+        return _processDone.then((_) => getAssetNode(id));
       }
 
       // If the asset hasn't been built and nothing is building now, the asset
-      // won't be generated, so we throw an error.
-      throw new AssetNotFoundException(id);
+      // won't be generated, so we return null.
+      return null;
     });
   }
 
@@ -165,8 +168,6 @@
   /// given source is already known, it is considered modified and all
   /// transforms that use it will be re-applied.
   void updateSources(Iterable<AssetId> sources) {
-    _newChanges = true;
-
     for (var id in sources) {
       var controller = _sourceControllerMap[id];
       if (controller != null) {
@@ -181,7 +182,7 @@
       if (_loadingSources.containsKey(id)) _loadingSources[id].cancel();
 
       _loadingSources[id] =
-          new CancelableFuture<Asset>(_graph.provider.getAsset(id));
+          new CancelableFuture<Asset>(graph.provider.getAsset(id));
       _loadingSources[id].whenComplete(() {
         _loadingSources.remove(id);
       }).then((asset) {
@@ -193,14 +194,10 @@
         _sourceControllerMap.remove(id).setRemoved();
       });
     }
-
-    _waitForProcess();
   }
 
   /// Removes [removed] from the graph's known set of source assets.
   void removeSources(Iterable<AssetId> removed) {
-    _newChanges = true;
-
     removed.forEach((id) {
       // If the source was being loaded, cancel that load.
       if (_loadingSources.containsKey(id)) _loadingSources.remove(id).cancel();
@@ -209,8 +206,6 @@
       // Don't choke if an id is double-removed for some reason.
       if (controller != null) controller.setRemoved();
     });
-
-    _waitForProcess();
   }
 
   void reportError(error) {
@@ -276,43 +271,3 @@
     });
   }
 }
-
-/// An event indicating that the cascade has finished building all assets.
-///
-/// A build can end either in success or failure. If there were no errors during
-/// the build, it's considered to be a success; any errors render it a failure,
-/// although individual assets may still have built successfully.
-class BuildResult {
-  /// All errors that occurred during the build.
-  final List errors;
-
-  /// `true` if the build succeeded.
-  bool get succeeded => errors.isEmpty;
-
-  BuildResult(Iterable errors)
-      : errors = errors.toList();
-
-  /// Creates a build result indicating a successful build.
-  ///
-  /// This equivalent to a build result with no errors.
-  BuildResult.success()
-      : this([]);
-
-  String toString() {
-    if (succeeded) return "success";
-
-    return "errors:\n" + errors.map((error) {
-      var stackTrace = getAttachedStackTrace(error);
-      if (stackTrace != null) stackTrace = new Trace.from(stackTrace);
-
-      var msg = new StringBuffer();
-      msg.write(prefixLines(error.toString()));
-      if (stackTrace != null) {
-        msg.write("\n\n");
-        msg.write("Stack trace:\n");
-        msg.write(prefixLines(stackTrace.toString()));
-      }
-      return msg.toString();
-    }).join("\n\n");
-  }
-}
diff --git a/pkg/barback/lib/src/barback.dart b/pkg/barback/lib/src/barback.dart
index 2797c1a..27c4d47 100644
--- a/pkg/barback/lib/src/barback.dart
+++ b/pkg/barback/lib/src/barback.dart
@@ -8,7 +8,8 @@
 
 import 'asset.dart';
 import 'asset_id.dart';
-import 'asset_cascade.dart';
+import 'build_result.dart';
+import 'errors.dart';
 import 'package_graph.dart';
 import 'package_provider.dart';
 
@@ -69,7 +70,12 @@
   /// If [id] is for a generated or transformed asset, this will wait until
   /// it has been created and return it. If the asset cannot be found, throws
   /// [AssetNotFoundException].
-  Future<Asset> getAssetById(AssetId id) => _graph.getAssetById(id);
+  Future<Asset> getAssetById(AssetId id) {
+    return _graph.getAssetNode(id).then((node) {
+      if (node == null) throw new AssetNotFoundException(id);
+      return node.whenAvailable;
+    });
+  }
 
   /// Adds [sources] to the graph's known set of source assets.
   ///
diff --git a/pkg/barback/lib/src/build_result.dart b/pkg/barback/lib/src/build_result.dart
new file mode 100644
index 0000000..32ee7c7
--- /dev/null
+++ b/pkg/barback/lib/src/build_result.dart
@@ -0,0 +1,51 @@
+// 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 barback.build_result;
+
+import 'dart:async';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import 'utils.dart';
+
+/// An event indicating that the cascade has finished building all assets.
+///
+/// A build can end either in success or failure. If there were no errors during
+/// the build, it's considered to be a success; any errors render it a failure,
+/// although individual assets may still have built successfully.
+class BuildResult {
+  /// All errors that occurred during the build.
+  final List errors;
+
+  /// `true` if the build succeeded.
+  bool get succeeded => errors.isEmpty;
+
+  BuildResult(Iterable errors)
+      : errors = errors.toList();
+
+  /// Creates a build result indicating a successful build.
+  ///
+  /// This equivalent to a build result with no errors.
+  BuildResult.success()
+      : this([]);
+
+  String toString() {
+    if (succeeded) return "success";
+
+    return "errors:\n" + errors.map((error) {
+      var stackTrace = getAttachedStackTrace(error);
+      if (stackTrace != null) stackTrace = new Trace.from(stackTrace);
+
+      var msg = new StringBuffer();
+      msg.write(prefixLines(error.toString()));
+      if (stackTrace != null) {
+        msg.write("\n\n");
+        msg.write("Stack trace:\n");
+        msg.write(prefixLines(stackTrace.toString()));
+      }
+      return msg.toString();
+    }).join("\n\n");
+  }
+}
diff --git a/pkg/barback/lib/src/package_graph.dart b/pkg/barback/lib/src/package_graph.dart
index 4dc2719..c85fdd7 100644
--- a/pkg/barback/lib/src/package_graph.dart
+++ b/pkg/barback/lib/src/package_graph.dart
@@ -11,6 +11,8 @@
 import 'asset.dart';
 import 'asset_cascade.dart';
 import 'asset_id.dart';
+import 'asset_node.dart';
+import 'build_result.dart';
 import 'errors.dart';
 import 'package_provider.dart';
 import 'utils.dart';
@@ -80,17 +82,15 @@
     _errors = mergeStreams(_cascades.values.map((cascade) => cascade.errors));
   }
 
-  /// Gets the asset identified by [id].
+  /// Gets the asset node identified by [id].
   ///
-  /// If [id] is for a generated or transformed asset, this will wait until
-  /// it has been created and return it. If the asset cannot be found, throws
-  /// [AssetNotFoundException].
-  Future<Asset> getAssetById(AssetId id) {
+  /// If [id] is for a generated or transformed asset, this will wait until it
+  /// has been created and return it. If the asset cannot be found, returns
+  /// null.
+  Future<AssetNode> getAssetNode(AssetId id) {
     var cascade = _cascades[id.package];
-    if (cascade != null) return cascade.getAssetById(id);
-    return new Future.error(
-        new AssetNotFoundException(id),
-        new Trace.current().vmTrace);
+    if (cascade != null) return cascade.getAssetNode(id);
+    return new Future.value(null);
   }
 
   /// Adds [sources] to the graph's known set of source assets.
diff --git a/pkg/barback/lib/src/phase.dart b/pkg/barback/lib/src/phase.dart
index 4d2afb4..82ec521 100644
--- a/pkg/barback/lib/src/phase.dart
+++ b/pkg/barback/lib/src/phase.dart
@@ -12,6 +12,7 @@
 import 'asset_node.dart';
 import 'asset_set.dart';
 import 'errors.dart';
+import 'stream_pool.dart';
 import 'transform_node.dart';
 import 'transformer.dart';
 import 'utils.dart';
@@ -44,7 +45,7 @@
   ///
   /// For the first phase, these will be the source assets. For all other
   /// phases, they will be the outputs from the previous phase.
-  final inputs = new Map<AssetId, AssetNode>();
+  final _inputs = new Map<AssetId, AssetNode>();
 
   /// The transforms currently applicable to assets in [inputs], indexed by
   /// the ids of their primary inputs.
@@ -73,12 +74,31 @@
   /// output.
   final _outputs = new Set<AssetId>();
 
+  /// A stream that emits an event whenever this phase becomes dirty and needs
+  /// to be run.
+  ///
+  /// This may emit events when the phase was already dirty or while processing
+  /// transforms. Events are emitted synchronously to ensure that the dirty
+  /// state is thoroughly propagated as soon as any assets are changed.
+  Stream get onDirty => _onDirtyPool.stream;
+  final _onDirtyPool = new StreamPool.broadcast();
+
+  /// A controller whose stream feeds into [_onDirtyPool].
+  ///
+  /// This is used whenever an input is added, changed, or removed. It's
+  /// sometimes redundant with the events collected from [_transforms], but this
+  /// stream is necessary for new and removed inputs, and the transform stream
+  /// is necessary for modified secondary inputs.
+  final _onDirtyController = new StreamController.broadcast(sync: true);
+
   /// The phase after this one.
   ///
   /// Outputs from this phase will be passed to it.
   final Phase _next;
 
-  Phase(this.cascade, this._index, this._transformers, this._next);
+  Phase(this.cascade, this._index, this._transformers, this._next) {
+    _onDirtyPool.add(_onDirtyController.stream);
+  }
 
   /// Adds a new asset as an input for this phase.
   ///
@@ -96,8 +116,8 @@
     // have to wait on [_adjustTransformers]. It's important that [inputs] is
     // always up-to-date so that the [AssetCascade] can look there for available
     // assets.
-    inputs[node.id] = node;
-    node.whenRemoved.then((_) => inputs.remove(node.id));
+    _inputs[node.id] = node;
+    node.whenRemoved.then((_) => _inputs.remove(node.id));
 
     if (!_adjustTransformersFutures.containsKey(node.id)) {
       _transforms[node.id] = new Set<TransformNode>();
@@ -146,7 +166,7 @@
   /// returned instead. This means that the return value is guaranteed to always
   /// be [AssetState.AVAILABLE].
   AssetNode getUnconsumedInput(AssetId id) {
-    if (!inputs.containsKey(id)) return null;
+    if (!_inputs.containsKey(id)) return null;
 
     // If the asset has transforms, it's not unconsumed.
     if (!_transforms[id].isEmpty) return null;
@@ -157,8 +177,20 @@
 
     // The asset should be available. If it were removed, it wouldn't be in
     // _inputs, and if it were dirty, it'd be in _adjustTransformersFutures.
-    assert(inputs[id].state.isAvailable);
-    return inputs[id];
+    assert(_inputs[id].state.isAvailable);
+    return _inputs[id];
+  }
+
+  /// Gets the asset node for an input [id].
+  ///
+  /// If an input with that ID cannot be found, returns null.
+  Future<AssetNode> getInput(AssetId id) {
+    return newFuture(() {
+      // TODO(rnystrom): Need to handle passthrough where an asset from a
+      // previous phase can be found.
+      if (id.package == cascade.package) return _inputs[id];
+      return cascade.graph.getAssetNode(id);
+    });
   }
 
   /// Asynchronously determines which transformers can consume [node] as a
@@ -168,6 +200,11 @@
   /// time it takes to adjust its transformers, they're appropriately
   /// re-adjusted. Its progress can be tracked in [_adjustTransformersFutures].
   void _adjustTransformers(AssetNode node) {
+    // Mark the phase as dirty. This may not actually end up creating any new
+    // transforms, but we want adding or removing a source asset to consistently
+    // kick off a build, even if that build does nothing.
+    _onDirtyController.add(null);
+
     // Once the input is available, hook up transformers for it. If it changes
     // while that's happening, try again.
     _adjustTransformersFutures[node.id] = node.tryUntilStable((asset) {
@@ -182,6 +219,7 @@
       // future.
       node.onStateChange.first.then((state) {
         if (state.isRemoved) {
+          _onDirtyController.add(null);
           _transforms.remove(node.id);
         } else {
           _adjustTransformers(node);
@@ -214,6 +252,7 @@
       return transform.transformer.isPrimary(asset).then((isPrimary) {
         if (isPrimary) return;
         _transforms[asset.id].remove(transform);
+        _onDirtyPool.remove(transform.onDirty);
         transform.remove();
       });
     }));
@@ -240,7 +279,9 @@
       // results.
       return transformer.isPrimary(node.asset).then((isPrimary) {
         if (!isPrimary) return;
-        _transforms[node.id].add(new TransformNode(this, transformer, node));
+        var transform = new TransformNode(this, transformer, node);
+        _transforms[node.id].add(transform);
+        _onDirtyPool.add(transform.onDirty);
       });
     }));
   }
diff --git a/pkg/barback/lib/src/stream_pool.dart b/pkg/barback/lib/src/stream_pool.dart
new file mode 100644
index 0000000..da5c715
--- /dev/null
+++ b/pkg/barback/lib/src/stream_pool.dart
@@ -0,0 +1,66 @@
+// 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 barback.stream_pool;
+
+import 'dart:async';
+
+/// A pool of streams whose events are unified and emitted through a central
+/// stream.
+class StreamPool<T> {
+  /// The stream through which all events from streams in the pool are emitted.
+  Stream<T> get stream => _controller.stream;
+  final StreamController<T> _controller;
+
+  /// Subscriptions to the streams that make up the pool.
+  final _subscriptions = new Map<Stream<T>, StreamSubscription<T>>();
+
+  /// Creates a new stream pool that only supports a single subscriber.
+  ///
+  /// Any events from broadcast streams in the pool will be buffered until a
+  /// listener is subscribed.
+  StreamPool()
+      // Create the controller as sync so that any sync input streams will be
+      // forwarded synchronously. Async input streams will have their asynchrony
+      // preserved, since _controller.add will be called asynchronously.
+      : _controller = new StreamController<T>(sync: true);
+
+  /// Creates a new stream pool where [stream] can be listened to more than
+  /// once.
+  ///
+  /// Any events from buffered streams in the pool will be emitted immediately,
+  /// regardless of whether [stream] has any subscribers.
+  StreamPool.broadcast()
+      // Create the controller as sync so that any sync input streams will be
+      // forwarded synchronously. Async input streams will have their asynchrony
+      // preserved, since _controller.add will be called asynchronously.
+      : _controller = new StreamController<T>.broadcast(sync: true);
+
+  /// Adds [stream] as a member of this pool.
+  ///
+  /// Any events from [stream] will be emitted through [this.stream]. If
+  /// [stream] is sync, they'll be emitted synchronously; if [stream] is async,
+  /// they'll be emitted asynchronously.
+  void add(Stream<T> stream) {
+    if (_subscriptions.containsKey(stream)) return;
+    _subscriptions[stream] = stream.listen(_controller.add,
+        onError: _controller.addError,
+        onDone: () => remove(stream));
+  }
+
+  /// Removes [stream] as a member of this pool.
+  void remove(Stream<T> stream) {
+    var subscription = _subscriptions.remove(stream);
+    if (subscription != null) subscription.cancel();
+  }
+
+  /// Removes all streams from this pool and closes [stream].
+  void close() {
+    for (var subscription in _subscriptions.values) {
+      subscription.cancel();
+    }
+    _subscriptions.clear();
+    _controller.close();
+  }
+}
diff --git a/pkg/barback/lib/src/transform.dart b/pkg/barback/lib/src/transform.dart
index 77800db..d61e15c 100644
--- a/pkg/barback/lib/src/transform.dart
+++ b/pkg/barback/lib/src/transform.dart
@@ -50,7 +50,7 @@
 
   Transform._(this._node, this._outputs);
 
-  /// Gets the asset for for an input [id].
+  /// Gets the asset for an input [id].
   ///
   /// If an input with that ID cannot be found, throws an
   /// [AssetNotFoundException].
diff --git a/pkg/barback/lib/src/transform_node.dart b/pkg/barback/lib/src/transform_node.dart
index 863bac5..a7241ae 100644
--- a/pkg/barback/lib/src/transform_node.dart
+++ b/pkg/barback/lib/src/transform_node.dart
@@ -45,6 +45,15 @@
   /// The controllers for the asset nodes emitted by this node.
   var _outputControllers = new Map<AssetId, AssetNodeController>();
 
+  /// A stream that emits an event whenever this transform becomes dirty and
+  /// needs to be re-run.
+  ///
+  /// This may emit events when the transform was already dirty or while
+  /// processing transforms. Events are emitted synchronously to ensure that the
+  /// dirty state is thoroughly propagated as soon as any assets are changed.
+  Stream get onDirty => _onDirtyController.stream;
+  final _onDirtyController = new StreamController.broadcast(sync: true);
+
   TransformNode(this.phase, this.transformer, this.primary) {
     _primarySubscription = primary.onStateChange.listen((state) {
       if (state.isRemoved) {
@@ -63,6 +72,7 @@
   /// valid even if its primary input still exists.
   void remove() {
     _isDirty = true;
+    _onDirtyController.close();
     _primarySubscription.cancel();
     for (var subscription in _inputSubscriptions.values) {
       subscription.cancel();
@@ -80,6 +90,7 @@
     for (var controller in _outputControllers.values) {
       controller.setDirty();
     }
+    _onDirtyController.add(null);
   }
 
   /// Applies this transform.
@@ -116,12 +127,12 @@
     });
   }
 
+  /// Gets the asset for an input [id].
+  ///
+  /// If an input with that ID cannot be found, throws an
+  /// [AssetNotFoundException].
   Future<Asset> getInput(AssetId id) {
-    return newFuture(() {
-      var node = phase.inputs[id];
-      // TODO(rnystrom): Need to handle passthrough where an asset from a
-      // previous phase can be found.
-
+    return phase.getInput(id).then((node) {
       // Throw if the input isn't found. This ensures the transformer's apply
       // is exited. We'll then catch this and report it through the proper
       // results stream.
diff --git a/pkg/barback/test/package_graph/transform_test.dart b/pkg/barback/test/package_graph/transform_test.dart
index 670848a..c413528 100644
--- a/pkg/barback/test/package_graph/transform_test.dart
+++ b/pkg/barback/test/package_graph/transform_test.dart
@@ -894,4 +894,123 @@
     resumeProvider();
     buildShouldSucceed();
   });
+
+  group('cross-package transforms', () {
+    test("can access other packages' source assets", () {
+      initGraph({
+        "pkg1|a.txt": "pkg2|a.inc",
+        "pkg2|a.inc": "a"
+      }, {"pkg1": [[new ManyToOneTransformer("txt")]]});
+
+      updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+      expectAsset("pkg1|a.out", "a");
+      buildShouldSucceed();
+    });
+
+    test("can access other packages' transformed assets", () {
+      initGraph({
+        "pkg1|a.txt": "pkg2|a.inc",
+        "pkg2|a.txt": "a"
+      }, {
+        "pkg1": [[new ManyToOneTransformer("txt")]],
+        "pkg2": [[new RewriteTransformer("txt", "inc")]]
+      });
+
+      updateSources(["pkg1|a.txt", "pkg2|a.txt"]);
+      expectAsset("pkg1|a.out", "a.inc");
+      buildShouldSucceed();
+    });
+
+    test("re-runs a transform when an input from another package changes", () {
+      initGraph({
+        "pkg1|a.txt": "pkg2|a.inc",
+        "pkg2|a.inc": "a"
+      }, {
+        "pkg1": [[new ManyToOneTransformer("txt")]]
+      });
+
+      updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+      expectAsset("pkg1|a.out", "a");
+      buildShouldSucceed();
+
+      modifyAsset("pkg2|a.inc", "new a");
+      schedule(() => updateSources(["pkg2|a.inc"]));
+      expectAsset("pkg1|a.out", "new a");
+      buildShouldSucceed();
+    });
+
+    test("re-runs a transform when a transformed input from another package "
+        "changes", () {
+      initGraph({
+        "pkg1|a.txt": "pkg2|a.inc",
+        "pkg2|a.txt": "a"
+      }, {
+        "pkg1": [[new ManyToOneTransformer("txt")]],
+        "pkg2": [[new RewriteTransformer("txt", "inc")]]
+      });
+
+      updateSources(["pkg1|a.txt", "pkg2|a.txt"]);
+      expectAsset("pkg1|a.out", "a.inc");
+      buildShouldSucceed();
+
+      modifyAsset("pkg2|a.txt", "new a");
+      schedule(() => updateSources(["pkg2|a.txt"]));
+      expectAsset("pkg1|a.out", "new a.inc");
+      buildShouldSucceed();
+    });
+
+    test("runs a transform that's added because of a change in another package",
+        () {
+      initGraph({
+        "pkg1|a.txt": "pkg2|a.inc",
+        "pkg2|a.inc": "b"
+      }, {
+        "pkg1": [
+          [new ManyToOneTransformer("txt")],
+          [new OneToManyTransformer("out")],
+          [new RewriteTransformer("md", "done")]
+        ],
+      });
+
+      // pkg1|a.txt generates outputs based on the contents of pkg2|a.inc. At
+      // first pkg2|a.inc only includes "b", which is not transformed. Then
+      // pkg2|a.inc is updated to include "b,c.md". pkg1|c.md triggers the
+      // md->done rewrite transformer, producing pkg1|c.done.
+
+      updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+      expectAsset("pkg1|b", "spread out");
+      buildShouldSucceed();
+
+      modifyAsset("pkg2|a.inc", "b,c.md");
+      schedule(() => updateSources(["pkg2|a.inc"]));
+      expectAsset("pkg1|b", "spread out");
+      expectAsset("pkg1|c.done", "spread out.done");
+      buildShouldSucceed();
+    });
+
+    test("doesn't run a transform that's removed because of a change in "
+        "another package", () {
+      initGraph({
+        "pkg1|a.txt": "pkg2|a.inc",
+        "pkg2|a.inc": "b,c.md"
+      }, {
+        "pkg1": [
+          [new ManyToOneTransformer("txt")],
+          [new OneToManyTransformer("out")],
+          [new RewriteTransformer("md", "done")]
+        ],
+      });
+
+      updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+      expectAsset("pkg1|b", "spread out");
+      expectAsset("pkg1|c.done", "spread out.done");
+      buildShouldSucceed();
+
+      modifyAsset("pkg2|a.inc", "b");
+      schedule(() => updateSources(["pkg2|a.inc"]));
+      expectAsset("pkg1|b", "spread out");
+      expectNoAsset("pkg1|c.done");
+      buildShouldSucceed();
+    });
+  });
 }
diff --git a/pkg/barback/test/stream_pool_test.dart b/pkg/barback/test/stream_pool_test.dart
new file mode 100644
index 0000000..d701329
--- /dev/null
+++ b/pkg/barback/test/stream_pool_test.dart
@@ -0,0 +1,216 @@
+// 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 barback.test.stream_pool_test;
+
+import 'dart:async';
+
+import 'package:barback/src/stream_pool.dart';
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  group("buffered", () {
+    test("buffers events from multiple inputs", () {
+      var pool = new StreamPool<String>();
+
+      var controller1 = new StreamController<String>();
+      pool.add(controller1.stream);
+      controller1.add("first");
+
+      var controller2 = new StreamController<String>();
+      pool.add(controller2.stream);
+      controller2.add("second");
+
+      // Call [toList] asynchronously to be sure that the events have been
+      // buffered beforehand and aren't just being received unbuffered.
+      expect(newFuture(() => pool.stream.toList()),
+          completion(equals(["first", "second"])));
+
+      pumpEventQueue().then((_) => pool.close());
+    });
+
+    test("buffers errors from multiple inputs", () {
+      var pool = new StreamPool<String>();
+
+      var controller1 = new StreamController<String>();
+      pool.add(controller1.stream);
+      controller1.add("first");
+
+      var controller2 = new StreamController<String>();
+      pool.add(controller2.stream);
+      controller2.add("second");
+      controller1.addError("third");
+      controller2.addError("fourth");
+      controller1.add("fifth");
+
+      expect(newFuture(() {
+        return pool.stream.transform(new StreamTransformer(
+            handleData: (data, sink) => sink.add(["data", data]),
+            handleError: (error, sink) => sink.add(["error", error]))).toList();
+      }), completion(equals([
+        ["data", "first"],
+        ["data", "second"],
+        ["error", "third"],
+        ["error", "fourth"],
+        ["data", "fifth"]
+      ])));
+
+      pumpEventQueue().then((_) => pool.close());
+    });
+
+    test("buffers inputs from a broadcast stream", () {
+      var pool = new StreamPool<String>();
+      var controller = new StreamController<String>.broadcast();
+      pool.add(controller.stream);
+      controller.add("first");
+      controller.add("second");
+
+      // Call [toList] asynchronously to be sure that the events have been
+      // buffered beforehand and aren't just being received unbuffered.
+      expect(newFuture(() => pool.stream.toList()),
+          completion(equals(["first", "second"])));
+
+      pumpEventQueue().then((_) => pool.close());
+    });
+  });
+
+  group("broadcast", () {
+    test("doesn't buffer inputs", () {
+      var pool = new StreamPool<String>.broadcast();
+
+      var controller1 = new StreamController<String>.broadcast();
+      pool.add(controller1.stream);
+      controller1.add("first");
+
+      var controller2 = new StreamController<String>.broadcast();
+      pool.add(controller2.stream);
+      controller2.add("second");
+
+      // Call [toList] asynchronously to be sure that the events have been
+      // buffered beforehand and aren't just being received unbuffered.
+      expect(newFuture(() => pool.stream.toList()), completion(isEmpty));
+
+      pumpEventQueue().then((_) => pool.close());
+    });
+
+    test("doesn't buffer errors", () {
+      var pool = new StreamPool<String>.broadcast();
+
+      var controller1 = new StreamController<String>.broadcast();
+      pool.add(controller1.stream);
+      controller1.addError("first");
+
+      var controller2 = new StreamController<String>.broadcast();
+      pool.add(controller2.stream);
+      controller2.addError("second");
+
+      expect(newFuture(() {
+        return pool.stream.transform(new StreamTransformer(
+            handleData: (data, sink) => sink.add(data),
+            handleError: (error, sink) => sink.add(error))).toList();
+      }), completion(isEmpty));
+
+      pumpEventQueue().then((_) => pool.close());
+    });
+
+    test("doesn't buffer inputs from a buffered stream", () {
+      var pool = new StreamPool<String>.broadcast();
+      var controller = new StreamController<String>();
+      pool.add(controller.stream);
+      controller.add("first");
+      controller.add("second");
+
+      expect(pumpEventQueue().then((_) => pool.stream.toList()),
+          completion(isEmpty));
+
+      pumpEventQueue().then((_) => pool.close());
+    });
+  });
+
+  for (var type in ["buffered", "broadcast"]) {
+    group(type, () {
+      var pool;
+      var bufferedController;
+      var bufferedStream;
+      var bufferedSyncController;
+      var broadcastController;
+      var broadcastStream;
+      var broadcastSyncController;
+
+      setUp(() {
+        if (type == "buffered") {
+          pool = new StreamPool<String>();
+        } else {
+          pool = new StreamPool<String>.broadcast();
+        }
+
+        bufferedController = new StreamController<String>();
+        pool.add(bufferedController.stream);
+
+        bufferedSyncController = new StreamController<String>(sync: true);
+        pool.add(bufferedSyncController.stream);
+
+        broadcastController = new StreamController<String>.broadcast();
+        pool.add(broadcastController.stream);
+
+        broadcastSyncController =
+          new StreamController<String>.broadcast(sync: true);
+        pool.add(broadcastSyncController.stream);
+      });
+
+      test("emits events to a listener", () {
+        expect(pool.stream.toList(), completion(equals(["first", "second"])));
+
+        bufferedController.add("first");
+        broadcastController.add("second");
+        pumpEventQueue().then((_) => pool.close());
+      });
+
+      test("emits sync events synchronously", () {
+        var events = [];
+        pool.stream.listen(events.add);
+
+        bufferedSyncController.add("first");
+        expect(events, equals(["first"]));
+
+        broadcastSyncController.add("second");
+        expect(events, equals(["first", "second"]));
+      });
+
+      test("emits async events asynchronously", () {
+        var events = [];
+        pool.stream.listen(events.add);
+
+        bufferedController.add("first");
+        broadcastController.add("second");
+        expect(events, isEmpty);
+
+        expect(pumpEventQueue().then((_) => events),
+            completion(equals(["first", "second"])));
+      });
+
+      test("doesn't emit events from removed streams", () {
+        expect(pool.stream.toList(), completion(equals(["first", "third"])));
+
+        bufferedController.add("first");
+        expect(pumpEventQueue().then((_) {
+          pool.remove(bufferedController.stream);
+          bufferedController.add("second");
+        }).then((_) {
+          broadcastController.add("third");
+          return pumpEventQueue();
+        }).then((_) {
+          pool.remove(broadcastController.stream);
+          broadcastController.add("fourth");
+          pool.close();
+        }), completes);
+      });
+    });
+  }
+}
diff --git a/pkg/barback/test/transformer/many_to_one.dart b/pkg/barback/test/transformer/many_to_one.dart
index efaf3c47..45f8f25 100644
--- a/pkg/barback/test/transformer/many_to_one.dart
+++ b/pkg/barback/test/transformer/many_to_one.dart
@@ -33,7 +33,12 @@
         .then((contents) {
       // Get all of the included inputs.
       return Future.wait(contents.split(",").map((path) {
-        var id = new AssetId(transform.primaryId.package, path);
+        var id;
+        if (path.contains("|")) {
+          id = new AssetId.parse(path);
+        } else {
+          id = new AssetId(transform.primaryId.package, path);
+        }
         return getInput(transform, id).then((input) => input.readAsString());
       }));
     }).then((outputs) {
diff --git a/pkg/barback/test/utils.dart b/pkg/barback/test/utils.dart
index ab41a59..57d9c43 100644
--- a/pkg/barback/test/utils.dart
+++ b/pkg/barback/test/utils.dart
@@ -9,10 +9,8 @@
 import 'dart:io';
 
 import 'package:barback/barback.dart';
-import 'package:barback/src/asset_cascade.dart';
 import 'package:barback/src/asset_set.dart';
 import 'package:barback/src/cancelable_future.dart';
-import 'package:barback/src/package_graph.dart';
 import 'package:barback/src/utils.dart';
 import 'package:path/path.dart' as pathos;
 import 'package:scheduled_test/scheduled_test.dart';
@@ -30,11 +28,11 @@
 var _configured = false;
 
 MockProvider _provider;
-PackageGraph _graph;
+Barback _barback;
 
 /// Calls to [buildShouldSucceed] and [buildShouldFail] set expectations on
-/// successive [BuildResult]s from [_graph]. This keeps track of how many calls
-/// have already been made so later calls know which result to look for.
+/// successive [BuildResult]s from [_barback]. This keeps track of how many
+/// calls have already been made so later calls know which result to look for.
 int _nextBuildResult;
 
 void initConfig() {
@@ -64,7 +62,7 @@
   if (transformers == null) transformers = {};
 
   _provider = new MockProvider(assets, transformers);
-  _graph = new PackageGraph(_provider);
+  _barback = new Barback(_provider);
   _nextBuildResult = 0;
 }
 
@@ -79,7 +77,7 @@
     return asset;
   });
 
-  _graph.updateSources(assets);
+  _barback.updateSources(assets);
 }
 
 /// Removes [assets] from the current [PackageProvider].
@@ -93,7 +91,7 @@
     return asset;
   });
 
-  _graph.removeSources(assets);
+  _barback.removeSources(assets);
 }
 
 /// Schedules a change to the contents of an asset identified by [name] to
@@ -138,7 +136,7 @@
 /// after this.
 void buildShouldNotBeDone() {
   _futureShouldNotCompleteUntil(
-      _graph.results.elementAt(_nextBuildResult),
+      _barback.results.elementAt(_nextBuildResult),
       schedule(() => pumpEventQueue(), "build should not terminate"),
       "build");
 }
@@ -167,14 +165,14 @@
 }
 
 Future<BuildResult> _getNextBuildResult() =>
-  _graph.results.elementAt(_nextBuildResult++);
+  _barback.results.elementAt(_nextBuildResult++);
 
 /// Pauses the schedule until the currently running build completes.
 ///
 /// Validates that the build completed successfully.
 void waitForBuild() {
   schedule(() {
-    return _graph.results.first.then((result) {
+    return _barback.results.first.then((result) {
       expect(result.succeeded, isTrue);
     });
   }, "wait for build");
@@ -193,7 +191,7 @@
   }
 
   schedule(() {
-    return _graph.getAssetById(id).then((asset) {
+    return _barback.getAssetById(id).then((asset) {
       // TODO(rnystrom): Make an actual Matcher class for this.
       expect(asset.id, equals(id));
       expect(asset.readAsString(), completion(equals(contents)));
@@ -208,7 +206,7 @@
 
   // Make sure the future gets the error.
   schedule(() {
-    return _graph.getAssetById(id).then((asset) {
+    return _barback.getAssetById(id).then((asset) {
       fail("Should have thrown error but got $asset.");
     }).catchError((error) {
       expect(error, new isInstanceOf<AssetNotFoundException>());
@@ -224,7 +222,7 @@
 
   schedule(() {
     return _futureShouldNotCompleteUntil(
-        _graph.getAssetById(id),
+        _barback.getAssetById(id),
         pumpEventQueue(),
         "asset $id");
   }, "asset $id should not complete");
diff --git a/pkg/custom_element/lib/custom_element.dart b/pkg/custom_element/lib/custom_element.dart
index 50cc1a6..aa540e5 100644
--- a/pkg/custom_element/lib/custom_element.dart
+++ b/pkg/custom_element/lib/custom_element.dart
@@ -591,6 +591,8 @@
   Stream<KeyboardEvent> get onKeyUp => host.onKeyUp;
   Stream<Event> get onLoad => host.onLoad;
   Stream<MouseEvent> get onMouseDown => host.onMouseDown;
+  Stream<MouseEvent> get onMouseEnter => host.onMouseEnter;
+  Stream<MouseEvent> get onMouseLeave => host.onMouseLeave;
   Stream<MouseEvent> get onMouseMove => host.onMouseMove;
   Stream<Event> get onFullscreenChange => host.onFullscreenChange;
   Stream<Event> get onFullscreenError => host.onFullscreenError;
diff --git a/pkg/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
index 8a182b0..b960db7 100644
--- a/pkg/docgen/lib/docgen.dart
+++ b/pkg/docgen/lib/docgen.dart
@@ -30,7 +30,6 @@
 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart'
     as dart2js;
 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';
 import '../../../sdk/lib/_internal/libraries.dart';
 
@@ -47,14 +46,18 @@
 /// Current member being documented to be used for comment links.
 MemberMirror _currentMember;
 
+/// Support for [:foo:]-style code comments to the markdown parser.
+List<markdown.InlineSyntax> markdownSyntaxes =
+  [new markdown.CodeSyntax(r'\[:\s?((?:.|\n)*?)\s?:\]')];
+
 /// Resolves reference links in doc comments.
 markdown.Resolver linkResolver;
 
-/// Index of all indexable items. This also ensures that no class is 
-/// created more than once. 
+/// Index of all indexable items. This also ensures that no class is
+/// created more than once.
 Map<String, Indexable> entityMap = new Map<String, Indexable>();
 
-/// This is set from the command line arguments flag --include-private 
+/// This is set from the command line arguments flag --include-private
 bool _includePrivate = false;
 
 /**
@@ -77,7 +80,7 @@
     var dir = new Directory('docs');
     if (dir.existsSync()) dir.deleteSync(recursive: true);
   }
-  
+
   if (packageRoot == null && !parseSdk) {
     var type = FileSystemEntity.typeSync(files.first);
     if (type == FileSystemEntityType.DIRECTORY) {
@@ -97,8 +100,8 @@
       if (mirrorSystem.libraries.isEmpty) {
         throw new StateError('No library mirrors were created.');
       }
-      _documentLibraries(mirrorSystem.libraries.values,
-          includeSdk: includeSdk, outputToYaml: outputToYaml, append: append);
+      _documentLibraries(mirrorSystem.libraries.values,includeSdk: includeSdk,
+          outputToYaml: outputToYaml, append: append, parseSdk: parseSdk);
 
       return true;
     });
@@ -124,7 +127,7 @@
   // containing '/packages' will be added. The only exception is if the file to
   // analyze already has a '/package' in its path.
   return files.where((f) => f.endsWith('.dart') &&
-      (!f.contains('${path.separator}packages') || 
+      (!f.contains('${path.separator}packages') ||
           args.contains('${path.separator}packages'))).toList()
       ..forEach((lib) => logger.info('Added to libraries: $lib'));
 }
@@ -178,7 +181,7 @@
   Uri libraryUri = new Uri(scheme: 'file', path: appendSlash(libraryRoot));
   Uri packageUri = null;
   if (packageRoot != null) {
-    packageUri = new Uri(scheme: 'file', path: appendSlash(packageRoot)); 
+    packageUri = new Uri(scheme: 'file', path: appendSlash(packageRoot));
   }
   List<Uri> librariesUri = <Uri>[];
   libraries.forEach((library) {
@@ -200,8 +203,8 @@
 /**
  * Creates documentation for filtered libraries.
  */
-void _documentLibraries(List<LibraryMirror> libs,
-    {bool includeSdk: false, bool outputToYaml: true, bool append: false}) {
+void _documentLibraries(List<LibraryMirror> libs, {bool includeSdk: false,
+    bool outputToYaml: true, bool append: false, bool parseSdk: false}) {
   libs.forEach((lib) {
     // Files belonging to the SDK have a uri that begins with 'dart:'.
     if (includeSdk || !lib.uri.toString().startsWith('dart:')) {
@@ -210,12 +213,12 @@
     }
   });
   // After everything is created, do a pass through all classes to make sure no
-  // intermediate classes created by mixins are included. 
+  // intermediate classes created by mixins are included.
   entityMap.values.where((e) => e is Class).forEach((c) => c.makeValid());
   // Everything is a subclass of Object, therefore empty the list to avoid a
-  // giant list of subclasses to be printed out. 
-  entityMap['dart.core.Object'].subclasses.clear();
-  
+  // giant list of subclasses to be printed out.
+  if (parseSdk) entityMap['dart.core.Object'].subclasses.clear();
+
   var filteredEntities = entityMap.values.where(_isVisible);
   // Output libraries and classes to file after all information is generated.
   filteredEntities.where((e) => e is Class || e is Library).forEach((output) {
@@ -225,11 +228,11 @@
   // the libraries. This will help the viewer know what libraries are available
   // to read in.
   _writeToFile(filteredEntities.where((e) => e is Library)
-      .map((e) => e.qualifiedName).join('\n'), 'library_list.txt', 
+      .map((e) => e.qualifiedName).join('\n'), 'library_list.txt',
       append: append);
   // Outputs all the qualified names documented. This will help generate search
-  // results. 
-  _writeToFile(filteredEntities.map((e) => e.qualifiedName).join('\n'), 
+  // results.
+  _writeToFile(filteredEntities.map((e) => e.qualifiedName).join('\n'),
       'index.txt', append: append);
 }
 
@@ -238,7 +241,7 @@
   var result = new Library(library.qualifiedName, _commentToHtml(library),
       _variables(library.variables),
       _methods(library.functions),
-      _classes(library.classes), _isPrivate(library));
+      _classes(library.classes), _isHidden(library));
   logger.fine('Generated library for ${result.name}');
   return result;
 }
@@ -252,13 +255,13 @@
 }
 
 /**
- * Returns true if a library name starts with an underscore, and false 
+ * Returns true if a library name starts with an underscore, and false
  * otherwise.
- * 
+ *
  * An example that starts with _ is _js_helper.
  * An example that contains ._ is dart._collection.dev
  */
-// This is because LibraryMirror.isPrivate returns `false` all the time. 
+// This is because LibraryMirror.isPrivate returns `false` all the time.
 bool _isLibraryPrivate(LibraryMirror mirror) {
   if (mirror.simpleName.startsWith('_') || mirror.simpleName.contains('._')) {
     return true;
@@ -267,15 +270,16 @@
 }
 
 /**
- * A declaration is private if itself is private, or the owner is private. 
+ * A declaration is private if itself is private, or the owner is private.
  */
-bool _isPrivate(DeclarationMirror mirror) {
+// Issue(12202) - A declaration is public even if it's owner is private.
+bool _isHidden(DeclarationMirror mirror) {
   if (mirror is LibraryMirror) {
     return _isLibraryPrivate(mirror);
   } else if (mirror.owner is LibraryMirror) {
     return (mirror.isPrivate || _isLibraryPrivate(mirror.owner));
-  } else { 
-    return (mirror.isPrivate || _isPrivate(mirror.owner));
+  } else {
+    return (mirror.isPrivate || _isHidden(mirror.owner));
   }
 }
 
@@ -287,9 +291,19 @@
  * Returns a list of meta annotations assocated with a mirror.
  */
 List<String> _annotations(DeclarationMirror mirror) {
-  var annotations = mirror.metadata.where((e) =>
+  var annotationMirrors = mirror.metadata.where((e) =>
       e is dart2js.Dart2JsConstructedConstantMirror);
-  return annotations.map((e) => e.type.qualifiedName).toList();
+  var annotations = [];
+  annotationMirrors.forEach((annotation) {
+    var parameterList = annotation.type.variables.values
+      .where((e) => e.isFinal)
+      .map((e) => annotation.getField(e.simpleName).reflectee)
+      .where((e) => e != null)
+      .toList();
+    annotations.add(new Annotation(annotation.type.qualifiedName,
+        parameterList));
+  });
+  return annotations;
 }
 
 /**
@@ -310,9 +324,10 @@
       }
     }
   });
-  
-  commentText = commentText == null ? '' : 
-      markdown.markdownToHtml(commentText.trim(), linkResolver: linkResolver);
+
+  commentText = commentText == null ? '' :
+      markdown.markdownToHtml(commentText.trim(), linkResolver: linkResolver,
+          inlineSyntaxes: markdownSyntaxes);
   return commentText;
 }
 
@@ -324,11 +339,18 @@
   var reference;
   var memberScope = currentMember == null ?
       null : currentMember.lookupInScope(name);
-  if (memberScope != null) reference = memberScope.qualifiedName;
-  else {
+  if (memberScope != null) {
+    reference = memberScope.qualifiedName;
+  } else {
     var classScope = currentClass == null ?
         null : currentClass.lookupInScope(name);
-    reference = classScope != null ? classScope.qualifiedName : name;
+    if (classScope != null) {
+      reference = classScope.qualifiedName;
+    } else {
+      var libraryScope = currentLibrary == null ?
+          null : currentLibrary.lookupInScope(name);
+      reference = libraryScope != null ? libraryScope.qualifiedName : name;
+    }
   }
   return new markdown.Element.text('a', reference);
 }
@@ -342,11 +364,11 @@
   // a filter. Issue(#9590).
   mirrorMap.forEach((String mirrorName, VariableMirror mirror) {
     _currentMember = mirror;
-    if (_includePrivate || !_isPrivate(mirror)) {
+    if (_includePrivate || !_isHidden(mirror)) {
       entityMap[mirror.qualifiedName] = new Variable(mirrorName, mirror.isFinal,
          mirror.isStatic, mirror.isConst, _type(mirror.type),
          _commentToHtml(mirror), _annotations(mirror), mirror.qualifiedName,
-         _isPrivate(mirror), mirror.owner.qualifiedName);
+         _isHidden(mirror), mirror.owner.qualifiedName);
       data[mirrorName] = entityMap[mirror.qualifiedName];
     }
   });
@@ -359,28 +381,34 @@
 MethodGroup _methods(Map<String, MethodMirror> mirrorMap) {
   var group = new MethodGroup();
   mirrorMap.forEach((String mirrorName, MethodMirror mirror) {
-    if (_includePrivate || !_isPrivate(mirror)) {
+    if (_includePrivate || !_isHidden(mirror)) {
       group.addMethod(mirror);
     }
   });
   return group;
-} 
+}
 
 /**
- * Returns the [Class] for the given [mirror] has already been created, and if 
+ * Returns the [Class] for the given [mirror] has already been created, and if
  * it does not exist, creates it.
  */
 Class _class(ClassMirror mirror) {
   var clazz = entityMap[mirror.qualifiedName];
   if (clazz == null) {
-    var superclass = mirror.superclass != null ? 
+    var superclass = mirror.superclass != null ?
         _class(mirror.superclass) : null;
-    var interfaces = 
+    var interfaces =
         mirror.superinterfaces.map((interface) => _class(interface));
-    clazz = new Class(mirror.simpleName, superclass, _commentToHtml(mirror), 
+    clazz = new Class(mirror.simpleName, superclass, _commentToHtml(mirror),
         interfaces.toList(), _variables(mirror.variables),
-        _methods(mirror.methods), _annotations(mirror), _generics(mirror), 
-        mirror.qualifiedName, _isPrivate(mirror), mirror.owner.qualifiedName);
+        _methods(mirror.methods), _annotations(mirror), _generics(mirror),
+        mirror.qualifiedName, _isHidden(mirror), mirror.owner.qualifiedName,
+        mirror.isAbstract);
+    if (superclass != null)
+      clazz.addInherited(superclass);
+    interfaces.forEach((interface) {
+      clazz.addInherited(interface);
+    });
     entityMap[mirror.qualifiedName] = clazz;
   }
   return clazz;
@@ -391,7 +419,7 @@
  */
 ClassGroup _classes(Map<String, ClassMirror> mirrorMap) {
   var group = new ClassGroup();
-  mirrorMap.forEach((String mirrorName, ClassMirror mirror) {    
+  mirrorMap.forEach((String mirrorName, ClassMirror mirror) {
       group.addClass(mirror);
   });
   return group;
@@ -404,33 +432,33 @@
   var data = {};
   mirrorList.forEach((ParameterMirror mirror) {
     _currentMember = mirror;
-    data[mirror.simpleName] = new Parameter(mirror.simpleName, 
-        mirror.isOptional, mirror.isNamed, mirror.hasDefaultValue, 
-        _type(mirror.type), mirror.defaultValue, 
+    data[mirror.simpleName] = new Parameter(mirror.simpleName,
+        mirror.isOptional, mirror.isNamed, mirror.hasDefaultValue,
+        _type(mirror.type), mirror.defaultValue,
         _annotations(mirror));
   });
   return data;
 }
 
 /**
- * Returns a map of [Generic] objects constructed from the class mirror. 
+ * Returns a map of [Generic] objects constructed from the class mirror.
  */
 Map<String, Generic> _generics(ClassMirror mirror) {
-  return new Map.fromIterable(mirror.typeVariables, 
-      key: (e) => e.toString(), 
+  return new Map.fromIterable(mirror.typeVariables,
+      key: (e) => e.toString(),
       value: (e) => new Generic(e.toString(), e.upperBound.qualifiedName));
 }
 
 /**
- * Returns a single [Type] object constructed from the Method.returnType 
- * Type mirror. 
+ * Returns a single [Type] object constructed from the Method.returnType
+ * Type mirror.
  */
 Type _type(TypeMirror mirror) {
   return new Type(mirror.qualifiedName, _typeGenerics(mirror));
 }
 
 /**
- * Returns a list of [Type] objects constructed from TypeMirrors. 
+ * Returns a list of [Type] objects constructed from TypeMirrors.
  */
 List<Type> _typeGenerics(TypeMirror mirror) {
   if (mirror is ClassMirror && !mirror.isTypedef) {
@@ -455,7 +483,7 @@
   if (!file.existsSync()) {
     file.createSync();
   }
-  file.writeAsString(text, mode: append ? FileMode.APPEND : FileMode.WRITE);
+  file.writeAsStringSync(text, mode: append ? FileMode.APPEND : FileMode.WRITE);
 }
 
 /**
@@ -473,26 +501,21 @@
   return outputMap;
 }
 
-bool isError(String qualifiedName) {
-  return qualifiedName.toLowerCase().contains('error') || 
-      qualifiedName.toLowerCase().contains('exception');
-}
-
 /**
- * A class representing all programming constructs, like library or class. 
+ * A class representing all programming constructs, like library or class.
  */
 class Indexable {
   String name;
   String qualifiedName;
   bool isPrivate;
-  
+
   /// Documentation comment with converted markdown.
   String comment;
-  
+
   /// Qualified Name of the owner of this Indexable Item.
-  /// For Library, owner will be ""; 
+  /// For Library, owner will be "";
   String owner;
-  
+
   Indexable(this.name, this.comment, this.qualifiedName, this.isPrivate,
       this.owner);
 }
@@ -507,18 +530,18 @@
 
   /// Top-level functions in the library.
   MethodGroup functions;
-  
+
   /// Classes defined within the library
   ClassGroup classes;
 
   Library(String name, String comment, this.variables,
-      this.functions, this.classes, bool isPrivate) : super(name, comment, 
+      this.functions, this.classes, bool isPrivate) : super(name, comment,
           name, isPrivate, "") {}
 
   /// Generates a map describing the [Library] object.
   Map toMap() => {
     'name': name,
-    'qualifiedname': qualifiedName,
+    'qualifiedName': qualifiedName,
     'comment': comment,
     'variables': recurseMap(variables),
     'functions': functions.toMap(),
@@ -533,48 +556,49 @@
 
   /// List of the names of interfaces that this class implements.
   List<Class> interfaces = [];
-  
-  /// Names of classes that extends or implements this class. 
+
+  /// Names of classes that extends or implements this class.
   Set<String> subclasses = new Set<String>();
 
   /// Top-level variables in the class.
   Map<String, Variable> variables;
-  
+
   /// Inherited variables in the class.
   Map<String, Variable> inheritedVariables = {};
 
   /// Methods in the class.
   MethodGroup methods;
-  
+
   /// Inherited methods in the class.
   MethodGroup inheritedMethods = new MethodGroup();
-  
-  /// Generic infomation about the class. 
+
+  /// Generic infomation about the class.
   Map<String, Generic> generics;
-  
+
   Class superclass;
+  bool isAbstract;
 
   /// List of the meta annotations on the class.
   List<String> annotations;
-  
-  Class(String name, this.superclass, String comment, this.interfaces, 
+
+  Class(String name, this.superclass, String comment, this.interfaces,
       this.variables, this.methods, this.annotations, this.generics,
-      String qualifiedName, bool isPrivate, String owner) : super(name, comment,
-          qualifiedName, isPrivate, owner) {}
+      String qualifiedName, bool isPrivate, String owner, this.isAbstract) 
+      : super(name, comment, qualifiedName, isPrivate, owner);
 
   /**
-   * Returns a list of all the parent classes. 
+   * Returns a list of all the parent classes.
    */
   List<Class> parent() {
     var parent = superclass == null ? [] : [superclass];
     parent.addAll(interfaces);
     return parent;
   }
-  
+
   /**
    * Add all inherited variables and methods from the provided superclass.
-   * If [_includePrivate] is true, it also adds the variables and methods from 
-   * the superclass. 
+   * If [_includePrivate] is true, it also adds the variables and methods from
+   * the superclass.
    */
   void addInherited(Class superclass) {
     inheritedVariables.addAll(superclass.inheritedVariables);
@@ -583,12 +607,12 @@
     }
     inheritedMethods.addInherited(superclass);
   }
-  
+
   /**
-   * Add the subclass to the class. 
-   * 
+   * Add the subclass to the class.
+   *
    * If [this] is private, it will add the subclass to the list of subclasses in
-   * the superclasses. 
+   * the superclasses.
    */
   void addSubclass(Class subclass) {
     if (!_includePrivate && isPrivate) {
@@ -602,137 +626,168 @@
   }
   
   /**
+   * Check if this [Class] is an error or exception.
+   */
+  bool isError() {
+    if (qualifiedName == 'dart.core.Error' || 
+        qualifiedName == 'dart.core.Exception')
+      return true;
+    for (var interface in interfaces) {
+      if (interface.isError()) return true;
+    }
+    if (superclass == null) return false;
+    return superclass.isError();
+  }
+
+  /**
    * Check that the class exists in the owner library.
-   *  
-   * If it does not exist in the owner library, it is a mixin applciation and 
-   * should be removed. 
+   *
+   * If it does not exist in the owner library, it is a mixin applciation and
+   * should be removed.
    */
   void makeValid() {
     var library = entityMap[owner];
-    if (!library.classes.containsKey(name)) {
+    if (library != null && !library.classes.containsKey(name)) {
       this.isPrivate = true;
-      // Since we are now making the mixin a private class, make all elements 
-      // with the mixin as an owner private too. 
+      // Since we are now making the mixin a private class, make all elements
+      // with the mixin as an owner private too.
       entityMap.values.where((e) => e.owner == qualifiedName)
         .forEach((element) => element.isPrivate = true);
       // Move the subclass up to the next public superclass
       subclasses.forEach((subclass) => addSubclass(entityMap[subclass]));
     }
   }
-  
-  /** 
+
+  /**
+   * Makes sure that all methods with inherited equivalents have comments.
+   */
+  void ensureComments() {
+    inheritedMethods.forEach((qualifiedName, inheritedMethod) {
+      var method = methods[qualifiedName];
+      if (method != null) method.ensureCommentFor(inheritedMethod);
+    });
+  }
+
+  /**
    * If a class extends a private superclass, find the closest public superclass
-   * of the private superclass. 
+   * of the private superclass.
    */
   String validSuperclass() {
     if (superclass == null) return 'dart.core.Object';
     if (_isVisible(superclass)) return superclass.qualifiedName;
     return superclass.validSuperclass();
   }
-  
+
   /// Generates a map describing the [Class] object.
   Map toMap() => {
     'name': name,
-    'qualifiedname': qualifiedName,
+    'qualifiedName': qualifiedName,
     'comment': comment,
+    'isAbstract' : isAbstract,
     'superclass': validSuperclass(),
-    'implements': new List.from(interfaces.where(_isVisible)
-        .map((e) => e.qualifiedName)),
-    'subclass': new List.from(subclasses),
+    'implements': interfaces.where(_isVisible)
+        .map((e) => e.qualifiedName).toList(),
+    'subclass': subclasses.toList(),
     'variables': recurseMap(variables),
-    'inheritedvariables': recurseMap(inheritedVariables),
+    'inheritedVariables': recurseMap(inheritedVariables),
     'methods': methods.toMap(),
-    'inheritedmethods': inheritedMethods.toMap(),
-    'annotations': new List.from(annotations),
+    'inheritedMethods': inheritedMethods.toMap(),
+    'annotations': annotations.map((a) => a.toMap()).toList(),
     'generics': recurseMap(generics)
   };
 }
 
 /**
- * A container to categorize classes into the following groups: abstract 
- * classes, regular classes, typedefs, and errors. 
+ * A container to categorize classes into the following groups: abstract
+ * classes, regular classes, typedefs, and errors.
  */
 class ClassGroup {
-  Map<String, Class> abstractClasses = {};
-  Map<String, Class> regularClasses = {};
+  Map<String, Class> classes = {};
   Map<String, Typedef> typedefs = {};
   Map<String, Class> errors = {};
-  
+
   void addClass(ClassMirror mirror) {
     _currentClass = mirror;
     var clazz = _class(mirror);
-   
-    // Adding inherited parent variables and methods. 
+
+    // Adding inherited parent variables and methods.
     clazz.parent().forEach((parent) {
       if (_isVisible(clazz)) {
         parent.addSubclass(clazz);
       }
-      clazz.addInherited(parent);
     });
-    
-    if (isError(mirror.qualifiedName)) {
+
+    clazz.ensureComments();
+
+    if (clazz.isError()) {
       errors[mirror.simpleName] = clazz;
     } else if (mirror.isTypedef) {
       if (_includePrivate || !mirror.isPrivate) {
-        entityMap[mirror.qualifiedName] = new Typedef(mirror.simpleName, 
-            mirror.value.returnType.qualifiedName, _commentToHtml(mirror), 
+        entityMap[mirror.qualifiedName] = new Typedef(mirror.simpleName,
+            mirror.value.returnType.qualifiedName, _commentToHtml(mirror),
             _generics(mirror), _parameters(mirror.value.parameters),
-            _annotations(mirror), mirror.qualifiedName,  _isPrivate(mirror), 
+            _annotations(mirror), mirror.qualifiedName,  _isHidden(mirror),
             mirror.owner.qualifiedName);
         typedefs[mirror.simpleName] = entityMap[mirror.qualifiedName];
       }
-    } else if (mirror.isAbstract) {
-      abstractClasses[mirror.simpleName] = clazz;
     } else if (mirror.isClass) {
-      regularClasses[mirror.simpleName] = clazz;
+      classes[mirror.simpleName] = clazz;
     } else {
       throw new ArgumentError('${mirror.simpleName} - no class type match. ');
     }
   }
-  
+
   /**
-   * Checks if the given name is a key for any of the Class Maps. 
+   * Checks if the given name is a key for any of the Class Maps.
    */
   bool containsKey(String name) {
-    return abstractClasses.containsKey(name) ||
-        regularClasses.containsKey(name) ||
-        errors.containsKey(name);
+    return classes.containsKey(name) || errors.containsKey(name);
+  }
+
+  /**
+   * Creates a [Map] with [Class] names and a preview comment.
+   */
+  Map classMap(Class clazz) {
+    var finalMap = { 'name' : clazz.qualifiedName };
+    if (clazz.comment != '') {
+      var index = clazz.comment.indexOf('</p>');
+      finalMap['preview'] = '${clazz.comment.substring(0, index)}</p>';
+    }
+    return finalMap;
   }
   
   Map toMap() => {
-    'abstract': new List.from(abstractClasses.values
-        .where(_isVisible).map((e) => e.qualifiedName)),
-    'class': new List.from(regularClasses.values
-        .where(_isVisible).map((e) => e.qualifiedName)),
+    'class': classes.values.where(_isVisible)
+      .map((e) => classMap(e)).toList(),
     'typedef': recurseMap(typedefs),
-    'error': new List.from(errors.values
-        .where(_isVisible).map((e) => e.qualifiedName))
+    'error': errors.values.where(_isVisible)
+      .map((e) => classMap(e)).toList()
   };
 }
 
 class Typedef extends Indexable {
   String returnType;
-  
+
   Map<String, Parameter> parameters;
-  
-  /// Generic information about the typedef. 
+
+  /// Generic information about the typedef.
   Map<String, Generic> generics;
-  
-  /// List of the meta annotations on the typedef. 
+
+  /// List of the meta annotations on the typedef.
   List<String> annotations;
-  
-  Typedef(String name, this.returnType, String comment, this.generics, 
+
+  Typedef(String name, this.returnType, String comment, this.generics,
       this.parameters, this.annotations,
-      String qualifiedName, bool isPrivate, String owner) : super(name, comment,
-          qualifiedName, isPrivate, owner) {}
-  
+      String qualifiedName, bool isPrivate, String owner) 
+        : super(name, comment, qualifiedName, isPrivate, owner);
+
   Map toMap() => {
     'name': name,
-    'qualifiedname': qualifiedName,
+    'qualifiedName': qualifiedName,
     'comment': comment,
     'return': returnType,
     'parameters': recurseMap(parameters),
-    'annotations': new List.from(annotations),
+    'annotations': annotations.map((a) => a.toMap()).toList(),
     'generics': recurseMap(generics)
   };
 }
@@ -749,21 +804,21 @@
 
   /// List of the meta annotations on the variable.
   List<String> annotations;
-  
-  Variable(String name, this.isFinal, this.isStatic, this.isConst, this.type, 
+
+  Variable(String name, this.isFinal, this.isStatic, this.isConst, this.type,
       String comment, this.annotations, String qualifiedName, bool isPrivate,
       String owner) : super(name, comment, qualifiedName, isPrivate, owner);
-  
+
   /// Generates a map describing the [Variable] object.
   Map toMap() => {
     'name': name,
-    'qualifiedname': qualifiedName,
+    'qualifiedName': qualifiedName,
     'comment': comment,
     'final': isFinal.toString(),
     'static': isStatic.toString(),
     'constant': isConst.toString(),
     'type': new List.filled(1, type.toMap()),
-    'annotations': new List.from(annotations)
+    'annotations': annotations.map((a) => a.toMap()).toList()
   };
 }
 
@@ -779,32 +834,47 @@
   bool isAbstract;
   bool isConst;
   Type returnType;
-  
+
+  /// Qualified name to state where the comment is inherited from.
+  String commentInheritedFrom = "";
+
   /// List of the meta annotations on the method.
   List<String> annotations;
-  
-  Method(String name, this.isStatic, this.isAbstract, this.isConst, 
+
+  Method(String name, this.isStatic, this.isAbstract, this.isConst,
       this.returnType, String comment, this.parameters, this.annotations,
       String qualifiedName, bool isPrivate, String owner) : super(name, comment,
           qualifiedName, isPrivate, owner);
-  
+
+  /**
+   * Makes sure that the method with an inherited equivalent have comments.
+   */
+  void ensureCommentFor(Method inheritedMethod) {
+    if (comment.isNotEmpty) return;
+    entityMap[inheritedMethod.owner].ensureComments();
+    comment = inheritedMethod.comment;
+    commentInheritedFrom = inheritedMethod.commentInheritedFrom == '' ?
+        inheritedMethod.qualifiedName : inheritedMethod.commentInheritedFrom;
+  }
+
   /// Generates a map describing the [Method] object.
   Map toMap() => {
     'name': name,
-    'qualifiedname': qualifiedName,
+    'qualifiedName': qualifiedName,
     'comment': comment,
+    'commentFrom': commentInheritedFrom,
     'static': isStatic.toString(),
     'abstract': isAbstract.toString(),
     'constant': isConst.toString(),
     'return': new List.filled(1, returnType.toMap()),
     'parameters': recurseMap(parameters),
-    'annotations': new List.from(annotations)
+    'annotations': annotations.map((a) => a.toMap()).toList()
   };
 }
 
 /**
- * A container to categorize methods into the following groups: setters, 
- * getters, constructors, operators, regular methods. 
+ * A container to categorize methods into the following groups: setters,
+ * getters, constructors, operators, regular methods.
  */
 class MethodGroup {
   Map<String, Method> setters = {};
@@ -812,12 +882,12 @@
   Map<String, Method> constructors = {};
   Map<String, Method> operators = {};
   Map<String, Method> regularMethods = {};
-  
+
   void addMethod(MethodMirror mirror) {
-    var method = new Method(mirror.simpleName, mirror.isStatic, 
-        mirror.isAbstract, mirror.isConstConstructor, _type(mirror.returnType), 
-        _commentToHtml(mirror), _parameters(mirror.parameters), 
-        _annotations(mirror), mirror.qualifiedName, _isPrivate(mirror),
+    var method = new Method(mirror.simpleName, mirror.isStatic,
+        mirror.isAbstract, mirror.isConstConstructor, _type(mirror.returnType),
+        _commentToHtml(mirror), _parameters(mirror.parameters),
+        _annotations(mirror), mirror.qualifiedName, _isHidden(mirror),
         mirror.owner.qualifiedName);
     entityMap[mirror.qualifiedName] = method;
     _currentMember = mirror;
@@ -835,7 +905,7 @@
       throw new ArgumentError('${mirror.simpleName} - no method type match');
     }
   }
-  
+
   void addInherited(Class parent) {
     setters.addAll(parent.inheritedMethods.setters);
     getters.addAll(parent.inheritedMethods.getters);
@@ -848,7 +918,7 @@
       regularMethods.addAll(parent.methods.regularMethods);
     }
   }
-  
+
   Map toMap() => {
     'setters': recurseMap(setters),
     'getters': recurseMap(getters),
@@ -856,6 +926,23 @@
     'operators': recurseMap(operators),
     'methods': recurseMap(regularMethods)
   };
+
+  Method operator [](String qualifiedName) {
+    if (setters.containsKey(qualifiedName)) return setters[qualifiedName];
+    if (getters.containsKey(qualifiedName)) return getters[qualifiedName];
+    if (operators.containsKey(qualifiedName)) return operators[qualifiedName];
+    if (regularMethods.containsKey(qualifiedName)) {
+      return regularMethods[qualifiedName];
+    }
+    return null;
+  }
+
+  void forEach(void f(String key, Method value)) {
+    setters.forEach(f);
+    getters.forEach(f);
+    operators.forEach(f);
+    regularMethods.forEach(f);
+  }
 }
 
 /**
@@ -872,10 +959,10 @@
 
   /// List of the meta annotations on the parameter.
   List<String> annotations;
-  
-  Parameter(this.name, this.isOptional, this.isNamed, this.hasDefaultValue, 
+
+  Parameter(this.name, this.isOptional, this.isNamed, this.hasDefaultValue,
       this.type, this.defaultValue, this.annotations);
-  
+
   /// Generates a map describing the [Parameter] object.
   Map toMap() => {
     'name': name,
@@ -884,19 +971,19 @@
     'default': hasDefaultValue.toString(),
     'type': new List.filled(1, type.toMap()),
     'value': defaultValue,
-    'annotations': new List.from(annotations)
+    'annotations': annotations.map((a) => a.toMap()).toList()
   };
 }
 
 /**
- * A class containing properties of a Generic. 
+ * A class containing properties of a Generic.
  */
 class Generic {
   String name;
   String type;
-  
+
   Generic(this.name, this.type);
-  
+
   Map toMap() => {
     'name': name,
     'type': type
@@ -905,25 +992,25 @@
 
 /**
  * Holds the name of a return type, and its generic type parameters.
- * 
+ *
  * Return types are of a form [outer]<[inner]>.
- * If there is no [inner] part, [inner] will be an empty list. 
- * 
+ * If there is no [inner] part, [inner] will be an empty list.
+ *
  * For example:
- *        int size()  
- *          "return" : 
+ *        int size()
+ *          "return" :
  *            - "outer" : "dart.core.int"
  *              "inner" :
- * 
+ *
  *        List<String> toList()
  *          "return" :
  *            - "outer" : "dart.core.List"
- *              "inner" : 
+ *              "inner" :
  *                - "outer" : "dart.core.String"
  *                  "inner" :
- *        
+ *
  *        Map<String, List<int>>
- *          "return" : 
+ *          "return" :
  *            - "outer" : "dart.core.Map"
  *              "inner" :
  *                - "outer" : "dart.core.String"
@@ -936,11 +1023,26 @@
 class Type {
   String outer;
   List<Type> inner;
-  
+
   Type(this.outer, this.inner);
-  
+
   Map toMap() => {
     'outer': outer,
-    'inner': new List.from(inner.map((e) => e.toMap()))
+    'inner': inner.map((e) => e.toMap()).toList()
+  };
+}
+
+/**
+ * Holds the name of the annotation, and its parameters.
+ */
+class Annotation {
+  String qualifiedName;
+  List<String> parameters;
+
+  Annotation(this.qualifiedName, this.parameters);
+
+  Map toMap() => {
+    'name': qualifiedName,
+    'parameters': parameters
   };
 }
\ No newline at end of file
diff --git a/pkg/docgen/pubspec.yaml b/pkg/docgen/pubspec.yaml
index 79220e4..70e3958 100644
--- a/pkg/docgen/pubspec.yaml
+++ b/pkg/docgen/pubspec.yaml
@@ -5,5 +5,5 @@
   logging: any
   markdown: any
   path: any
-  scheduled_test: any
+dev_dependencies:
   unittest: any
diff --git a/pkg/docgen/test/single_library_test.dart b/pkg/docgen/test/single_library_test.dart
index 0ca4b09..78c8a5d 100644
--- a/pkg/docgen/test/single_library_test.dart
+++ b/pkg/docgen/test/single_library_test.dart
@@ -56,8 +56,7 @@
           expect(classTypes is ClassGroup, isTrue);
           
           var classes = [];
-          classes.addAll(classTypes.abstractClasses.values);
-          classes.addAll(classTypes.regularClasses.values);
+          classes.addAll(classTypes.classes.values);
           classes.addAll(classTypes.errors.values);
           expect(classes.every((e) => e is Class), isTrue);
           
diff --git a/pkg/http/lib/src/client.dart b/pkg/http/lib/src/client.dart
index 2757ea0..27626cc 100644
--- a/pkg/http/lib/src/client.dart
+++ b/pkg/http/lib/src/client.dart
@@ -12,7 +12,6 @@
 import 'io_client.dart';
 import 'streamed_response.dart';
 import 'response.dart';
-import 'utils.dart';
 
 /// The interface for HTTP clients that take care of maintaining persistent
 /// connections across multiple requests to the same server. If you only need to
diff --git a/pkg/http/lib/src/io_client.dart b/pkg/http/lib/src/io_client.dart
index b7a6730..6695fb8 100644
--- a/pkg/http/lib/src/io_client.dart
+++ b/pkg/http/lib/src/io_client.dart
@@ -10,7 +10,6 @@
 import 'base_client.dart';
 import 'base_request.dart';
 import 'streamed_response.dart';
-import 'utils.dart';
 
 /// A `dart:io`-based HTTP client. This is the default client.
 class IOClient extends BaseClient {
diff --git a/pkg/http/lib/src/mock_client.dart b/pkg/http/lib/src/mock_client.dart
index ec88af4..b81bf06 100644
--- a/pkg/http/lib/src/mock_client.dart
+++ b/pkg/http/lib/src/mock_client.dart
@@ -5,7 +5,6 @@
 library mock_client;
 
 import 'dart:async';
-import 'dart:io';
 
 import 'base_client.dart';
 import 'base_request.dart';
diff --git a/pkg/http/lib/src/request.dart b/pkg/http/lib/src/request.dart
index 982d2fb..9f024e6 100644
--- a/pkg/http/lib/src/request.dart
+++ b/pkg/http/lib/src/request.dart
@@ -4,7 +4,6 @@
 
 library request;
 
-import 'dart:async';
 import 'dart:io';
 import 'dart:typed_data';
 
diff --git a/pkg/http/lib/src/utils.dart b/pkg/http/lib/src/utils.dart
index 1cbe6aa..420a3d5 100644
--- a/pkg/http/lib/src/utils.dart
+++ b/pkg/http/lib/src/utils.dart
@@ -9,8 +9,6 @@
 import 'dart:typed_data';
 import 'dart:utf';
 
-import "package:crypto/crypto.dart";
-
 import 'byte_stream.dart';
 
 /// Converts a URL query string (or `application/x-www-form-urlencoded` body)
diff --git a/pkg/http/test/client_test.dart b/pkg/http/test/client_test.dart
index 287aee5..6f397fa 100644
--- a/pkg/http/test/client_test.dart
+++ b/pkg/http/test/client_test.dart
@@ -7,7 +7,6 @@
 import 'dart:io';
 
 import 'package:http/http.dart' as http;
-import 'package:http/src/utils.dart';
 import 'package:unittest/unittest.dart';
 
 import 'utils.dart';
diff --git a/pkg/http/test/multipart_test.dart b/pkg/http/test/multipart_test.dart
index 0d44d8e..cdbb4cd 100644
--- a/pkg/http/test/multipart_test.dart
+++ b/pkg/http/test/multipart_test.dart
@@ -9,7 +9,6 @@
 import 'dart:utf';
 
 import 'package:http/http.dart' as http;
-import 'package:http/src/utils.dart';
 import 'package:path/path.dart' as path;
 import 'package:unittest/unittest.dart';
 
diff --git a/pkg/http/test/request_test.dart b/pkg/http/test/request_test.dart
index 3ebe3e5..c9d82ce 100644
--- a/pkg/http/test/request_test.dart
+++ b/pkg/http/test/request_test.dart
@@ -7,7 +7,6 @@
 import 'dart:io';
 
 import 'package:http/http.dart' as http;
-import 'package:http/src/utils.dart';
 import 'package:unittest/unittest.dart';
 
 import 'utils.dart';
diff --git a/pkg/http/test/utils.dart b/pkg/http/test/utils.dart
index a3f0f6e..9c6e584 100644
--- a/pkg/http/test/utils.dart
+++ b/pkg/http/test/utils.dart
@@ -8,7 +8,6 @@
 import 'dart:io';
 import 'dart:json' as json;
 
-import 'package:http/http.dart' as http;
 import 'package:http/src/byte_stream.dart';
 import 'package:http/src/utils.dart';
 import 'package:unittest/unittest.dart';
diff --git a/pkg/http_server/pubspec.yaml b/pkg/http_server/pubspec.yaml
index 3f29100..3112d77 100644
--- a/pkg/http_server/pubspec.yaml
+++ b/pkg/http_server/pubspec.yaml
@@ -1,7 +1,8 @@
 name: http_server
-author: "Dart Team <misc@dartlang.org>"
+author: Dart Team <misc@dartlang.org>
+description: Library of HTTP server classes.
 homepage: http://www.dartlang.org
-description: >
- Library of HTTP server classes.
 dependencies:
   mime: any
+dev_dependencies:
+  unittest: any
diff --git a/pkg/intl/example/basic/basic_example.dart b/pkg/intl/example/basic/basic_example.dart
index 1ecb2a0..41a63a0 100644
--- a/pkg/intl/example/basic/basic_example.dart
+++ b/pkg/intl/example/basic/basic_example.dart
@@ -19,7 +19,6 @@
 import 'dart:async';
 import 'package:intl/date_symbol_data_local.dart';
 import 'package:intl/intl.dart';
-import 'package:intl/message_lookup_by_library.dart';
 import 'messages_all.dart';
 
 /**
diff --git a/pkg/intl/lib/extract_messages.dart b/pkg/intl/lib/extract_messages.dart
index 2fa06ad..0679ff8 100644
--- a/pkg/intl/lib/extract_messages.dart
+++ b/pkg/intl/lib/extract_messages.dart
@@ -33,6 +33,21 @@
 bool suppressWarnings = false;
 
 /**
+ * If this is true, then treat all warnings as errors.
+ */
+bool warningsAreErrors = false;
+
+/**
+ * This accumulates a list of all warnings/errors we have found. These are
+ * saved as strings right now, so all that can really be done is print and
+ * count them.
+ */
+List<String> warnings = [];
+
+/** Were there any warnings or errors in extracting messages. */
+bool get hasWarnings => warnings.isNotEmpty;
+
+/**
  * Parse the source of the Dart program file [file] and return a Map from
  * message names to [IntlMessage] instances.
  */
@@ -58,13 +73,15 @@
  */
 String _origin;
 
-void _reportErrorLocation(ASTNode node) {
-  if (_origin != null) print("    from $_origin");
+String _reportErrorLocation(ASTNode node) {
+  var result = new StringBuffer();
+  if (_origin != null) result.write("    from $_origin");
   var info = _root.lineInfo;
   if (info != null) {
     var line = info.getLocation(node.offset);
-    print("    line: ${line.lineNumber}, column: ${line.columnNumber}");
+    result.write("    line: ${line.lineNumber}, column: ${line.columnNumber}");
   }
+  return result.toString();
 }
 
 /**
@@ -92,7 +109,7 @@
 
   /** Return true if [node] matches the pattern we expect for Intl.message() */
   bool looksLikeIntlMessage(MethodInvocation node) {
-    const validNames = const ["message", "plural", "gender"];
+    const validNames = const ["message", "plural", "gender", "select"];
     if (!validNames.contains(node.methodName.name)) return false;
     if (!(node.target is SimpleIdentifier)) return false;
     SimpleIdentifier target = node.target;
@@ -100,6 +117,16 @@
     return true;
   }
 
+  Message _expectedInstance(String type) {
+    switch (type) {
+      case 'message' : return new MainMessage();
+      case 'plural' : return new Plural();
+      case 'gender' : return new Gender();
+      case 'select' : return new Select();
+      default: return null;
+    }
+  }
+
   /**
    * Returns a String describing why the node is invalid, or null if no
    * reason is found, so it's presumed valid.
@@ -110,34 +137,8 @@
       return "Named parameters on message functions are not supported.";
     }
     var arguments = node.argumentList.arguments;
-
-    if (node.methodName.name == 'message') {
-      if (!(arguments.first is StringLiteral)) {
-        return "Intl.message messages must be string literals";
-      }
-    }
-
-    var namedArguments = arguments.skip(1);
-    // This seems unlikely to happen, but make sure all are NamedExpression
-    // before doing the tests below.
-    if (!namedArguments.every((each) => each is NamedExpression)) {
-      return "Message arguments except the message must be named";
-    }
-    var notArgs = namedArguments.where(
-        (each) => each.name.label.name != 'args');
-    var values = notArgs.map((each) => each.expression).toList();
-    if (!values.every((each) => each is SimpleStringLiteral)) {
-      "Intl.message arguments must be simple string literals";
-    }
-    if (!notArgs.any((each) => each.name.label.name == 'name')) {
-      return "The 'name' argument for Intl.message must be specified";
-    }
-    var hasArgs = namedArguments.any((each) => each.name.label.name == 'args');
-    var hasParameters = !parameters.parameters.isEmpty;
-    if (!hasArgs && hasParameters) {
-      return "The 'args' argument for Intl.message must be specified";
-    }
-    return null;
+    var instance = _expectedInstance(node.methodName.name);
+    return instance.checkValidity(node, arguments, name, parameters);
   }
 
   /**
@@ -146,7 +147,7 @@
    */
   void visitMethodDeclaration(MethodDeclaration node) {
     parameters = node.parameters;
-    String name = node.name.name;
+    name = node.name.name;
     super.visitMethodDeclaration(node);
   }
 
@@ -154,16 +155,6 @@
    * Record the parameters of the function or method declaration we last
    * encountered before seeing the Intl.message call.
    */
-  void visitFunctionExpression(FunctionExpression node) {
-    parameters = node.parameters;
-    name = null;
-    super.visitFunctionExpression(node);
-  }
-
-  /**
-   * Record the parameters of the function or method declaration we last
-   * encountered before seeing the Intl.message call.
-   */
   void visitFunctionDeclaration(FunctionDeclaration node) {
     parameters = node.functionExpression.parameters;
     name = node.name.name;
@@ -193,9 +184,12 @@
     var reason = checkValidity(node);
     if (reason != null) {
       if (!suppressWarnings) {
-        print("Skipping invalid Intl.message invocation\n    <$node>");
-        print("    reason: $reason");
-        _reportErrorLocation(node);
+        var err = new StringBuffer();
+        err.write("Skipping invalid Intl.message invocation\n    <$node>\n");
+        err.write("    reason: $reason\n");
+        err.write(_reportErrorLocation(node));
+        warnings.add(err.toString());
+        print(err);
       }
       // We found one, but it's not valid. Stop recursing.
       return true;
@@ -226,7 +220,7 @@
     var arguments = node.argumentList.arguments.elements;
     extract(message, arguments);
 
-    for (NamedExpression namedArgument in arguments.skip(1)) {
+    for (var namedArgument in arguments.where((x) => x is NamedExpression)) {
       var name = namedArgument.name.label.name;
       var exp = namedArgument.expression;
       var string = exp is SimpleStringLiteral ? exp.value : exp.toString();
@@ -249,9 +243,12 @@
         message.messagePieces.addAll(interpolation.pieces);
       } on IntlMessageExtractionException catch (e) {
         message = null;
-        print("Error $e");
-        print("Processing <$node>");
-        _reportErrorLocation(node);
+        var err = new StringBuffer();
+        err.write("Error $e\n");
+        err.write("Processing <$node>\n");
+        err.write(_reportErrorLocation(node));
+        print(err);
+        warnings.add(err);
       }
     }
 
@@ -398,7 +395,9 @@
 
   /** Return true if [node] matches the pattern for plural or gender message.*/
   bool looksLikePluralOrGender(MethodInvocation node) {
-    if (!["plural", "gender"].contains(node.methodName.name)) return false;
+    if (!["plural", "gender", "select"].contains(node.methodName.name)) {
+      return false;
+    }
     if (!(node.target is SimpleIdentifier)) return false;
     SimpleIdentifier target = node.target;
     if (target.token.toString() != "Intl") return false;
@@ -420,28 +419,31 @@
    */
   Message messageFromMethodInvocation(MethodInvocation node) {
     var message;
-    if (node.methodName.name == "gender") {
-      message = new Gender();
-    } else if (node.methodName.name == "plural") {
-      message = new Plural();
-    } else {
-      throw new IntlMessageExtractionException("Invalid plural/gender message");
+    switch(node.methodName.name) {
+      case "gender" : message = new Gender(); break;
+      case "plural" : message = new Plural(); break;
+      case "select" : message = new Select(); break;
+      default: throw new IntlMessageExtractionException(
+          "Invalid plural/gender/select message");
     }
     message.parent = parent;
 
-    var arguments = node.argumentList.arguments.elements;
-    for (var arg in arguments.where((each) => each is NamedExpression)) {
+    var arguments = message.argumentsOfInterestFor(node);
+    arguments.forEach((key, value) {
       try {
         var interpolation = new InterpolationVisitor(message);
-        arg.expression.accept(interpolation);
-        message[arg.name.label.token.toString()] = interpolation.pieces;
+        value.accept(interpolation);
+        message[key] = interpolation.pieces;
       } on IntlMessageExtractionException catch (e) {
         message = null;
-        print("Error $e");
-        print("Processing <$node>");
-        _reportErrorLocation(node);
+        var err = new StringBuffer();
+        err.write("Error $e");
+        err.write("Processing <$node>");
+        err.write(_reportErrorLocation(node));
+        print(err);
+        warnings.add(err);
       }
-    }
+    });
     var mainArg = node.argumentList.arguments.elements.firstWhere(
         (each) => each is! NamedExpression);
     if (mainArg is SimpleStringLiteral) {
diff --git a/pkg/intl/lib/generate_localized.dart b/pkg/intl/lib/generate_localized.dart
index f5e3921..a232fd3 100644
--- a/pkg/intl/lib/generate_localized.dart
+++ b/pkg/intl/lib/generate_localized.dart
@@ -13,7 +13,6 @@
  */
 library generate_localized;
 
-import 'extract_messages.dart';
 import 'src/intl_message.dart';
 import 'dart:io';
 import 'package:path/path.dart' as path;
diff --git a/pkg/intl/lib/intl.dart b/pkg/intl/lib/intl.dart
index fb71f88..e91c2b2 100644
--- a/pkg/intl/lib/intl.dart
+++ b/pkg/intl/lib/intl.dart
@@ -31,7 +31,7 @@
  */
 library intl;
 
-import 'dart:async';
+import 'dart:collection';
 import 'src/intl_helpers.dart';
 import 'dart:math';
 import 'date_symbols.dart';
@@ -302,6 +302,33 @@
   }
 
   /**
+   * Format a message differently depending on [choice]. We look up the value
+   * of [choice] in [cases] and return the result, or an empty string if
+   * it is not found. Normally used as part
+   * of an Intl.message message that is to be translated.
+   */
+  static String select(String choice, Map<String, String> cases,
+       {String desc, Map examples, String locale, String name,
+       List<String>args}) {
+    // If we are passed a name and arguments, then we are operating as a
+    // top-level message, so look up our translation by calling Intl.message
+    // with ourselves as an argument.
+    if (name != null) {
+      return Intl.message(
+          Intl.select(choice, cases),
+          name: name,
+          args: args,
+          locale: locale);
+    }
+    var exact = cases[choice];
+    if (exact != null) return exact;
+    var other = cases["other"];
+    if (other == null)
+      throw new ArgumentError("The 'other' case must be specified");
+    return other;
+  }
+
+  /**
    * Format the given function with a specific [locale], given a
    * [message_function] that takes no parameters. The [message_function] can be
    * a simple message function that just returns the result of `Intl.message()`
@@ -325,17 +352,6 @@
   }
 
   /**
-   * Support method for message formatting. Select the correct exact (gender,
-   * usually) form from [cases] given the user [choice].
-   */
-  static String select(String choice, Map cases) {
-    var exact = cases[choice];
-    if (exact != null) return exact;
-    var other = cases["other"];
-    return (other == null) ? '' : other;
-  }
-
-  /**
    * Accessor for the current locale. This should always == the default locale,
    * unless for some reason this gets called inside a message that resets the
    * locale.
diff --git a/pkg/intl/lib/message_lookup_by_library.dart b/pkg/intl/lib/message_lookup_by_library.dart
index fde0551..2e92dbd 100644
--- a/pkg/intl/lib/message_lookup_by_library.dart
+++ b/pkg/intl/lib/message_lookup_by_library.dart
@@ -13,9 +13,7 @@
  */
 library message_lookup_by_library;
 
-import 'dart:async';
 import 'intl.dart';
-import 'src/intl_helpers.dart';
 
 /**
  * This is a message lookup mechanism that delegates to one of a collection
diff --git a/pkg/intl/lib/number_format.dart b/pkg/intl/lib/number_format.dart
index c8816d8..bdc5e46 100644
--- a/pkg/intl/lib/number_format.dart
+++ b/pkg/intl/lib/number_format.dart
@@ -699,7 +699,7 @@
  * Provides an Iterable that wraps [_iterator] so it can be used in a `for`
  * loop.
  */
-class _StringIterable extends Iterable<String> {
+class _StringIterable extends IterableBase<String> {
   final Iterator<String> iterator;
 
   _StringIterable(String s)
diff --git a/pkg/intl/lib/src/intl_helpers.dart b/pkg/intl/lib/src/intl_helpers.dart
index 229d044..0aa3f4d 100644
--- a/pkg/intl/lib/src/intl_helpers.dart
+++ b/pkg/intl/lib/src/intl_helpers.dart
@@ -8,7 +8,6 @@
  */
 
 library intl_helpers;
-import '../date_symbols.dart';
 
 import 'dart:async';
 
diff --git a/pkg/intl/lib/src/intl_message.dart b/pkg/intl/lib/src/intl_message.dart
index ae31798..5dfb9c8 100644
--- a/pkg/intl/lib/src/intl_message.dart
+++ b/pkg/intl/lib/src/intl_message.dart
@@ -33,6 +33,8 @@
  */
 library intl_message;
 
+import 'package:analyzer_experimental/analyzer.dart';
+
 /** A default function for the [Message.expanded] method. */
 _nullTransform(msg, chunk) => chunk;
 
@@ -59,6 +61,39 @@
    */
   get arguments => parent == null ? const [] : parent.arguments;
 
+  String checkValidity(MethodInvocation node, List arguments,
+                       String outerName, FormalParameterList outerArgs) {
+    var hasArgs = arguments.any(
+        (each) => each is NamedExpression && each.name.label.name == 'args');
+    var hasParameters = !outerArgs.parameters.isEmpty;
+    if (!hasArgs && hasParameters) {
+      return "The 'args' argument for Intl.message must be specified";
+    }
+
+    var messageName = arguments.firstWhere(
+        (eachArg) => eachArg is NamedExpression &&
+            eachArg.name.label.name == 'name',
+        orElse: () => null);
+    if (messageName == null) {
+      return "The 'name' argument for Intl.message must be specified";
+    }
+    if ((messageName.expression is! SimpleStringLiteral)
+        || messageName.expression.value != outerName) {
+      return "The 'name' argument for Intl.message must be a simple string "
+          "literal and match the containing function name.";
+    }
+    var simpleArguments = arguments.where(
+        (each) => each is NamedExpression
+        && ["desc", "locale", "name"].contains(each.name.label.name));
+    var values = simpleArguments.map((each) => each.expression).toList();
+    for (var arg in values) {
+      if (arg is! SimpleStringLiteral) {
+        return "Intl.message argument '${arg.name.label.name}' must be "
+            "a simple string literal";
+      }
+    }
+  }
+
   /**
    * Turn a value, typically read from a translation file or created out of an
    * AST for a source program, into the appropriate
@@ -234,6 +269,16 @@
    */
   List<Message> messagePieces = [];
 
+  /** Verify that this looks like a correct Intl.message invocation. */
+  String checkValidity(MethodInvocation node, List arguments,
+      String outerName, FormalParameterList outerArgs) {
+    if (arguments.first is! StringLiteral) {
+      return "Intl.message messages must be string literals";
+    }
+
+    return super.checkValidity(node, arguments, outerName, outerArgs);
+  }
+
   void addPieces(List<Message> messages) {
     for (var each in messages) {
       messagePieces.add(Message.from(each, this));
@@ -384,6 +429,18 @@
   String mainArgument;
 
   /**
+   * Return the arguments that affect this SubMessage as a map of
+   * argument names and values.
+   */
+  Map argumentsOfInterestFor(MethodInvocation node) {
+    var basicArguments = node.argumentList.arguments.elements;
+    var others = basicArguments.where((each) => each is NamedExpression);
+    return new Map.fromIterable(others,
+        key: (node) => node.name.label.token.value(),
+        value: (node) => node.expression);
+  }
+
+  /**
    * Return the list of attribute names to use when generating code. This
    *  may be different from [attributeNames] if there are multiple aliases
    *  that map to the same clause.
@@ -423,12 +480,12 @@
 
   Gender();
   /**
-   * Create a new IntlGender providing [mainArgument] and the list of possible
+   * Create a new Gender providing [mainArgument] and the list of possible
    * clauses. Each clause is expected to be a list whose first element is a
-   * variable name and whose second element is either a String or
-   * a list of strings and IntlMessageSends or IntlVariableSubstitution.
+   * variable name and whose second element is either a [String] or
+   * a list of strings and [Message] or [VariableSubstitution].
    */
-  Gender.from(mainArgument, List clauses, parent) :
+  Gender.from(String mainArgument, List clauses, Message parent) :
       super.from(mainArgument, clauses, parent);
 
   Message female;
@@ -467,7 +524,7 @@
 class Plural extends SubMessage {
 
    Plural();
-   Plural.from(mainArgument, clauses, parent) :
+   Plural.from(String mainArgument, List clauses, Message parent) :
      super.from(mainArgument, clauses, parent);
 
    Message zero;
@@ -519,3 +576,69 @@
    }
 }
 
+/**
+ * Represents a message send of [Intl.select] inside a message that is to
+ * be internationalized. This corresponds to an ICU message syntax "select"
+ * with arbitrary options.
+ */
+class Select extends SubMessage {
+
+  Select();
+  /**
+   * Create a new [Select] providing [mainArgument] and the list of possible
+   * clauses. Each clause is expected to be a list whose first element is a
+   * variable name and whose second element is either a String or
+   * a list of strings and [Message]s or [VariableSubstitution]s.
+   */
+  Select.from(String mainArgument, List clauses, Message parent) :
+      super.from(mainArgument, clauses, parent);
+
+  Map<String, Message> cases = new Map<String, Message>();
+
+  String get icuMessageName => "select";
+  String get dartMessageName => 'Intl.select';
+
+  get attributeNames => cases.keys;
+  get codeAttributeNames => attributeNames;
+
+  void operator []=(attributeName, rawValue) {
+    var value = Message.from(rawValue, this);
+    cases[attributeName] = value;
+  }
+
+  Message operator [](String attributeName) {
+    var exact = cases[attributeName];
+    return exact == null ? cases["other"] : exact;
+  }
+
+  /**
+   * Return the arguments that we care about for the select. In this
+   * case they will all be passed in as a Map rather than as the named
+   * arguments used in Plural/Gender.
+   */
+  Map argumentsOfInterestFor(MethodInvocation node) {
+    var casesArgument = node.argumentList.arguments.elements[1];
+    return new Map.fromIterable(casesArgument.entries,
+      key: (node) => node.key.value,
+      value: (node) => node.value);
+  }
+
+  /**
+   * Write out the generated representation of this message. This differs
+   * from Plural/Gender in that it prints a literal map rather than
+   * named arguments.
+   */
+  String toCode() {
+    var out = new StringBuffer();
+    out.write('\${');
+    out.write(dartMessageName);
+    out.write('(');
+    out.write(mainArgument);
+    var args = codeAttributeNames;
+    out.write(", {");
+    args.fold(out, (buffer, arg) => buffer..write(
+        "'$arg': '${this[arg].toCode()}', "));
+    out.write("})}");
+    return out.toString();
+  }
+}
\ No newline at end of file
diff --git a/pkg/intl/test/find_default_locale_standalone_test.dart b/pkg/intl/test/find_default_locale_standalone_test.dart
index 80bb454..2518133 100644
--- a/pkg/intl/test/find_default_locale_standalone_test.dart
+++ b/pkg/intl/test/find_default_locale_standalone_test.dart
@@ -7,7 +7,6 @@
 import 'package:intl/intl.dart';
 import 'package:intl/intl_standalone.dart';
 import 'package:unittest/unittest.dart';
-import 'dart:io';
 
 main() {
   test("Find system locale standalone", () {
diff --git a/pkg/intl/test/intl_message_basic_example_test.dart b/pkg/intl/test/intl_message_basic_example_test.dart
index e9281ee..249776c 100644
--- a/pkg/intl/test/intl_message_basic_example_test.dart
+++ b/pkg/intl/test/intl_message_basic_example_test.dart
@@ -7,7 +7,6 @@
  */
 library intl_message_test_2;
 
-import 'package:intl/intl.dart';
 import '../example/basic/basic_example.dart';
 import 'package:unittest/unittest.dart';
 import 'dart:async';
diff --git a/pkg/intl/test/message_extraction/extract_to_json.dart b/pkg/intl/test/message_extraction/extract_to_json.dart
index 4c1d718..9720506 100644
--- a/pkg/intl/test/message_extraction/extract_to_json.dart
+++ b/pkg/intl/test/message_extraction/extract_to_json.dart
@@ -33,6 +33,8 @@
   var parser = new ArgParser();
   parser.addFlag("suppress-warnings", defaultsTo: false,
       callback: (x) => suppressWarnings = x);
+  parser.addFlag("warnings-are-errors", defaultsTo: false,
+      callback: (x) => warningsAreErrors = x);
 
   parser.addOption("output-dir", defaultsTo: '.',
       callback: (value) => targetDir = value);
@@ -49,6 +51,9 @@
   }
   var file = new File(path.join(targetDir, 'intl_messages.json'));
   file.writeAsStringSync(json.stringify(allMessages));
+  if (hasWarnings && warningsAreErrors) {
+    exit(1);
+  }
 }
 
 /**
diff --git a/pkg/intl/test/message_extraction/failed_extraction_test.dart b/pkg/intl/test/message_extraction/failed_extraction_test.dart
new file mode 100644
index 0000000..38361b8
--- /dev/null
+++ b/pkg/intl/test/message_extraction/failed_extraction_test.dart
@@ -0,0 +1,16 @@
+import "message_extraction_test.dart";
+import "dart:io";
+import "package:unittest/unittest.dart";
+
+main() {
+  run(null, ["extract_to_json.dart",
+      "sample_with_messages.dart", "part_of_sample_with_messages.dart"])
+    .then((ProcessResult result) {
+      expect(result.exitCode, 0);
+  });
+  run(null, ["extract_to_json.dart", "--warnings-are-errors",
+      "sample_with_messages.dart", "part_of_sample_with_messages.dart"])
+    .then((ProcessResult result) {
+      expect(result.exitCode, 1);
+    });
+}
\ No newline at end of file
diff --git a/pkg/intl/test/message_extraction/generate_from_json.dart b/pkg/intl/test/message_extraction/generate_from_json.dart
index 70cc5bd..ef79fb6 100644
--- a/pkg/intl/test/message_extraction/generate_from_json.dart
+++ b/pkg/intl/test/message_extraction/generate_from_json.dart
@@ -18,7 +18,6 @@
 import 'dart:io';
 import 'package:intl/extract_messages.dart';
 import 'package:intl/src/intl_message.dart';
-import 'extract_to_json.dart';
 import 'package:intl/generate_localized.dart';
 import 'dart:json' as json;
 import 'package:path/path.dart' as path;
diff --git a/pkg/intl/test/message_extraction/make_hardcoded_translation.dart b/pkg/intl/test/message_extraction/make_hardcoded_translation.dart
index 1fddfaf..dd907de 100644
--- a/pkg/intl/test/message_extraction/make_hardcoded_translation.dart
+++ b/pkg/intl/test/message_extraction/make_hardcoded_translation.dart
@@ -61,7 +61,7 @@
       ], null)),
   // TODO(alanknight): These are pretty horrible to write out manually. Provide
   // a better way of reading/writing translations. A real format would be good.
-  "whereTheyWent" : writer.write(new Gender.from("gender",
+  "whereTheyWentMessage" : writer.write(new Gender.from("gender",
     [
       ["male", [0, " est allé à sa ", 2]],
       ["female", [0, " est allée à sa ", 2]],
@@ -103,6 +103,21 @@
             [["male", "\$number homme"], ["other", "\$number autre"]], null),
         ]
       ], null)),
+  "outerSelect" : writer.write(new Select.from("currency",
+      [
+        ['CDN', '\$amount dollars Canadiens'],
+        ['other', '\$amount certaine devise ou autre.'],
+      ], null)),
+  "nestedSelect" : writer.write(new Select.from("currency",
+      [
+        ['CDN', new Plural.from('amount',
+            [
+              ["other", '\$amount dollars Canadiens'],
+              ["one", '\$amount dollar Canadien'],
+            ], null)
+        ],
+        ['other', 'N''importe quoi'],
+      ], null)),
 };
 
 /** A list of the German translations that we will produce. */
@@ -131,7 +146,7 @@
     ], null)),
   // TODO(alanknight): These are pretty horrible to write out manually. Provide
   // a better way of reading/writing translations. A real format would be good.
-  "whereTheyWent" : writer.write(new Gender.from("gender",
+  "whereTheyWentMessage" : writer.write(new Gender.from("gender",
     [
       ["male", [0, " ging zu seinem ", 2]],
       ["female", [0, " ging zu ihrem ", 2]],
@@ -174,6 +189,21 @@
           [["male", "\$number Mann"], ["other", "\$number andere"]], null),
         ]
        ], null)),
+  "outerSelect" : writer.write(new Select.from("currency",
+      [
+        ['CDN', '\$amount Kanadischen dollar'],
+        ['other', '\$amount einige Währung oder anderen.'],
+      ], null)),
+  "nestedSelect" : writer.write(new Select.from("currency",
+      [
+        ['CDN', new Plural.from('amount',
+            [
+              ["other", '\$amount Kanadischen dollar'],
+              ["one", '\$amount Kanadischer dollar'],
+            ], null)
+        ],
+        ['other', 'whatever'],
+      ], null)),
 };
 
 /** The output directory for translated files. */
diff --git a/pkg/intl/test/message_extraction/message_extraction_test.dart b/pkg/intl/test/message_extraction/message_extraction_test.dart
index ff856f0..40c664e 100644
--- a/pkg/intl/test/message_extraction/message_extraction_test.dart
+++ b/pkg/intl/test/message_extraction/message_extraction_test.dart
@@ -177,6 +177,10 @@
   verify('m');
   verify('f');
   verify('7 male');
+  verify('7 Canadian dollars');
+  verify('5 some currency or other.');
+  verify('1 Canadian dollar');
+  verify('2 Canadian dollars');
 
   var fr_lines = lines.skip(1).skipWhile(
       (line) => !line.contains('----')).toList();
@@ -220,6 +224,10 @@
   verify('homme');
   verify('femme');
   verify('7 homme');
+  verify('7 dollars Canadiens');
+  verify('5 certaine devise ou autre.');
+  verify('1 dollar Canadien');
+  verify('2 dollars Canadiens');
 
   var de_lines = fr_lines.skip(1).skipWhile(
       (line) => !line.contains('----')).toList();
@@ -263,4 +271,8 @@
   verify('Mann');
   verify('Frau');
   verify('7 Mann');
+  verify('7 Kanadischen dollar');
+  verify('5 einige Währung oder anderen.');
+  verify('1 Kanadischer dollar');
+  verify('2 Kanadischen dollar');
 }
diff --git a/pkg/intl/test/message_extraction/part_of_sample_with_messages.dart b/pkg/intl/test/message_extraction/part_of_sample_with_messages.dart
index 2d36862..085459c 100644
--- a/pkg/intl/test/message_extraction/part_of_sample_with_messages.dart
+++ b/pkg/intl/test/message_extraction/part_of_sample_with_messages.dart
@@ -44,7 +44,7 @@
             female: '$name went to her $place',
             other: '$name went to its $place')
         }",
-        name: "whereTheyWent",
+        name: "whereTheyWentMessage",
         args: [name, gender, place],
         desc: 'A person went to some place that they own, e.g. their room'
     );
diff --git a/pkg/intl/test/message_extraction/sample_with_messages.dart b/pkg/intl/test/message_extraction/sample_with_messages.dart
index 9bad4b9..292273c 100644
--- a/pkg/intl/test/message_extraction/sample_with_messages.dart
+++ b/pkg/intl/test/message_extraction/sample_with_messages.dart
@@ -10,9 +10,6 @@
 library sample;
 
 import "package:intl/intl.dart";
-import "package:intl/message_lookup_by_library.dart";
-import "dart:async";
-import "package:intl/src/intl_helpers.dart";
 import "foo_messages_all.dart";
 
 part 'part_of_sample_with_messages.dart';
@@ -38,7 +35,7 @@
 
 // This string will be printed with a French locale, so it will always show
 // up in the French version, regardless of the current locale.
-alwaysAccented() =>
+alwaysTranslated() =>
     Intl.message("This string is always translated", locale: 'fr',
         name: 'alwaysTranslated');
 
@@ -78,6 +75,25 @@
 // be rejected by validation code.
 invalidOuterGender(g) => Intl.gender(g, other: 'o');
 
+// A general select
+outerSelect(currency, amount) => Intl.select(currency,
+    {
+      "CDN" : "$amount Canadian dollars",
+      "other" : "$amount some currency or other."
+    },
+    name: "outerSelect",
+    args: [currency, amount]);
+
+// A select with a plural inside the expressions.
+nestedSelect(currency, amount) => Intl.select(currency,
+    {
+      "CDN" : """${Intl.plural(amount, one: '$amount Canadian dollar',
+          other: '$amount Canadian dollars')}""",
+      "other" : "Whatever",
+    },
+    name: "nestedSelect",
+    args: [currency, amount]);
+
 // A trivial nested plural/gender where both are done directly rather than
 // in interpolations.
 nestedOuter(number, gen) => Intl.plural(number,
@@ -99,14 +115,15 @@
     }
   }
 
-  // A function that is unnamed and assigned to a variable. It's also nested
+  // A function that is assigned to a variable. It's also nested
   // within another function definition.
-  var messageVariable = (a, b, c) => Intl.message(
+  message3(a, b, c) => Intl.message(
       "Characters that need escaping, e.g slashes \\ dollars \${ (curly braces "
       "are ok) and xml reserved characters <& and quotes \" "
       "parameters $a, $b, and $c",
       name: 'message3',
       args: [a, b, c]);
+  var messageVariable = message3;
 
   print("-------------------------------------------");
   print("Printing messages for ${locale.locale}");
@@ -117,7 +134,7 @@
     print(multiLine());
     print(types(1, "b", ["c", "d"]));
     print(leadingQuotes());
-    print(alwaysAccented());
+    print(alwaysTranslated());
     print(trickyInterpolation("this"));
     var thing = new YouveGotMessages();
     print(thing.method());
@@ -148,6 +165,10 @@
     print(outerGender("male"));
     print(outerGender("female"));
     print(nestedOuter(7, "male"));
+    print(outerSelect("CDN", 7));
+    print(outerSelect("EUR", 5));
+    print(nestedSelect("CDN", 1));
+    print(nestedSelect("CDN", 2));
   });
 }
 
diff --git a/pkg/intl/test/number_format_test.dart b/pkg/intl/test/number_format_test.dart
index 2306470..3b9aed6 100644
--- a/pkg/intl/test/number_format_test.dart
+++ b/pkg/intl/test/number_format_test.dart
@@ -7,7 +7,6 @@
 library number_format_test;
 
 import 'package:unittest/unittest.dart';
-import 'package:intl/number_symbols.dart';
 import 'package:intl/number_symbols_data.dart';
 import 'package:intl/intl.dart';
 import 'number_test_data.dart';
diff --git a/pkg/intl/tool/generate_locale_data_files.dart b/pkg/intl/tool/generate_locale_data_files.dart
index 6c77a87..b1ffb3f 100644
--- a/pkg/intl/tool/generate_locale_data_files.dart
+++ b/pkg/intl/tool/generate_locale_data_files.dart
@@ -12,7 +12,6 @@
  * which is sourced by the date_symbol_data... files.
  */
 
-import '../lib/date_symbols.dart';
 import '../lib/date_symbol_data_local.dart';
 import '../lib/date_time_patterns.dart';
 import '../lib/intl.dart';
diff --git a/pkg/mdv/lib/mdv.dart b/pkg/mdv/lib/mdv.dart
index feec831..fe9d9c8 100644
--- a/pkg/mdv/lib/mdv.dart
+++ b/pkg/mdv/lib/mdv.dart
@@ -5,15 +5,13 @@
 // TODO(jmesserly): more commentary here.
 /**
  * This library provides access to Model-Driven-Views APIs on HTML elements.
- * More information can be found at: <https://github.com/toolkitchen/mdv>.
+ * More information can be found at: <https://github.com/Polymer/mdv>.
  */
 library mdv;
 
 import 'dart:async';
 import 'dart:collection';
 import 'dart:html';
-import 'dart:math' as math;
-import 'dart:mirrors';
 import 'package:observe/observe.dart';
 
 // TODO(jmesserly): get this from somewhere else. See http://dartbug.com/4161.
diff --git a/pkg/mdv/lib/src/element.dart b/pkg/mdv/lib/src/element.dart
index a126161..d1f62da 100644
--- a/pkg/mdv/lib/src/element.dart
+++ b/pkg/mdv/lib/src/element.dart
@@ -13,6 +13,10 @@
   // (see "BindImperative" test in original JS code).
   NodeBinding createBinding(String name, model, String path) =>
       new _AttributeBinding(node, name, model, path);
+
+  // Normally we issue this error in Element._ensureTemplate, but we
+  // avoid calling that from the model getter, so issue the error here.
+  get model => throw new UnsupportedError('$node is not a template.');
 }
 
 class _AttributeBinding extends NodeBinding {
diff --git a/pkg/mdv/test/binding_syntax_test.dart b/pkg/mdv/test/binding_syntax_test.dart
index 9ef9c68..b4d0381 100644
--- a/pkg/mdv/test/binding_syntax_test.dart
+++ b/pkg/mdv/test/binding_syntax_test.dart
@@ -4,7 +4,6 @@
 
 library binding_syntax_test;
 
-import 'dart:async';
 import 'dart:collection';
 import 'dart:html';
 import 'package:mdv/mdv.dart' as mdv;
diff --git a/pkg/mdv/test/custom_element_bindings_test.dart b/pkg/mdv/test/custom_element_bindings_test.dart
index c4dd565..882bf16 100644
--- a/pkg/mdv/test/custom_element_bindings_test.dart
+++ b/pkg/mdv/test/custom_element_bindings_test.dart
@@ -4,10 +4,8 @@
 
 library custom_element_bindings_test;
 
-import 'dart:async';
 import 'dart:html';
 import 'package:mdv/mdv.dart' as mdv;
-import 'package:observe/observe.dart';
 import 'package:unittest/html_config.dart';
 import 'package:unittest/unittest.dart';
 import 'mdv_test_utils.dart';
diff --git a/pkg/mdv/test/mdv_test_utils.dart b/pkg/mdv/test/mdv_test_utils.dart
index 1b068c2..3033fba 100644
--- a/pkg/mdv/test/mdv_test_utils.dart
+++ b/pkg/mdv/test/mdv_test_utils.dart
@@ -4,7 +4,6 @@
 
 library observe_utils;
 
-import 'dart:async';
 import 'dart:html';
 import 'package:observe/observe.dart';
 import 'package:unittest/unittest.dart';
diff --git a/pkg/mdv/test/node_bindings_test.dart b/pkg/mdv/test/node_bindings_test.dart
index fa0413f..2609d9c 100644
--- a/pkg/mdv/test/node_bindings_test.dart
+++ b/pkg/mdv/test/node_bindings_test.dart
@@ -4,10 +4,8 @@
 
 library node_bindings_test;
 
-import 'dart:async';
 import 'dart:html';
 import 'package:mdv/mdv.dart' as mdv;
-import 'package:observe/observe.dart';
 import 'package:unittest/html_config.dart';
 import 'package:unittest/unittest.dart';
 import 'mdv_test_utils.dart';
diff --git a/pkg/mime/pubspec.yaml b/pkg/mime/pubspec.yaml
index 82493f8..174820c 100644
--- a/pkg/mime/pubspec.yaml
+++ b/pkg/mime/pubspec.yaml
@@ -1,5 +1,6 @@
 name: mime
-author: "Dart Team <misc@dartlang.org>"
+author: Dart Team <misc@dartlang.org>
+description: Helper-package for working with MIME.
 homepage: http://www.dartlang.org
-description: >
- Helper-package for working with MIME.
+dev_dependencies:
+  unittest: any
diff --git a/pkg/mime/test/mime_multipart_transformer_test.dart b/pkg/mime/test/mime_multipart_transformer_test.dart
index 43b542f..7d7baca 100644
--- a/pkg/mime/test/mime_multipart_transformer_test.dart
+++ b/pkg/mime/test/mime_multipart_transformer_test.dart
@@ -6,7 +6,6 @@
 import "package:mime/mime.dart";
 import 'dart:async';
 import 'dart:math';
-import 'dart:isolate';
 
 void testParse(String message,
                String boundary,
diff --git a/pkg/mutation_observer/test/mutation_observer_test.dart b/pkg/mutation_observer/test/mutation_observer_test.dart
index c4c84e3e4..24dbccf 100644
--- a/pkg/mutation_observer/test/mutation_observer_test.dart
+++ b/pkg/mutation_observer/test/mutation_observer_test.dart
@@ -62,7 +62,7 @@
       var mutationObserver = new MutationObserver(
           (mutations, observer) { expect(false, isTrue,
               reason: 'Should not be reached'); });
-      expect(() { mutationObserver.observe(document, {}); },
+      expect(() { mutationObserver.observe(document); },
              throws);
     });
 
diff --git a/pkg/oauth2/lib/src/authorization_exception.dart b/pkg/oauth2/lib/src/authorization_exception.dart
index d48c3b1..2a19cd1 100644
--- a/pkg/oauth2/lib/src/authorization_exception.dart
+++ b/pkg/oauth2/lib/src/authorization_exception.dart
@@ -4,8 +4,6 @@
 
 library authorization_exception;
 
-import 'dart:io';
-
 /// An exception raised when OAuth2 authorization fails.
 class AuthorizationException implements Exception {
   /// The name of the error. Possible names are enumerated in [the spec][].
diff --git a/pkg/oauth2/lib/src/expiration_exception.dart b/pkg/oauth2/lib/src/expiration_exception.dart
index 8c8ad1f..9829de1 100644
--- a/pkg/oauth2/lib/src/expiration_exception.dart
+++ b/pkg/oauth2/lib/src/expiration_exception.dart
@@ -4,8 +4,6 @@
 
 library expiration_exception;
 
-import 'dart:io';
-
 import 'credentials.dart';
 
 /// An exception raised when attempting to use expired OAuth2 credentials.
diff --git a/pkg/oauth2/lib/src/utils.dart b/pkg/oauth2/lib/src/utils.dart
index 759357e..12a429e 100644
--- a/pkg/oauth2/lib/src/utils.dart
+++ b/pkg/oauth2/lib/src/utils.dart
@@ -5,9 +5,6 @@
 library utils;
 
 import 'dart:async';
-import 'dart:isolate';
-
-import "package:crypto/crypto.dart";
 
 /// Adds additional query parameters to [url], overwriting the original
 /// parameters if a name conflict occurs.
diff --git a/pkg/oauth2/test/authorization_code_grant_test.dart b/pkg/oauth2/test/authorization_code_grant_test.dart
index 0d4a5fc..473fee1 100644
--- a/pkg/oauth2/test/authorization_code_grant_test.dart
+++ b/pkg/oauth2/test/authorization_code_grant_test.dart
@@ -5,12 +5,10 @@
 library authorization_code_grant_test;
 
 import 'dart:async';
-import 'dart:io';
 import 'dart:json' as JSON;
 
 import 'package:unittest/unittest.dart';
 import 'package:http/http.dart' as http;
-import 'package:http/testing.dart';
 import 'package:oauth2/oauth2.dart' as oauth2;
 
 import 'utils.dart';
diff --git a/pkg/oauth2/test/client_test.dart b/pkg/oauth2/test/client_test.dart
index d55eef7..922302d 100644
--- a/pkg/oauth2/test/client_test.dart
+++ b/pkg/oauth2/test/client_test.dart
@@ -5,7 +5,6 @@
 library client_test;
 
 import 'dart:async';
-import 'dart:io';
 import 'dart:json' as JSON;
 
 import 'package:http/http.dart' as http;
diff --git a/pkg/oauth2/test/credentials_test.dart b/pkg/oauth2/test/credentials_test.dart
index 768b85a..6a873f2 100644
--- a/pkg/oauth2/test/credentials_test.dart
+++ b/pkg/oauth2/test/credentials_test.dart
@@ -5,7 +5,6 @@
 library credentials_test;
 
 import 'dart:async';
-import 'dart:io';
 import 'dart:json' as JSON;
 
 import 'package:http/http.dart' as http;
@@ -82,7 +81,7 @@
       }), 200, headers: {'content-type': 'application/json'}));
     });
 
-    
+
     expect(credentials.refresh('identifier', 'secret', httpClient: httpClient)
         .then((credentials) {
       expect(credentials.accessToken, equals('new access token'));
@@ -111,7 +110,7 @@
       }), 200, headers: {'content-type': 'application/json'}));
     });
 
-    
+
     expect(credentials.refresh('identifier', 'secret', httpClient: httpClient)
         .then((credentials) {
       expect(credentials.accessToken, equals('new access token'));
diff --git a/pkg/oauth2/test/handle_access_token_response_test.dart b/pkg/oauth2/test/handle_access_token_response_test.dart
index 45860ab..10e6f75 100644
--- a/pkg/oauth2/test/handle_access_token_response_test.dart
+++ b/pkg/oauth2/test/handle_access_token_response_test.dart
@@ -4,7 +4,6 @@
 
 library handle_access_token_response_test;
 
-import 'dart:io';
 import 'dart:json' as JSON;
 
 import 'package:http/http.dart' as http;
diff --git a/pkg/observe/lib/observe.dart b/pkg/observe/lib/observe.dart
index 06136df..f2f8283 100644
--- a/pkg/observe/lib/observe.dart
+++ b/pkg/observe/lib/observe.dart
@@ -80,10 +80,6 @@
 // above.
 import 'src/dirty_check.dart';
 
-// TODO(jmesserly): should this be public? For now we're just using it inside
-// Polymer.
-import 'src/microtask.dart';
-
 part 'src/change_notifier.dart';
 part 'src/change_record.dart';
 part 'src/compound_binding.dart';
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index 6479be6..77f2bc4 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -1,11 +1,13 @@
 name: observe
-author: "Web UI Team <web-ui-dev@dartlang.org>"
-homepage: https://github.com/dart-lang/web-ui
+author: Web UI Team <web-ui-dev@dartlang.org>
 description: >
   Observable properties and objects for use in Model-Driven-Views (MDV).
   MDV extends HTML and the DOM APIs to support a sensible separation between the
   UI (DOM) of a document or application and its underlying data (model).
   Updates to the model are reflected in the DOM and user input into the DOM is
   immediately assigned to the model.
+homepage: https://github.com/dart-lang/web-ui
+dependencies:
+  logging: any
 dev_dependencies:
   unittest: any
diff --git a/pkg/observe/test/observe_test_utils.dart b/pkg/observe/test/observe_test_utils.dart
index fe3e869..2937c07 100644
--- a/pkg/observe/test/observe_test_utils.dart
+++ b/pkg/observe/test/observe_test_utils.dart
@@ -4,8 +4,6 @@
 
 library observe.test.observe_test_utils;
 
-import 'dart:async';
-import 'package:observe/observe.dart';
 import 'package:unittest/unittest.dart';
 
 import 'package:observe/src/microtask.dart';
diff --git a/pkg/path/pubspec.yaml b/pkg/path/pubspec.yaml
index 35047ac..a366122 100644
--- a/pkg/path/pubspec.yaml
+++ b/pkg/path/pubspec.yaml
@@ -1,8 +1,10 @@
 name: path
-author: "Dart Team <misc@dartlang.org>"
-homepage: http://www.dartlang.org
-documentation: http://api.dartlang.org/docs/pkg/path
+author: Dart Team <misc@dartlang.org>
 description: >
  A string-based path manipulation library. All of the path operations you know
  and love, with solid support on both Windows and POSIX (Linux and Mac OS X)
  machines.
+homepage: http://www.dartlang.org
+documentation: http://api.dartlang.org/docs/pkg/path
+dev_dependencies:
+  unittest: any
diff --git a/pkg/pkg.gyp b/pkg/pkg.gyp
index c06b517..3da13fc 100644
--- a/pkg/pkg.gyp
+++ b/pkg/pkg.gyp
@@ -13,6 +13,8 @@
           'inputs': [
             '../tools/make_links.py',
             '<!@(["python", "../tools/list_pkg_directories.py", "."])',
+            '<!@(["python", "../tools/list_pkg_directories.py", '
+                '"../third_party/pkg"])',
           ],
           'outputs': [
             '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
@@ -24,24 +26,6 @@
             '<@(_inputs)',
           ],
         },
-        {
-          'action_name': 'make_third_party_packages',
-          'inputs': [
-            '../tools/make_links.py',
-            '<!@(["python", "../tools/list_pkg_directories.py", '
-                '"../third_party/pkg"])',
-          ],
-          'outputs': [
-            '<(SHARED_INTERMEDIATE_DIR)/third_party_packages.stamp',
-          ],
-          'action': [
-            'python', '../tools/make_links.py',
-            '--timestamp_file=<(SHARED_INTERMEDIATE_DIR)/third_party_packages.'
-                'stamp',
-            '<(PRODUCT_DIR)/packages',
-            '<@(_inputs)',
-          ],
-        },
       ],
     }
   ],
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 7eeb233..0c4304c 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -15,9 +15,14 @@
 scheduled_test/test/scheduled_server_test: Pass, Fail, Slow, Crash # Issue 9231, 9582
 scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
 
-[ $runtime == vm ]
-watcher/test/no_subscription_test: Pass, Fail # Issue 12107
-watcher/test/directory_watcher_test: Pass, Fail # Issue 12107
+[ $compiler == dart2js ]
+analyzer_experimental/test/generated/ast_test: Fail #Issue 12341
+
+[ $compiler == dart2js && ($runtime == d8 || $runtime == drt) ]
+crypto/test/hmac_sha256_test: Pass, Fail # v8 bug: Issue 12293
+crypto/test/sha1_test: Pass, Fail # v8 bug: Issue 12293
+crypto/test/sha256_test: Pass, Fail # v8 bug: Issue 12293
+path/test/relative_test: Pass, Fail # v8 bug: Issue 12293
 
 [ $runtime == d8 || $runtime == jsshell ]
 unittest/test/unittest_nested_groups_setup_teardown_test: Pass, Fail # http://dartbug.com/10109
@@ -40,6 +45,9 @@
 intl/test/date_time_format_http_request_test: Fail # Issue 8983
 mime/test/mime_multipart_transformer_test: Skip # No typed_data on IE9.
 
+[ $runtime == chrome && $compiler == dart2js ]
+intl/test/date_time_format_http_request_test: Pass, Fail # Issue: 12239
+
 [ $runtime == safari ]
 fixnum/test/int_64_test: Pass, Fail # Bug in JSC.
 crypto/test/hmac_sha1_test: Fail # Issue 11407.
@@ -57,7 +65,6 @@
 intl/test/message_extraction/message_extraction_test: Fail # Issue 9167
 
 [ $compiler == dart2js ]
-analyzer_experimental/test/generated/ast_test: Fail, Slow # Issue 11230
 stack_trace/test/trace_test: Pass, Timeout # Issue 11645
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer]
@@ -107,6 +114,7 @@
 intl/test/date_time_format_file_odd_test: Fail, OK # Uses dart:io.
 intl/test/find_default_locale_standalone_test: Fail, OK # Uses dart:io.
 intl/test/message_extraction/message_extraction_test: Fail, OK # Uses dart:io.
+intl/test/message_extraction/failed_extraction_test: Fail, OK # Users dart:io
 oauth2/test/authorization_code_grant_test: Fail, OK # Uses dart:io.
 oauth2/test/client_test: Fail, OK # Uses dart:io.
 oauth2/test/credentials_test: Fail, OK # Uses dart:io.
@@ -168,7 +176,6 @@
 # test on Dartium, which requires all tests to have a library.
 [ $runtime == dartium || $runtime == drt ]
 serialization/test/no_library_test: Skip # Expected Failure
-mdv/test/template_element_test: Pass, Fail # Issue 12177
 
 # Skip tests on the VM if the package depends on dart:html
 [ $runtime == vm ]
@@ -179,3 +186,6 @@
 [ $runtime == safari || $runtime == chrome || $runtime == ie9 || $runtime == ff || $runtime == dartium || $runtime == drt ]
 docgen/test/single_library_test: Skip # Uses dart:io
 
+[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
+# TODO(vsm): Triage from latest Blink merge
+custom_element/test/custom_element_test: Skip
diff --git a/pkg/scheduled_test/lib/scheduled_server.dart b/pkg/scheduled_test/lib/scheduled_server.dart
index 293545b..8c1ad81 100644
--- a/pkg/scheduled_test/lib/scheduled_server.dart
+++ b/pkg/scheduled_test/lib/scheduled_server.dart
@@ -9,7 +9,6 @@
 import 'dart:io';
 
 import 'scheduled_test.dart';
-import 'src/utils.dart';
 import 'src/scheduled_server/handler.dart';
 import 'src/scheduled_server/safe_http_server.dart';
 
diff --git a/pkg/scheduled_test/lib/scheduled_test.dart b/pkg/scheduled_test/lib/scheduled_test.dart
index 05beb14..c91aad7 100644
--- a/pkg/scheduled_test/lib/scheduled_test.dart
+++ b/pkg/scheduled_test/lib/scheduled_test.dart
@@ -195,7 +195,6 @@
 
 import 'src/schedule.dart';
 import 'src/schedule_error.dart';
-import 'src/utils.dart';
 
 export 'package:unittest/matcher.dart' hide completes, completion;
 export 'package:unittest/unittest.dart' show
@@ -327,7 +326,7 @@
         _setUpFn = setUpFn;
       }
     });
- 
+
     unittest.tearDown(() {
       _currentSchedule = null;
       _setUpFn = null;
diff --git a/pkg/scheduled_test/lib/src/descriptor/async_descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/async_descriptor.dart
index e46e17b..95eff42 100644
--- a/pkg/scheduled_test/lib/src/descriptor/async_descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/async_descriptor.dart
@@ -5,11 +5,9 @@
 library descriptor.async;
 
 import 'dart:async';
-import 'dart:io' as io;
 
 import '../../descriptor.dart';
 import '../../scheduled_test.dart';
-import '../utils.dart';
 
 /// A descriptor that wraps a [Future<Descriptor>] and forwards all asynchronous
 /// operations to the result of the future. It's designed for use when the full
diff --git a/pkg/scheduled_test/lib/src/descriptor/descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/descriptor.dart
index 82342c4..2be0b59 100644
--- a/pkg/scheduled_test/lib/src/descriptor/descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/descriptor.dart
@@ -6,8 +6,6 @@
 
 import 'dart:async';
 
-import '../utils.dart';
-
 /// The base class for various declarative descriptions of filesystem entries.
 /// All asynchronous operations on descriptors are [schedule]d unless otherwise
 /// noted.
diff --git a/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
index 483a9cf..8a80be2 100644
--- a/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
@@ -11,7 +11,6 @@
 
 import '../../descriptor.dart';
 import '../../scheduled_test.dart';
-import '../utils.dart';
 
 /// A descriptor that validates that no file exists with the given name.
 /// Creating this descriptor is a no-op and loading from it is invalid.
diff --git a/pkg/scheduled_test/lib/src/schedule.dart b/pkg/scheduled_test/lib/src/schedule.dart
index 9fecc99..ab21150 100644
--- a/pkg/scheduled_test/lib/src/schedule.dart
+++ b/pkg/scheduled_test/lib/src/schedule.dart
@@ -8,14 +8,12 @@
 import 'dart:collection';
 
 import 'package:stack_trace/stack_trace.dart';
-import 'package:unittest/unittest.dart' as unittest;
 
 import 'mock_clock.dart' as mock_clock;
 import 'schedule_error.dart';
 import 'substitute_future.dart';
 import 'task.dart';
 import 'utils.dart';
-import 'value_future.dart';
 
 /// The schedule of tasks to run for a single test. This has three separate task
 /// queues: [tasks], [onComplete], and [onException]. It also provides
diff --git a/pkg/scheduled_test/lib/src/scheduled_server/handler.dart b/pkg/scheduled_test/lib/src/scheduled_server/handler.dart
index 4d6c6b8..8f61be1 100644
--- a/pkg/scheduled_test/lib/src/scheduled_server/handler.dart
+++ b/pkg/scheduled_test/lib/src/scheduled_server/handler.dart
@@ -5,7 +5,6 @@
 library scheduled_server.handler;
 
 import 'dart:async';
-import 'dart:io';
 
 import '../../scheduled_server.dart';
 import '../../scheduled_test.dart';
diff --git a/pkg/scheduled_test/lib/src/task.dart b/pkg/scheduled_test/lib/src/task.dart
index 44f6833..8d0ec18 100644
--- a/pkg/scheduled_test/lib/src/task.dart
+++ b/pkg/scheduled_test/lib/src/task.dart
@@ -9,7 +9,6 @@
 
 import 'package:stack_trace/stack_trace.dart';
 
-import '../scheduled_test.dart' show currentSchedule;
 import 'future_group.dart';
 import 'schedule.dart';
 import 'utils.dart';
diff --git a/pkg/scheduled_test/test/descriptor/async_test.dart b/pkg/scheduled_test/test/descriptor/async_test.dart
index 46f5ef3..b4fde98 100644
--- a/pkg/scheduled_test/test/descriptor/async_test.dart
+++ b/pkg/scheduled_test/test/descriptor/async_test.dart
@@ -3,9 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 
-import 'package:path/path.dart' as path;
 import 'package:scheduled_test/descriptor.dart' as d;
 import 'package:scheduled_test/scheduled_test.dart';
 
diff --git a/pkg/scheduled_test/test/descriptor/file_test.dart b/pkg/scheduled_test/test/descriptor/file_test.dart
index bf22905..e22a992 100644
--- a/pkg/scheduled_test/test/descriptor/file_test.dart
+++ b/pkg/scheduled_test/test/descriptor/file_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
 import 'dart:io';
 
 import 'package:path/path.dart' as path;
diff --git a/pkg/scheduled_test/test/descriptor/nothing_test.dart b/pkg/scheduled_test/test/descriptor/nothing_test.dart
index f925dcb..5d14592 100644
--- a/pkg/scheduled_test/test/descriptor/nothing_test.dart
+++ b/pkg/scheduled_test/test/descriptor/nothing_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
 import 'dart:io';
 
 import 'package:path/path.dart' as path;
diff --git a/pkg/scheduled_test/test/descriptor/pattern_test.dart b/pkg/scheduled_test/test/descriptor/pattern_test.dart
index 04dd3e5..7bd33a3 100644
--- a/pkg/scheduled_test/test/descriptor/pattern_test.dart
+++ b/pkg/scheduled_test/test/descriptor/pattern_test.dart
@@ -2,10 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-import 'dart:io';
-
-import 'package:path/path.dart' as path;
 import 'package:scheduled_test/descriptor.dart' as d;
 import 'package:scheduled_test/scheduled_test.dart';
 
diff --git a/pkg/scheduled_test/test/scheduled_future_matchers_test.dart b/pkg/scheduled_test/test/scheduled_future_matchers_test.dart
index bd253ba..e1e3699 100644
--- a/pkg/scheduled_test/test/scheduled_future_matchers_test.dart
+++ b/pkg/scheduled_test/test/scheduled_future_matchers_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 
 import 'package:scheduled_test/scheduled_test.dart';
 
diff --git a/pkg/scheduled_test/test/scheduled_process_test.dart b/pkg/scheduled_test/test/scheduled_process_test.dart
index 85f6eae..b855e02 100644
--- a/pkg/scheduled_test/test/scheduled_process_test.dart
+++ b/pkg/scheduled_test/test/scheduled_process_test.dart
@@ -10,7 +10,6 @@
 import 'package:path/path.dart' as path;
 import 'package:scheduled_test/scheduled_process.dart';
 import 'package:scheduled_test/scheduled_test.dart';
-import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
 
 import 'metatest.dart';
 import 'utils.dart';
diff --git a/pkg/scheduled_test/test/scheduled_test/abort_test.dart b/pkg/scheduled_test/test/scheduled_test/abort_test.dart
index 7fc8b1a..ef313a1 100644
--- a/pkg/scheduled_test/test/scheduled_test/abort_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/abort_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 
 import 'package:scheduled_test/scheduled_test.dart';
 
diff --git a/pkg/scheduled_test/test/scheduled_test/current_schedule_current_task_test.dart b/pkg/scheduled_test/test/scheduled_test/current_schedule_current_task_test.dart
index 5dc3361..ab8a19e 100644
--- a/pkg/scheduled_test/test/scheduled_test/current_schedule_current_task_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/current_schedule_current_task_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 
 import 'package:scheduled_test/scheduled_test.dart';
 
diff --git a/pkg/scheduled_test/test/scheduled_test/current_schedule_errors_test.dart b/pkg/scheduled_test/test/scheduled_test/current_schedule_errors_test.dart
index 4766b43..e372cc6 100644
--- a/pkg/scheduled_test/test/scheduled_test/current_schedule_errors_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/current_schedule_errors_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io' hide sleep;
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
diff --git a/pkg/scheduled_test/test/scheduled_test/current_schedule_state_test.dart b/pkg/scheduled_test/test/scheduled_test/current_schedule_state_test.dart
index 0c40ff9..15ddf29 100644
--- a/pkg/scheduled_test/test/scheduled_test/current_schedule_state_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/current_schedule_state_test.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-import 'dart:io';
-
 import 'package:scheduled_test/scheduled_test.dart';
 
 import '../metatest.dart';
diff --git a/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart b/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart
index 047cd3b..f4f8924 100644
--- a/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io' hide sleep;
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
diff --git a/pkg/scheduled_test/test/scheduled_test/on_complete_test.dart b/pkg/scheduled_test/test/scheduled_test/on_complete_test.dart
index 2c37da5..f9a02b9 100644
--- a/pkg/scheduled_test/test/scheduled_test/on_complete_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/on_complete_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 
 import 'package:scheduled_test/scheduled_test.dart';
 
diff --git a/pkg/scheduled_test/test/scheduled_test/on_exception_test.dart b/pkg/scheduled_test/test/scheduled_test/on_exception_test.dart
index 3e98864..8a97038 100644
--- a/pkg/scheduled_test/test/scheduled_test/on_exception_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/on_exception_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 
 import 'package:scheduled_test/scheduled_test.dart';
 
diff --git a/pkg/scheduled_test/test/scheduled_test/out_of_band_task_test.dart b/pkg/scheduled_test/test/scheduled_test/out_of_band_task_test.dart
index 35bd68e..b3cc1b6 100644
--- a/pkg/scheduled_test/test/scheduled_test/out_of_band_task_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/out_of_band_task_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io' hide sleep;
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
diff --git a/pkg/scheduled_test/test/scheduled_test/set_up_test.dart b/pkg/scheduled_test/test/scheduled_test/set_up_test.dart
index 5462f51..7d6c538 100644
--- a/pkg/scheduled_test/test/scheduled_test/set_up_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/set_up_test.dart
@@ -2,9 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-import 'dart:io';
-
 import 'package:scheduled_test/scheduled_test.dart';
 
 import '../metatest.dart';
diff --git a/pkg/scheduled_test/test/scheduled_test/signal_error_test.dart b/pkg/scheduled_test/test/scheduled_test/signal_error_test.dart
index ba52515..395157f 100644
--- a/pkg/scheduled_test/test/scheduled_test/signal_error_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/signal_error_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io' hide sleep;
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
diff --git a/pkg/scheduled_test/test/scheduled_test/simple_test.dart b/pkg/scheduled_test/test/scheduled_test/simple_test.dart
index 8c67bf3..7cf83ec 100644
--- a/pkg/scheduled_test/test/scheduled_test/simple_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/simple_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 
 import 'package:scheduled_test/scheduled_test.dart';
 
diff --git a/pkg/scheduled_test/test/scheduled_test/task_return_value_test.dart b/pkg/scheduled_test/test/scheduled_test/task_return_value_test.dart
index e597167..b935dd7 100644
--- a/pkg/scheduled_test/test/scheduled_test/task_return_value_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/task_return_value_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io' hide sleep;
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
diff --git a/pkg/scheduled_test/test/scheduled_test/timeout_test.dart b/pkg/scheduled_test/test/scheduled_test/timeout_test.dart
index ffcf32f..a14063a 100644
--- a/pkg/scheduled_test/test/scheduled_test/timeout_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/timeout_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io' hide sleep;
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
diff --git a/pkg/scheduled_test/test/scheduled_test/wrap_async_test.dart b/pkg/scheduled_test/test/scheduled_test/wrap_async_test.dart
index 322e17f..a83d66a 100644
--- a/pkg/scheduled_test/test/scheduled_test/wrap_async_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/wrap_async_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io' hide sleep;
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
diff --git a/pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart b/pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart
index 2a44cc5..add75ee 100644
--- a/pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io' hide sleep;
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
diff --git a/pkg/scheduled_test/test/utils.dart b/pkg/scheduled_test/test/utils.dart
index a52b137..88c0fa3 100644
--- a/pkg/scheduled_test/test/utils.dart
+++ b/pkg/scheduled_test/test/utils.dart
@@ -4,7 +4,6 @@
 
 library test_utils;
 
-import 'dart:io';
 import 'dart:async';
 
 import 'package:scheduled_test/scheduled_test.dart';
diff --git a/pkg/serialization/lib/serialization.dart b/pkg/serialization/lib/serialization.dart
index 5ec329d..2205181b 100644
--- a/pkg/serialization/lib/serialization.dart
+++ b/pkg/serialization/lib/serialization.dart
@@ -207,8 +207,6 @@
 
 import 'src/mirrors_helpers.dart';
 import 'src/serialization_helpers.dart';
-import 'dart:async';
-import 'dart:json' as json;
 import 'dart:collection';
 
 part 'src/reader_writer.dart';
diff --git a/pkg/serialization/test/serialization_test.dart b/pkg/serialization/test/serialization_test.dart
index 3c20605..abf0d2d 100644
--- a/pkg/serialization/test/serialization_test.dart
+++ b/pkg/serialization/test/serialization_test.dart
@@ -248,7 +248,7 @@
       } else {
         s = null;
         return new Serialization.blank()
-            ..namedObjects['Node'] = reflect(new Node('')).type;;
+            ..namedObjects['Node'] = reflect(new Node('')).type;
       }
     }
 
diff --git a/pkg/shadow_dom/lib/shadow_dom.debug.js b/pkg/shadow_dom/lib/shadow_dom.debug.js
index bd4252d..4ea1ab8 100644
--- a/pkg/shadow_dom/lib/shadow_dom.debug.js
+++ b/pkg/shadow_dom/lib/shadow_dom.debug.js
@@ -1437,10 +1437,19 @@
       // This only wraps, it therefore only operates on the composed DOM and not
       // the logical DOM.
       return originalCompareDocumentPosition.call(this.impl, unwrap(otherNode));
+    },
+
+    // TODO(jmesserly): this is a workaround for
+    // https://github.com/Polymer/ShadowDOM/issues/200
+    get ownerDocument() {
+      scope.renderAllPending();
+      return wrap(this.impl.ownerDocument);
     }
   });
 
-  defineWrapGetter(Node, 'ownerDocument');
+  // TODO(jmesserly): this is commented out to workaround:
+  // https://github.com/Polymer/ShadowDOM/issues/200
+  //defineWrapGetter(Node, 'ownerDocument');
 
   // We use a DocumentFragment as a base and then delete the properties of
   // DocumentFragment.prototype from the wrapper Node. Since delete makes
diff --git a/pkg/shadow_dom/lib/shadow_dom.min.js b/pkg/shadow_dom/lib/shadow_dom.min.js
index 8606fcf..e9d570e 100644
--- a/pkg/shadow_dom/lib/shadow_dom.min.js
+++ b/pkg/shadow_dom/lib/shadow_dom.min.js
@@ -1,2 +1,2 @@
-if(!HTMLElement.prototype.createShadowRoot&&!HTMLElement.prototype.webkitCreateShadowRoot||window.__forceShadowDomPolyfill){!function(){Element.prototype.webkitCreateShadowRoot&&(Element.prototype.webkitCreateShadowRoot=function(){return window.ShadowDOMPolyfill.wrapIfNeeded(this).createShadowRoot()})}();var SideTable;"undefined"!=typeof WeakMap&&navigator.userAgent.indexOf("Firefox/")<0?SideTable=WeakMap:function(){var a=Object.defineProperty,b=Object.hasOwnProperty,c=(new Date).getTime()%1e9;SideTable=function(){this.name="__st"+(1e9*Math.random()>>>0)+(c++ +"__")},SideTable.prototype={set:function(b,c){a(b,this.name,{value:c,writable:!0})},get:function(a){return b.call(a,this.name)?a[this.name]:void 0},"delete":function(a){this.set(a,void 0)}}}();var ShadowDOMPolyfill={};!function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a,b){return Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))}),a}function d(a,b){return Object.getOwnPropertyNames(b).forEach(function(c){switch(c){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":return}Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))}),a}function e(a){var b=a.__proto__||Object.getPrototypeOf(a),c=y.get(b);if(c)return c;var d=e(b),f=m(d);return j(b,f,a),f}function f(a,b){h(a,b,!0)}function g(a,b){h(b,a,!1)}function h(a,b,c){Object.getOwnPropertyNames(a).forEach(function(d){if(!(d in b)){A&&a.__lookupGetter__(d);var e;try{e=Object.getOwnPropertyDescriptor(a,d)}catch(f){e=B}var g,h;if(c&&"function"==typeof e.value)return b[d]=function(){return this.impl[d].apply(this.impl,arguments)},void 0;g=function(){return this.impl[d]},(e.writable||e.set)&&(h=function(a){this.impl[d]=a}),Object.defineProperty(b,d,{get:g,set:h,configurable:e.configurable,enumerable:e.enumerable})}})}function i(a,b,c){var e=a.prototype;j(e,b,c),d(b,a)}function j(a,c,d){var e=c.prototype;b(void 0===y.get(a)),y.set(a,c),f(a,e),d&&g(e,d)}function k(a,b){return y.get(b.prototype)===a}function l(a){var b=Object.getPrototypeOf(a),c=e(b),d=m(c);return j(b,d,a),d}function m(a){function b(b){a.call(this,b)}return b.prototype=Object.create(a.prototype),b.prototype.constructor=b,b._ShadowDOMPolyfill$isGeneratedWrapper=!0,b}function n(a){return a instanceof z.EventTarget||a instanceof z.Event||a instanceof z.DOMImplementation}function o(a){return a instanceof E||a instanceof D||a instanceof F||a instanceof C}function p(a){if(null===a)return null;b(o(a));var c=x.get(a);if(!c){var d=e(a);c=new d(a),x.set(a,c)}return c}function q(a){return null===a?null:(b(n(a)),a.impl)}function r(a){return a&&n(a)?q(a):a}function s(a){return a&&!n(a)?p(a):a}function t(a,c){null!==c&&(b(o(a)),b(void 0===c||n(c)),x.set(a,c))}function u(a,b,c){Object.defineProperty(a.prototype,b,{get:c,configurable:!0,enumerable:!0})}function v(a,b){u(a,b,function(){return p(this.impl[b])})}function w(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=p(this);return a[b].apply(a,arguments)}})})}var x=new SideTable,y=new SideTable,z=Object.create(null);Object.getOwnPropertyNames(window);var A=/Firefox/.test(navigator.userAgent),B={get:function(){},set:function(){},configurable:!0,enumerable:!0},C=DOMImplementation,D=Event,E=Node,F=Window;a.assert=b,a.defineGetter=u,a.defineWrapGetter=v,a.forwardMethodsToWrapper=w,a.isWrapper=n,a.isWrapperFor=k,a.mixin=c,a.registerObject=l,a.registerWrapper=i,a.rewrap=t,a.unwrap=q,a.unwrapIfNeeded=r,a.wrap=p,a.wrapIfNeeded=s,a.wrappers=z}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof J.ShadowRoot}function c(a){var b=a.localName;return"content"===b||"shadow"===b}function d(a){return!!a.shadowRoot}function e(a){var b;return a.parentNode||(b=a.defaultView)&&I(b)||null}function f(f,g,h){if(h.length)return h.shift();if(b(f))return f.insertionParent||a.getHostForShadowRoot(f);var i=a.eventParentsTable.get(f);if(i){for(var j=1;j<i.length;j++)h[j-1]=i[j];return i[0]}if(g&&c(f)){var k=f.parentNode;if(k&&d(k))for(var l=a.getShadowTrees(k),m=g.insertionParent,j=0;j<l.length;j++)if(l[j].contains(m))return m}return e(f)}function g(a){for(var d=[],e=a,g=[],i=[];e;){var j=null;if(c(e)){j=h(d);var k=d[d.length-1]||e;d.push(k)}else d.length||d.push(e);var l=d[d.length-1];g.push({target:l,currentTarget:e}),b(e)&&d.pop(),e=f(e,j,i)}return g}function h(a){for(var b=a.length-1;b>=0;b--)if(!c(a[b]))return a[b];return null}function i(d,e){for(var g=[];d;){for(var i=[],k=e,m=void 0;k;){var n=null;if(i.length){if(c(k)&&(n=h(i),j(m))){var o=i[i.length-1];i.push(o)}}else i.push(k);if(l(k,d))return i[i.length-1];b(k)&&i.pop(),m=k,k=f(k,n,g)}d=b(d)?a.getHostForShadowRoot(d):d.parentNode}}function j(a){return a.insertionParent}function k(a){for(var b;b=a.parentNode;)a=b;return a}function l(a,b){return k(a)===k(b)}function m(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function n(b){if(!L.get(b)){L.set(b,!0),m(b.type)||a.renderAllPending();var c=I(b.target),d=I(b);return o(d,c)}}function o(a,b){var c=g(b);return"load"===a.type&&2===c.length&&c[0].target instanceof J.Document&&c.shift(),p(a,c)&&q(a,c)&&r(a,c),P.set(a,u.NONE),N.set(a,null),a.defaultPrevented}function p(a,b){for(var c,d=b.length-1;d>0;d--){var e=b[d].target,f=b[d].currentTarget;if(e!==f&&(c=u.CAPTURING_PHASE,!s(b[d],a,c)))return!1}return!0}function q(a,b){var c=u.AT_TARGET;return s(b[0],a,c)}function r(a,b){for(var c,d=a.bubbles,e=1;e<b.length;e++){var f=b[e].target,g=b[e].currentTarget;if(f===g)c=u.AT_TARGET;else{if(!d||R.get(a))continue;c=u.BUBBLING_PHASE}if(!s(b[e],a,c))return}}function s(a,b,c){var d=a.target,e=a.currentTarget,f=K.get(e);if(!f)return!0;if("relatedTarget"in b){var g=H(b),h=I(g.relatedTarget),j=i(e,h);if(j===d)return!0;O.set(b,j)}P.set(b,c);var k=b.type,l=!1;M.set(b,d),N.set(b,e);for(var m=0;m<f.length;m++){var n=f[m];if(n.removed)l=!0;else if(!(n.type!==k||!n.capture&&c===u.CAPTURING_PHASE||n.capture&&c===u.BUBBLING_PHASE))try{if("function"==typeof n.handler?n.handler.call(e,b):n.handler.handleEvent(b),R.get(b))return!1}catch(o){window.onerror?window.onerror(o.message):console.error(o)}}if(l){var p=f.slice();f.length=0;for(var m=0;m<p.length;m++)p[m].removed||f.push(p[m])}return!Q.get(b)}function t(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function u(a,b){return a instanceof S?(this.impl=a,void 0):I(y(S,"Event",a,b))}function v(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:H(a.relatedTarget)}}):a}function w(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?(this.impl=b,void 0):I(y(d,a,b,c))};return e.prototype=Object.create(b.prototype),c&&F(e.prototype,c),d&&G(d,e,document.createEvent(a)),e}function x(a,b){return function(){arguments[b]=H(arguments[b]);var c=H(this);c[a].apply(c,arguments)}}function y(a,b,c,d){if(ab)return new a(c,v(d));var e=H(document.createEvent(b)),f=_[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=H(b)),g.push(b)}),e["init"+b].apply(e,g),e}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){this.impl=a}function B(b){return b instanceof J.ShadowRoot&&(b=a.getHostForShadowRoot(b)),H(b)}function C(a){E(a,db)}function D(b,c,d,e){a.renderAllPending();for(var f=I(eb.call(c.impl,d,e)),h=g(f,this),i=0;i<h.length;i++){var j=h[i];if(j.currentTarget===b)return j.target}return null}var E=a.forwardMethodsToWrapper,F=a.mixin,G=a.registerWrapper,H=a.unwrap,I=a.wrap,J=a.wrappers;new SideTable;var K=new SideTable,L=new SideTable,M=new SideTable,N=new SideTable,O=new SideTable,P=new SideTable,Q=new SideTable,R=new SideTable;t.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var S=window.Event;u.prototype={get target(){return M.get(this)},get currentTarget(){return N.get(this)},get eventPhase(){return P.get(this)},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),R.set(this,!0)}},G(S,u,document.createEvent("Event"));var T=w("UIEvent",u),U=w("CustomEvent",u),V={get relatedTarget(){return O.get(this)||I(H(this).relatedTarget)}},W=F({initMouseEvent:x("initMouseEvent",14)},V),X=F({initFocusEvent:x("initFocusEvent",5)},V),Y=w("MouseEvent",T,W),Z=w("FocusEvent",T,X),$=w("MutationEvent",u,{initMutationEvent:x("initMutationEvent",3),get relatedNode(){return I(this.impl.relatedNode)}}),_=Object.create(null),ab=function(){try{new window.MouseEvent("click")}catch(a){return!1}return!0}();if(!ab){var bb=function(a,b,c){if(c){var d=_[c];b=F(F({},d),b)}_[a]=b};bb("Event",{bubbles:!1,cancelable:!1}),bb("CustomEvent",{detail:null},"Event"),bb("UIEvent",{view:null,detail:0},"Event"),bb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),bb("FocusEvent",{relatedTarget:null},"UIEvent")}var cb=window.EventTarget,db=["addEventListener","removeEventListener","dispatchEvent"];[Element,Window,Document].forEach(function(a){var b=a.prototype;db.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),A.prototype={addEventListener:function(a,b,c){if(z(b)){var d=new t(a,b,c),e=K.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],K.set(this,e);e.push(d);var g=B(this);g.addEventListener_(a,n,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=K.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=B(this);h.removeEventListener_(a,n,!0)}}},dispatchEvent:function(b){a.renderAllPending();var c=B(this);return c.dispatchEvent_(H(b))}},cb&&G(cb,A);var eb=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=D,a.wrapEventTargetMethods=C,a.wrappers.CustomEvent=U,a.wrappers.Event=u,a.wrappers.EventTarget=A,a.wrappers.FocusEvent=Z,a.wrappers.MouseEvent=Y,a.wrappers.MutationEvent=$,a.wrappers.UIEvent=T}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,{enumerable:!1})}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap;c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){j(a instanceof f)}function c(a,b,c,d){if(a.nodeType!==f.DOCUMENT_FRAGMENT_NODE)return a.parentNode&&a.parentNode.removeChild(a),a.parentNode_=b,a.previousSibling_=c,a.nextSibling_=d,c&&(c.nextSibling_=a),d&&(d.previousSibling_=a),[a];for(var e,g=[];e=a.firstChild;)a.removeChild(e),g.push(e),e.parentNode_=b;for(var h=0;h<g.length;h++)g[h].previousSibling_=g[h-1]||c,g[h].nextSibling_=g[h+1]||d;return c&&(c.nextSibling_=g[0]),d&&(d.previousSibling_=g[g.length-1]),g}function d(a){if(1===a.length)return m(a[0]);for(var b=m(document.createDocumentFragment()),c=0;c<a.length;c++)b.appendChild(m(a[c]));return b}function e(a){for(var b=a.firstChild;b;){j(b.parentNode===a);var c=b.nextSibling,d=m(b),e=d.parentNode;e&&s.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}function f(a){j(a instanceof o),g.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0}var g=a.wrappers.EventTarget,h=a.wrappers.NodeList,i=a.defineWrapGetter,j=a.assert,k=a.mixin,l=a.registerWrapper,m=a.unwrap,n=a.wrap,o=window.Node,p=o.prototype.appendChild,q=o.prototype.insertBefore,r=o.prototype.replaceChild,s=o.prototype.removeChild,t=o.prototype.compareDocumentPosition;f.prototype=Object.create(g.prototype),k(f.prototype,{appendChild:function(a){b(a),this.invalidateShadowRenderer();var e=this.lastChild,f=null,g=c(a,this,e,f);return this.lastChild_=g[g.length-1],e||(this.firstChild_=g[0]),p.call(this.impl,d(g)),a},insertBefore:function(a,e){if(!e)return this.appendChild(a);b(a),b(e),j(e.parentNode===this),this.invalidateShadowRenderer();var f=e.previousSibling,g=e,h=c(a,this,f,g);this.firstChild===e&&(this.firstChild_=h[0]);var i=m(e),k=i.parentNode;return k&&q.call(k,d(h),i),a},removeChild:function(a){if(b(a),a.parentNode!==this)throw new Error("NotFoundError");this.invalidateShadowRenderer();var c=this.firstChild,d=this.lastChild,e=a.nextSibling,f=a.previousSibling,g=m(a),h=g.parentNode;return h&&s.call(h,g),c===a&&(this.firstChild_=e),d===a&&(this.lastChild_=f),f&&(f.nextSibling_=e),e&&(e.previousSibling_=f),a.previousSibling_=a.nextSibling_=a.parentNode_=null,a},replaceChild:function(a,e){if(b(a),b(e),e.parentNode!==this)throw new Error("NotFoundError");this.invalidateShadowRenderer();var f=e.previousSibling,g=e.nextSibling;g===a&&(g=a.nextSibling);var h=c(a,this,f,g);this.firstChild===e&&(this.firstChild_=h[0]),this.lastChild===e&&(this.lastChild_=h[h.length-1]),e.previousSibling_=null,e.nextSibling_=null,e.parentNode_=null;var i=m(e);return i.parentNode&&r.call(i.parentNode,d(h),i),e},hasChildNodes:function(){return null===this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:n(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:n(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:n(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:n(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:n(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==f.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)a+=b.textContent;return a},set textContent(a){if(e(this),this.invalidateShadowRenderer(),""!==a){var b=this.impl.ownerDocument.createTextNode(a);this.appendChild(b)}},get childNodes(){for(var a=new h,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){if(!this.invalidateShadowRenderer())return n(this.impl.cloneNode(a));var b=n(this.impl.cloneNode(!1));if(a)for(var c=this.firstChild;c;c=c.nextSibling)b.appendChild(c.cloneNode(!0));return b},contains:function(a){if(!a)return!1;if(a===this)return!0;var b=a.parentNode;return b?this.contains(b):!1},compareDocumentPosition:function(a){return t.call(this.impl,m(a))}}),i(f,"ownerDocument"),l(o,f,document.createDocumentFragment()),delete f.prototype.querySelector,delete f.prototype.querySelectorAll,f.prototype=k(Object.create(g.prototype),f.prototype),a.wrappers.Node=f}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b,d){for(var e=a.firstElementChild;e;)e.matches(b)&&(d[d.length++]=e),c(e,b,d),e=e.nextElementSibling;return d}var d={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return c(this,a,new NodeList)}},e={getElementsByTagName:function(a){return this.querySelectorAll(a)},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){if("*"===a)return this.getElementsByTagName(b);for(var c=new NodeList,d=this.getElementsByTagName(b),e=0,f=0;e<d.length;e++)d[e].namespaceURI===a&&(c[f++]=d[e]);return c.length=f,c}};a.GetElementsByInterface=e,a.SelectorsInterface=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.nextSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.mixin,f=a.registerWrapper,g=window.CharacterData;b.prototype=Object.create(d.prototype),e(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a}}),e(b.prototype,c),f(g,b,document.createTextNode("")),a.wrappers.CharacterData=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){e.call(this,a)}var c=a.ChildNodeInterface,d=a.GetElementsByInterface,e=a.wrappers.Node,f=a.ParentNodeInterface,g=a.SelectorsInterface;a.addWrapNodeListMethod;var h=a.mixin,i=a.registerWrapper,j=a.wrappers,k=new SideTable,l=window.Element,m=l.prototype.matches||l.prototype.mozMatchesSelector||l.prototype.msMatchesSelector||l.prototype.webkitMatchesSelector;b.prototype=Object.create(e.prototype),h(b.prototype,{createShadowRoot:function(){var b=new j.ShadowRoot(this);return k.set(this,b),a.getRendererForHost(this),this.invalidateShadowRenderer(!0),b},get shadowRoot(){return k.get(this)||null},setAttribute:function(a,b){this.impl.setAttribute(a,b),this.invalidateShadowRenderer()},matches:function(a){return m.call(this.impl,a)}}),h(b.prototype,c),h(b.prototype,d),h(b.prototype,f),h(b.prototype,g),i(l,b),a.wrappers.Element=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case'"':return"&quot;"}}function c(a){return a.replace(p,b)}function d(a){switch(a.nodeType){case Node.ELEMENT_NODE:for(var b,d=a.tagName.toLowerCase(),f="<"+d,g=a.attributes,h=0;b=g[h];h++)f+=" "+b.name+'="'+c(b.value)+'"';return f+=">",q[d]?f:f+e(a)+"</"+d+">";case Node.TEXT_NODE:return c(a.nodeValue);case Node.COMMENT_NODE:return"<!--"+c(a.nodeValue)+"-->";default:throw console.error(a),new Error("not implemented")}}function e(a){for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=d(c);return b}function f(a,b,c){var d=c||"div";a.textContent="";var e=n(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(o(f))}function g(a){j.call(this,a)}function h(b){k(g,b,function(){return a.renderAllPending(),this.impl[b]})}function i(b){Object.defineProperty(g.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var j=a.wrappers.Element,k=a.defineGetter,l=a.mixin,m=a.registerWrapper,n=a.unwrap,o=a.wrap,p=/&|<|"/g,q={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},r=window.HTMLElement;g.prototype=Object.create(j.prototype),l(g.prototype,{get innerHTML(){return e(this)},set innerHTML(a){f(this,a,this.tagName)},get outerHTML(){return d(this)},set outerHTML(a){if(this.invalidateShadowRenderer())throw new Error("not implemented");this.impl.outerHTML=a}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth"].forEach(h),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(i),m(r,g,document.createElement("b")),a.wrappers.HTMLElement=g,a.getInnerHTML=e,a.setInnerHTML=f}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a),this.olderShadowRoot_=null}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get olderShadowRoot(){return this.olderShadowRoot_},invalidateShadowRenderer:function(){c.prototype.invalidateShadowRenderer.call(this,!0)}}),f&&e(f,b),a.wrappers.HTMLShadowElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=l.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);l.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=d.createDocumentFragment();c=a.firstChild;)e.appendChild(c);return e}function d(a){e.call(this,a)}var e=a.wrappers.HTMLElement,f=a.getInnerHTML,g=a.mixin,h=a.registerWrapper,i=a.setInnerHTML,j=a.wrap,k=new SideTable,l=new SideTable,m=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),g(d.prototype,{get content(){if(m)return j(this.impl.content);var a=k.get(this);return a||(a=c(this),k.set(this,a)),a},get innerHTML(){return f(this.content)},set innerHTML(a){i(this.content,a),this.invalidateShadowRenderer()}}),m&&h(m,d),a.wrappers.HTMLTemplateElement=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement;a.mixin;var g=a.registerWrapper,h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(this.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createTextNode("")),i=f(document.createComment(""));a.wrappers.Comment=i,a.wrappers.DocumentFragment=g,a.wrappers.Text=h}(this.ShadowDOMPolyfill),function(a){"use strict";function b(b){var d=i(b.impl.ownerDocument.createDocumentFragment());c.call(this,d),g(d,this);var e=b.shadowRoot;a.nextOlderShadowTreeTable.set(this,e),j.set(this,b)}var c=a.wrappers.DocumentFragment,d=a.elementFromPoint,e=a.getInnerHTML,f=a.mixin,g=a.rewrap,h=a.setInnerHTML,i=a.unwrap,j=new SideTable;b.prototype=Object.create(c.prototype),f(b.prototype,{get innerHTML(){return e(this)},set innerHTML(a){h(this,a),this.invalidateShadowRenderer()},invalidateShadowRenderer:function(){return j.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return d(this,this.ownerDocument,a,b)},getElementById:function(a){return this.querySelector("#"+a)}}),a.wrappers.ShadowRoot=b,a.getHostForShadowRoot=function(a){return j.get(a)}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a){a.firstChild_=a.firstChild,a.lastChild_=a.lastChild}function d(a){F(a instanceof E);for(var d=a.firstChild;d;d=d.nextSibling)b(d);c(a)}function e(a){var b=H(a);d(a),b.textContent=""}function f(a,c){var e=H(a),f=H(c);f.nodeType===E.DOCUMENT_FRAGMENT_NODE?d(c):(h(c),b(c)),a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var g=I(e.lastChild);g&&(g.nextSibling_=g.nextSibling),e.appendChild(f)}function g(a,c){var d=H(a),e=H(c);b(c),c.previousSibling&&(c.previousSibling.nextSibling_=c),c.nextSibling&&(c.nextSibling.previousSibling_=c),a.lastChild===c&&(a.lastChild_=c),a.firstChild===c&&(a.firstChild_=c),d.removeChild(e)}function h(a){var b=H(a),c=b.parentNode;c&&g(I(c),a)}function i(a,b){k(b).push(a),L.set(a,b);var c=K.get(a);c||K.set(a,c=[]),c.push(b)}function j(a){J.set(a,[])}function k(a){return J.get(a)}function l(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function m(a,b,c){for(var d=l(a),e=0;e<d.length;e++){var f=d[e];if(b(f)){if(c(f)===!1)return}else m(f,b,c)}}function n(a,b){var c=!1;return m(a,u,function(a){j(a);for(var d=0;d<b.length;d++){var e=b[d];void 0!==e&&p(e,a)&&(i(e,a),b[d]=void 0,c=!0)}}),c?b.filter(function(a){return void 0!==a}):b}function o(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function p(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(a.nodeType!==E.ELEMENT_NODE)return!1;if(!P.test(c))return!1;if(":"===c[0]&&!Q.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function q(){C=null,S.forEach(function(a){a.render()}),S=[]}function r(a){this.host=a,this.dirty=!1,this.associateNode(a)}function s(a){var b=N.get(a);return b||(b=new r(a),N.set(a,b)),b}function t(a){return"content"===a.localName}function u(a){return"content"===a.localName}function v(a){return"shadow"===a.localName}function w(a){return"shadow"===a.localName}function x(a){return!!a.shadowRoot}function y(a){return M.get(a)}function z(a){for(var b=[],c=a.shadowRoot;c;c=M.get(c))b.push(c);return b}function A(a,b){L.set(a,b)}function B(a){new r(a).render()}var C,D=a.wrappers.HTMLContentElement,E=a.wrappers.Node,F=a.assert,G=a.mixin,H=a.unwrap,I=a.wrap,J=new SideTable,K=new SideTable,L=new SideTable,M=new SideTable,N=new SideTable,O=new SideTable,P=/^[*.:#[a-zA-Z_|]/,Q=new RegExp("^:("+["link","visited","target","enabled","disabled","checked","indeterminate","nth-child","nth-last-child","nth-of-type","nth-last-of-type","first-child","last-child","first-of-type","last-of-type","only-of-type"].join("|")+")"),R=o(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),S=[];r.prototype={render:function(){if(this.dirty){var a=this.host;this.treeComposition();var b=a.shadowRoot;if(b){this.removeAllChildNodes(this.host);var c=l(b);c.forEach(function(c){this.renderNode(a,b,c,!1)},this),this.dirty=!1}}},invalidate:function(){if(!this.dirty){if(this.dirty=!0,S.push(this),C)return;C=window[R](q,0)}},renderNode:function(a,b,c,d){if(x(c)){this.appendChild(a,c);var e=s(c);e.dirty=!0,e.render()}else t(c)?this.renderInsertionPoint(a,b,c,d):v(c)?this.renderShadowInsertionPoint(a,b,c):this.renderAsAnyDomTree(a,b,c,d)},renderAsAnyDomTree:function(a,b,c,d){if(this.appendChild(a,c),x(c))B(c);else{var e=c,f=l(e);f.forEach(function(a){this.renderNode(e,b,a,d)},this)}},renderInsertionPoint:function(a,b,c,d){var e=k(c);e.length?(this.removeAllChildNodes(c),e.forEach(function(c){t(c)&&d?this.renderInsertionPoint(a,b,c,d):this.renderAsAnyDomTree(a,b,c,d)},this)):this.renderFallbackContent(a,c),this.remove(c)},renderShadowInsertionPoint:function(a,b,c){var d=y(b);if(d){L.set(d,c),c.olderShadowRoot_=d,this.remove(c);var e=l(d);e.forEach(function(b){this.renderNode(a,d,b,!0)},this)}else this.renderFallbackContent(a,c)},renderFallbackContent:function(a,b){var c=l(b);c.forEach(function(b){this.appendChild(a,b)},this)},treeComposition:function(){var a=this.host,b=a.shadowRoot,c=[],d=l(a);d.forEach(function(a){if(t(a)){var b=k(a);b&&b.length||(b=l(a)),c.push.apply(c,b)}else c.push(a)});for(var e,f;b;){if(e=void 0,m(b,w,function(a){return e=a,!1}),f=e,c=n(b,c),f){var g=y(b);if(g){b=g,A(b,f);continue}break}break}},appendChild:function(a,b){f(a,b),this.associateNode(b)},remove:function(a){h(a),this.associateNode(a)},removeAllChildNodes:function(a){e(a)},associateNode:function(a){O.set(a,this)}},E.prototype.invalidateShadowRenderer=function(a){var b=O.get(this);if(!b)return!1;var c;return(a||this.shadowRoot||(c=this.parentNode)&&(c.shadowRoot||c instanceof ShadowRoot))&&b.invalidate(),!0},D.prototype.getDistributedNodes=function(){return q(),k(this)},G(E.prototype,{get insertionParent(){return L.get(this)||null}}),a.eventParentsTable=K,a.getRendererForHost=s,a.getShadowTrees=z,a.nextOlderShadowTreeTable=M,a.renderAllPending=q,a.visual={removeAllChildNodes:e,appendChild:f,removeChild:g}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){h.call(this,a)}function c(a){var c=document[a];b.prototype[a]=function(){return q(c.apply(this.impl,arguments))}}function d(a){this.impl=a}function e(a,b){var c=document.implementation[b];a.prototype[b]=function(){return q(c.apply(this.impl,arguments))}}function f(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var g=a.GetElementsByInterface,h=a.wrappers.Node,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=a.defineWrapGetter,l=a.elementFromPoint,m=a.forwardMethodsToWrapper,n=a.mixin,o=a.registerWrapper,p=a.unwrap,q=a.wrap,r=a.wrapEventTargetMethods;a.wrapNodeList;var s=new SideTable;b.prototype=Object.create(h.prototype),k(b,"documentElement"),k(b,"body"),k(b,"head"),["getElementById","createElement","createElementNS","createTextNode","createDocumentFragment","createEvent","createEventNS"].forEach(c);var t=document.adoptNode,u=document.write;n(b.prototype,{adoptNode:function(a){return t.call(this.impl,p(a)),a},elementFromPoint:function(a,b){return l(this,this,a,b)},write:function(a){for(var b=this.querySelectorAll("*"),c=b[b.length-1];c.nextSibling;)c=c.nextSibling;var d=c.parentNode;d.lastChild_=void 0,c.nextSibling_=void 0,u.call(this.impl,a)}}),m([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement],["appendChild","compareDocumentPosition","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),m([window.HTMLDocument||window.Document],["adoptNode","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createTextNode","elementFromPoint","getElementById","write"]),n(b.prototype,g),n(b.prototype,i),n(b.prototype,j),n(b.prototype,{get implementation(){var a=s.get(this);return a?a:(a=new d(p(this).implementation),s.set(this,a),a)}}),o(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&o(window.HTMLDocument,b),r([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),e(d,"createDocumentType"),e(d,"createDocument"),e(d,"createHTMLDocument"),f(d,"hasFeature"),o(window.DOMImplementation,d),m([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.wrappers.Document=b,a.wrappers.DOMImplementation=d}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.Window;b.prototype=Object.create(c.prototype);var j=window.getComputedStyle;i.prototype.getComputedStyle=function(a,b){return j.call(this||window,g(a),b)},["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){i.prototype[a]=function(){var b=h(this||window);return b[a].apply(b,arguments)}}),d(b.prototype,{getComputedStyle:function(a,b){return j.call(f(this),g(a),b)}}),e(i,b),a.wrappers.Window=b}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}function c(a){return new b(a)}function d(a){return a.map(c)}function e(a){var b=this;this.impl=new k(function(c){a.call(b,d(c),b)})}var f=a.defineGetter,g=a.defineWrapGetter,h=a.registerWrapper,i=a.unwrapIfNeeded,j=a.wrapNodeList;a.wrappers;var k=window.MutationObserver||window.WebKitMutationObserver;if(k){var l=window.MutationRecord;b.prototype={get addedNodes(){return j(this.impl.addedNodes)},get removedNodes(){return j(this.impl.removedNodes)}},["target","previousSibling","nextSibling"].forEach(function(a){g(b,a)}),["type","attributeName","attributeNamespace","oldValue"].forEach(function(a){f(b,a,function(){return this.impl[a]})}),l&&h(l,b),window.Node,e.prototype={observe:function(a,b){this.impl.observe(i(a),b)
-},disconnect:function(){this.impl.disconnect()},takeRecords:function(){return d(this.impl.takeRecords())}},a.wrappers.MutationObserver=e,a.wrappers.MutationRecord=b}}(this.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}a.isWrapperFor;var c={a:"HTMLAnchorElement",applet:"HTMLAppletElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",br:"HTMLBRElement",base:"HTMLBaseElement",body:"HTMLBodyElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",dl:"HTMLDListElement",datalist:"HTMLDataListElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",hr:"HTMLHRElement",head:"HTMLHeadElement",h1:"HTMLHeadingElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",input:"HTMLInputElement",li:"HTMLLIElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",link:"HTMLLinkElement",map:"HTMLMapElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",del:"HTMLModElement",ol:"HTMLOListElement",object:"HTMLObjectElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",table:"HTMLTableElement",tr:"HTMLTableRowElement",thead:"HTMLTableSectionElement",tbody:"HTMLTableSectionElement",textarea:"HTMLTextAreaElement",title:"HTMLTitleElement",ul:"HTMLUListElement",video:"HTMLVideoElement"};Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]}),a.knownElements=c}(this.ShadowDOMPolyfill),function(){var a=window.ShadowDOMPolyfill;a.wrap,Object.defineProperties(HTMLElement.prototype,{webkitShadowRoot:{get:function(){return this.shadowRoot}}}),HTMLElement.prototype.webkitCreateShadowRoot=HTMLElement.prototype.createShadowRoot,window.dartExperimentalFixupGetTag=function(b){function c(a){if(a instanceof d)return"NodeList";if(a instanceof e)return"ShadowRoot";if(a instanceof MutationRecord)return"MutationRecord";if(a instanceof MutationObserver)return"MutationObserver";if(f(a)){a=g(a);var c=a.constructor;if(c&&c._ShadowDOMPolyfill$isGeneratedWrapper){var h=c._ShadowDOMPolyfill$cacheTag_;return h||(h=Object.prototype.toString.call(a),h=h.substring(8,h.length-1),c._ShadowDOMPolyfill$cacheTag_=h),h}}return b(a)}var d=a.wrappers.NodeList,e=a.wrappers.ShadowRoot,f=a.isWrapper,g=a.unwrap;return c}}()}
\ No newline at end of file
+if(!HTMLElement.prototype.createShadowRoot&&!HTMLElement.prototype.webkitCreateShadowRoot||window.__forceShadowDomPolyfill){(function(){Element.prototype.webkitCreateShadowRoot&&(Element.prototype.webkitCreateShadowRoot=function(){return window.ShadowDOMPolyfill.wrapIfNeeded(this).createShadowRoot()})})();var SideTable;"undefined"!=typeof WeakMap&&0>navigator.userAgent.indexOf("Firefox/")?SideTable=WeakMap:function(){var e=Object.defineProperty,t=Object.hasOwnProperty,n=(new Date).getTime()%1e9;SideTable=function(){this.name="__st"+(1e9*Math.random()>>>0)+(n++ +"__")},SideTable.prototype={set:function(t,n){e(t,this.name,{value:n,writable:!0})},get:function(e){return t.call(e,this.name)?e[this.name]:void 0},"delete":function(e){this.set(e,void 0)}}}();var ShadowDOMPolyfill={};(function(e){"use strict";function t(e){if(!e)throw new Error("Assertion failed")}function n(e,t){return Object.getOwnPropertyNames(t).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function r(e,t){return Object.getOwnPropertyNames(t).forEach(function(n){switch(n){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":return}Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function i(e){var t=e.__proto__||Object.getPrototypeOf(e),n=M.get(t);if(n)return n;var r=i(t),o=p(r);return u(t,o,e),o}function o(e,t){l(e,t,!0)}function a(e,t){l(t,e,!1)}function l(e,t,n){Object.getOwnPropertyNames(e).forEach(function(r){if(!(r in t)){L&&e.__lookupGetter__(r);var i;try{i=Object.getOwnPropertyDescriptor(e,r)}catch(o){i=C}var a,l;if(n&&"function"==typeof i.value)return t[r]=function(){return this.impl[r].apply(this.impl,arguments)},void 0;a=function(){return this.impl[r]},(i.writable||i.set)&&(l=function(e){this.impl[r]=e}),Object.defineProperty(t,r,{get:a,set:l,configurable:i.configurable,enumerable:i.enumerable})}})}function s(e,t,n){var i=e.prototype;u(i,t,n),r(t,e)}function u(e,n,r){var i=n.prototype;t(void 0===M.get(e)),M.set(e,n),o(e,i),r&&a(i,r)}function c(e,t){return M.get(t.prototype)===e}function d(e){var t=Object.getPrototypeOf(e),n=i(t),r=p(n);return u(t,r,e),r}function p(e){function t(t){e.call(this,t)}return t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t._ShadowDOMPolyfill$isGeneratedWrapper=!0,t}function h(e){return e instanceof N.EventTarget||e instanceof N.Event||e instanceof N.DOMImplementation}function f(e){return e instanceof D||e instanceof O||e instanceof _||e instanceof H}function m(e){if(null===e)return null;t(f(e));var n=S.get(e);if(!n){var r=i(e);n=new r(e),S.set(e,n)}return n}function g(e){return null===e?null:(t(h(e)),e.impl)}function w(e){return e&&h(e)?g(e):e}function v(e){return e&&!h(e)?m(e):e}function E(e,n){null!==n&&(t(f(e)),t(void 0===n||h(n)),S.set(e,n))}function y(e,t,n){Object.defineProperty(e.prototype,t,{get:n,configurable:!0,enumerable:!0})}function T(e,t){y(e,t,function(){return m(this.impl[t])})}function b(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=m(this);return e[t].apply(e,arguments)}})})}var S=new SideTable,M=new SideTable,N=Object.create(null);Object.getOwnPropertyNames(window);var L=/Firefox/.test(navigator.userAgent),C={get:function(){},set:function(){},configurable:!0,enumerable:!0},H=DOMImplementation,O=Event,D=Node,_=Window;e.assert=t,e.defineGetter=y,e.defineWrapGetter=T,e.forwardMethodsToWrapper=b,e.isWrapper=h,e.isWrapperFor=c,e.mixin=n,e.registerObject=d,e.registerWrapper=s,e.rewrap=E,e.unwrap=g,e.unwrapIfNeeded=w,e.wrap=m,e.wrapIfNeeded=v,e.wrappers=N})(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof I.ShadowRoot}function n(e){var t=e.localName;return"content"===t||"shadow"===t}function r(e){return!!e.shadowRoot}function i(e){var t;return e.parentNode||(t=e.defaultView)&&R(t)||null}function o(o,a,l){if(l.length)return l.shift();if(t(o))return o.insertionParent||e.getHostForShadowRoot(o);var s=e.eventParentsTable.get(o);if(s){for(var u=1;s.length>u;u++)l[u-1]=s[u];return s[0]}if(a&&n(o)){var c=o.parentNode;if(c&&r(c))for(var d=e.getShadowTrees(c),p=a.insertionParent,u=0;d.length>u;u++)if(d[u].contains(p))return p}return i(o)}function a(e){for(var r=[],i=e,a=[],s=[];i;){var u=null;if(n(i)){u=l(r);var c=r[r.length-1]||i;r.push(c)}else r.length||r.push(i);var d=r[r.length-1];a.push({target:d,currentTarget:i}),t(i)&&r.pop(),i=o(i,u,s)}return a}function l(e){for(var t=e.length-1;t>=0;t--)if(!n(e[t]))return e[t];return null}function s(r,i){for(var a=[];r;){for(var s=[],c=i,p=void 0;c;){var h=null;if(s.length){if(n(c)&&(h=l(s),u(p))){var f=s[s.length-1];s.push(f)}}else s.push(c);if(d(c,r))return s[s.length-1];t(c)&&s.pop(),p=c,c=o(c,h,a)}r=t(r)?e.getHostForShadowRoot(r):r.parentNode}}function u(e){return e.insertionParent}function c(e){for(var t;t=e.parentNode;)e=t;return e}function d(e,t){return c(e)===c(t)}function p(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function h(t){if(!F.get(t)){F.set(t,!0),p(t.type)||e.renderAllPending();var n=R(t.target),r=R(t);return f(r,n)}}function f(e,t){var n=a(t);return"load"===e.type&&2===n.length&&n[0].target instanceof I.Document&&n.shift(),m(e,n)&&g(e,n)&&w(e,n),k.set(e,y.NONE),W.set(e,null),e.defaultPrevented}function m(e,t){for(var n,r=t.length-1;r>0;r--){var i=t[r].target,o=t[r].currentTarget;if(i!==o&&(n=y.CAPTURING_PHASE,!v(t[r],e,n)))return!1}return!0}function g(e,t){var n=y.AT_TARGET;return v(t[0],e,n)}function w(e,t){for(var n,r=e.bubbles,i=1;t.length>i;i++){var o=t[i].target,a=t[i].currentTarget;if(o===a)n=y.AT_TARGET;else{if(!r||q.get(e))continue;n=y.BUBBLING_PHASE}if(!v(t[i],e,n))return}}function v(e,t,n){var r=e.target,i=e.currentTarget,o=A.get(i);if(!o)return!0;if("relatedTarget"in t){var a=x(t),l=R(a.relatedTarget),u=s(i,l);if(u===r)return!0;B.set(t,u)}k.set(t,n);var c=t.type,d=!1;j.set(t,r),W.set(t,i);for(var p=0;o.length>p;p++){var h=o[p];if(h.removed)d=!0;else if(!(h.type!==c||!h.capture&&n===y.CAPTURING_PHASE||h.capture&&n===y.BUBBLING_PHASE))try{if("function"==typeof h.handler?h.handler.call(i,t):h.handler.handleEvent(t),q.get(t))return!1}catch(f){window.onerror?window.onerror(f.message):console.error(f)}}if(d){var m=o.slice();o.length=0;for(var p=0;m.length>p;p++)m[p].removed||o.push(m[p])}return!G.get(t)}function E(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){return e instanceof U?(this.impl=e,void 0):R(M(U,"Event",e,t))}function T(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:x(e.relatedTarget)}}):e}function b(e,t,n){var r=window[e],i=function(t,n){return t instanceof r?(this.impl=t,void 0):R(M(r,e,t,n))};return i.prototype=Object.create(t.prototype),n&&_(i.prototype,n),r&&P(r,i,document.createEvent(e)),i}function S(e,t){return function(){arguments[t]=x(arguments[t]);var n=x(this);n[e].apply(n,arguments)}}function M(e,t,n,r){if(et)return new e(n,T(r));var i=x(document.createEvent(t)),o=J[t],a=[n];return Object.keys(o).forEach(function(e){var t=null!=r&&e in r?r[e]:o[e];"relatedTarget"===e&&(t=x(t)),a.push(t)}),i["init"+t].apply(i,a),i}function N(e){return"function"==typeof e?!0:e&&e.handleEvent}function L(e){this.impl=e}function C(t){return t instanceof I.ShadowRoot&&(t=e.getHostForShadowRoot(t)),x(t)}function H(e){D(e,rt)}function O(t,n,r,i){e.renderAllPending();for(var o=R(it.call(n.impl,r,i)),l=a(o,this),s=0;l.length>s;s++){var u=l[s];if(u.currentTarget===t)return u.target}return null}var D=e.forwardMethodsToWrapper,_=e.mixin,P=e.registerWrapper,x=e.unwrap,R=e.wrap,I=e.wrappers;new SideTable;var A=new SideTable,F=new SideTable,j=new SideTable,W=new SideTable,B=new SideTable,k=new SideTable,G=new SideTable,q=new SideTable;E.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var U=window.Event;y.prototype={get target(){return j.get(this)},get currentTarget(){return W.get(this)},get eventPhase(){return k.get(this)},stopPropagation:function(){G.set(this,!0)},stopImmediatePropagation:function(){G.set(this,!0),q.set(this,!0)}},P(U,y,document.createEvent("Event"));var V=b("UIEvent",y),K=b("CustomEvent",y),$={get relatedTarget(){return B.get(this)||R(x(this).relatedTarget)}},z=_({initMouseEvent:S("initMouseEvent",14)},$),X=_({initFocusEvent:S("initFocusEvent",5)},$),Y=b("MouseEvent",V,z),Q=b("FocusEvent",V,X),Z=b("MutationEvent",y,{initMutationEvent:S("initMutationEvent",3),get relatedNode(){return R(this.impl.relatedNode)}}),J=Object.create(null),et=function(){try{new window.MouseEvent("click")}catch(e){return!1}return!0}();if(!et){var tt=function(e,t,n){if(n){var r=J[n];t=_(_({},r),t)}J[e]=t};tt("Event",{bubbles:!1,cancelable:!1}),tt("CustomEvent",{detail:null},"Event"),tt("UIEvent",{view:null,detail:0},"Event"),tt("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),tt("FocusEvent",{relatedTarget:null},"UIEvent")}var nt=window.EventTarget,rt=["addEventListener","removeEventListener","dispatchEvent"];[Element,Window,Document].forEach(function(e){var t=e.prototype;rt.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),L.prototype={addEventListener:function(e,t,n){if(N(t)){var r=new E(e,t,n),i=A.get(this);if(i){for(var o=0;i.length>o;o++)if(r.equals(i[o]))return}else i=[],A.set(this,i);i.push(r);var a=C(this);a.addEventListener_(e,h,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=A.get(this);if(r){for(var i=0,o=!1,a=0;r.length>a;a++)r[a].type===e&&r[a].capture===n&&(i++,r[a].handler===t&&(o=!0,r[a].remove()));if(o&&1===i){var l=C(this);l.removeEventListener_(e,h,!0)}}},dispatchEvent:function(t){e.renderAllPending();var n=C(this);return n.dispatchEvent_(x(t))}},nt&&P(nt,L);var it=document.elementFromPoint;e.adjustRelatedTarget=s,e.elementFromPoint=O,e.wrapEventTargetMethods=H,e.wrappers.CustomEvent=K,e.wrappers.Event=y,e.wrappers.EventTarget=L,e.wrappers.FocusEvent=Q,e.wrappers.MouseEvent=Y,e.wrappers.MutationEvent=Z,e.wrappers.UIEvent=V}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,{enumerable:!1})}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,i=e.length;i>r;r++)t[r]=o(e[r]);return t.length=i,t}function i(e,t){e.prototype[t]=function(){return r(this.impl[t].apply(this.impl,arguments))}}var o=e.wrap;n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=i,e.wrapNodeList=r}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){s(e instanceof o)}function n(e,t,n,r){if(e.nodeType!==o.DOCUMENT_FRAGMENT_NODE)return e.parentNode&&e.parentNode.removeChild(e),e.parentNode_=t,e.previousSibling_=n,e.nextSibling_=r,n&&(n.nextSibling_=e),r&&(r.previousSibling_=e),[e];for(var i,a=[];i=e.firstChild;)e.removeChild(i),a.push(i),i.parentNode_=t;for(var l=0;a.length>l;l++)a[l].previousSibling_=a[l-1]||n,a[l].nextSibling_=a[l+1]||r;return n&&(n.nextSibling_=a[0]),r&&(r.previousSibling_=a[a.length-1]),a}function r(e){if(1===e.length)return d(e[0]);for(var t=d(document.createDocumentFragment()),n=0;e.length>n;n++)t.appendChild(d(e[n]));return t}function i(e){for(var t=e.firstChild;t;){s(t.parentNode===e);var n=t.nextSibling,r=d(t),i=r.parentNode;i&&w.call(i,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}function o(e){s(e instanceof h),a.call(this,e),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0}var a=e.wrappers.EventTarget,l=e.wrappers.NodeList;e.defineWrapGetter;var s=e.assert,u=e.mixin,c=e.registerWrapper,d=e.unwrap,p=e.wrap,h=window.Node,f=h.prototype.appendChild,m=h.prototype.insertBefore,g=h.prototype.replaceChild,w=h.prototype.removeChild,v=h.prototype.compareDocumentPosition;o.prototype=Object.create(a.prototype),u(o.prototype,{appendChild:function(e){t(e),this.invalidateShadowRenderer();var i=this.lastChild,o=null,a=n(e,this,i,o);return this.lastChild_=a[a.length-1],i||(this.firstChild_=a[0]),f.call(this.impl,r(a)),e},insertBefore:function(e,i){if(!i)return this.appendChild(e);t(e),t(i),s(i.parentNode===this),this.invalidateShadowRenderer();var o=i.previousSibling,a=i,l=n(e,this,o,a);this.firstChild===i&&(this.firstChild_=l[0]);var u=d(i),c=u.parentNode;return c&&m.call(c,r(l),u),e},removeChild:function(e){if(t(e),e.parentNode!==this)throw new Error("NotFoundError");this.invalidateShadowRenderer();var n=this.firstChild,r=this.lastChild,i=e.nextSibling,o=e.previousSibling,a=d(e),l=a.parentNode;return l&&w.call(l,a),n===e&&(this.firstChild_=i),r===e&&(this.lastChild_=o),o&&(o.nextSibling_=i),i&&(i.previousSibling_=o),e.previousSibling_=e.nextSibling_=e.parentNode_=null,e},replaceChild:function(e,i){if(t(e),t(i),i.parentNode!==this)throw new Error("NotFoundError");this.invalidateShadowRenderer();var o=i.previousSibling,a=i.nextSibling;a===e&&(a=e.nextSibling);var l=n(e,this,o,a);this.firstChild===i&&(this.firstChild_=l[0]),this.lastChild===i&&(this.lastChild_=l[l.length-1]),i.previousSibling_=null,i.nextSibling_=null,i.parentNode_=null;var s=d(i);return s.parentNode&&g.call(s.parentNode,r(l),s),i},hasChildNodes:function(){return null===this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:p(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:p(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:p(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:p(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:p(this.impl.previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==o.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)e+=t.textContent;return e},set textContent(e){if(i(this),this.invalidateShadowRenderer(),""!==e){var t=this.impl.ownerDocument.createTextNode(e);this.appendChild(t)}},get childNodes(){for(var e=new l,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){if(!this.invalidateShadowRenderer())return p(this.impl.cloneNode(e));var t=p(this.impl.cloneNode(!1));if(e)for(var n=this.firstChild;n;n=n.nextSibling)t.appendChild(n.cloneNode(!0));return t},contains:function(e){if(!e)return!1;if(e===this)return!0;var t=e.parentNode;return t?this.contains(t):!1},compareDocumentPosition:function(e){return v.call(this.impl,d(e))},get ownerDocument(){return e.renderAllPending(),p(this.impl.ownerDocument)}}),c(h,o,document.createDocumentFragment()),delete o.prototype.querySelector,delete o.prototype.querySelectorAll,o.prototype=u(Object.create(a.prototype),o.prototype),e.wrappers.Node=o}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e,n){for(var r,i=e.firstElementChild;i;){if(i.matches(n))return i;if(r=t(i,n))return r;i=i.nextElementSibling}return null}function n(e,t,r){for(var i=e.firstElementChild;i;)i.matches(t)&&(r[r.length++]=i),n(i,t,r),i=i.nextElementSibling;return r}var r={querySelector:function(e){return t(this,e)},querySelectorAll:function(e){return n(this,e,new NodeList)}},i={getElementsByTagName:function(e){return this.querySelectorAll(e)},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){if("*"===e)return this.getElementsByTagName(t);for(var n=new NodeList,r=this.getElementsByTagName(t),i=0,o=0;r.length>i;i++)r[i].namespaceURI===e&&(n[o++]=r[i]);return n.length=o,n}};e.GetElementsByInterface=i,e.SelectorsInterface=r}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,i={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e}},o={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.nextSibling)}};e.ChildNodeInterface=o,e.ParentNodeInterface=i}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,i=e.mixin,o=e.registerWrapper,a=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get textContent(){return this.data},set textContent(e){this.data=e}}),i(t.prototype,n),o(a,t,document.createTextNode("")),e.wrappers.CharacterData=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){i.call(this,e)}var n=e.ChildNodeInterface,r=e.GetElementsByInterface,i=e.wrappers.Node,o=e.ParentNodeInterface,a=e.SelectorsInterface;e.addWrapNodeListMethod;var l=e.mixin,s=e.registerWrapper,u=e.wrappers,c=new SideTable,d=window.Element,p=d.prototype.matches||d.prototype.mozMatchesSelector||d.prototype.msMatchesSelector||d.prototype.webkitMatchesSelector;t.prototype=Object.create(i.prototype),l(t.prototype,{createShadowRoot:function(){var t=new u.ShadowRoot(this);return c.set(this,t),e.getRendererForHost(this),this.invalidateShadowRenderer(!0),t},get shadowRoot(){return c.get(this)||null},setAttribute:function(e,t){this.impl.setAttribute(e,t),this.invalidateShadowRenderer()},matches:function(e){return p.call(this.impl,e)}}),l(t.prototype,n),l(t.prototype,r),l(t.prototype,o),l(t.prototype,a),s(d,t),e.wrappers.Element=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case'"':return"&quot;"}}function n(e){return e.replace(m,t)}function r(e){switch(e.nodeType){case Node.ELEMENT_NODE:for(var t,r=e.tagName.toLowerCase(),o="<"+r,a=e.attributes,l=0;t=a[l];l++)o+=" "+t.name+'="'+n(t.value)+'"';return o+=">",g[r]?o:o+i(e)+"</"+r+">";case Node.TEXT_NODE:return n(e.nodeValue);case Node.COMMENT_NODE:return"<!--"+n(e.nodeValue)+"-->";default:throw console.error(e),new Error("not implemented")}}function i(e){for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=r(n);return t}function o(e,t,n){var r=n||"div";e.textContent="";var i=h(e.ownerDocument.createElement(r));i.innerHTML=t;for(var o;o=i.firstChild;)e.appendChild(f(o))}function a(e){u.call(this,e)}function l(t){c(a,t,function(){return e.renderAllPending(),this.impl[t]})}function s(t){Object.defineProperty(a.prototype,t,{value:function(){return e.renderAllPending(),this.impl[t].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var u=e.wrappers.Element,c=e.defineGetter,d=e.mixin,p=e.registerWrapper,h=e.unwrap,f=e.wrap,m=/&|<|"/g,g={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},w=window.HTMLElement;a.prototype=Object.create(u.prototype),d(a.prototype,{get innerHTML(){return i(this)},set innerHTML(e){o(this,e,this.tagName)},get outerHTML(){return r(this)},set outerHTML(e){if(this.invalidateShadowRenderer())throw new Error("not implemented");this.impl.outerHTML=e}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth"].forEach(l),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(s),p(w,a,document.createElement("b")),e.wrappers.HTMLElement=a,e.getInnerHTML=i,e.setInnerHTML=o}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,i=e.registerWrapper,o=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),o&&i(o,t),e.wrappers.HTMLContentElement=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e),this.olderShadowRoot_=null}var n=e.wrappers.HTMLElement,r=e.mixin,i=e.registerWrapper,o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get olderShadowRoot(){return this.olderShadowRoot_},invalidateShadowRenderer:function(){n.prototype.invalidateShadowRenderer.call(this,!0)}}),o&&i(o,t),e.wrappers.HTMLShadowElement=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=d.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);d.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),i=r.createDocumentFragment();n=e.firstChild;)i.appendChild(n);return i}function r(e){i.call(this,e)}var i=e.wrappers.HTMLElement,o=e.getInnerHTML,a=e.mixin,l=e.registerWrapper,s=e.setInnerHTML,u=e.wrap,c=new SideTable,d=new SideTable,p=window.HTMLTemplateElement;r.prototype=Object.create(i.prototype),a(r.prototype,{get content(){if(p)return u(this.impl.content);var e=c.get(this);return e||(e=n(this),c.set(this,e)),e},get innerHTML(){return o(this.content)},set innerHTML(e){s(this.content,e),this.invalidateShadowRenderer()}}),p&&l(p,r),e.wrappers.HTMLTemplateElement=r}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new i(e);case"template":return new o(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,i=e.wrappers.HTMLShadowElement,o=e.wrappers.HTMLTemplateElement;e.mixin;var a=e.registerWrapper,l=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(l,t),e.wrappers.HTMLUnknownElement=t}(this.ShadowDOMPolyfill),function(e){"use strict";var t=e.GetElementsByInterface,n=e.ParentNodeInterface,r=e.SelectorsInterface,i=e.mixin,o=e.registerObject,a=o(document.createDocumentFragment());i(a.prototype,n),i(a.prototype,r),i(a.prototype,t);var l=o(document.createTextNode("")),s=o(document.createComment(""));e.wrappers.Comment=s,e.wrappers.DocumentFragment=a,e.wrappers.Text=l}(this.ShadowDOMPolyfill),function(e){"use strict";function t(t){var r=s(t.impl.ownerDocument.createDocumentFragment());n.call(this,r),a(r,this);var i=t.shadowRoot;e.nextOlderShadowTreeTable.set(this,i),u.set(this,t)}var n=e.wrappers.DocumentFragment,r=e.elementFromPoint,i=e.getInnerHTML,o=e.mixin,a=e.rewrap,l=e.setInnerHTML,s=e.unwrap,u=new SideTable;t.prototype=Object.create(n.prototype),o(t.prototype,{get innerHTML(){return i(this)},set innerHTML(e){l(this,e),this.invalidateShadowRenderer()},invalidateShadowRenderer:function(){return u.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return r(this,this.ownerDocument,e,t)},getElementById:function(e){return this.querySelector("#"+e)}}),e.wrappers.ShadowRoot=t,e.getHostForShadowRoot=function(e){return u.get(e)}}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(e){e.firstChild_=e.firstChild,e.lastChild_=e.lastChild}function r(e){_(e instanceof D);for(var r=e.firstChild;r;r=r.nextSibling)t(r);n(e)}function i(e){var t=x(e);r(e),t.textContent=""}function o(e,n){var i=x(e),o=x(n);o.nodeType===D.DOCUMENT_FRAGMENT_NODE?r(n):(l(n),t(n)),e.lastChild_=e.lastChild,e.lastChild===e.firstChild&&(e.firstChild_=e.firstChild);var a=R(i.lastChild);a&&(a.nextSibling_=a.nextSibling),i.appendChild(o)}function a(e,n){var r=x(e),i=x(n);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),e.lastChild===n&&(e.lastChild_=n),e.firstChild===n&&(e.firstChild_=n),r.removeChild(i)}function l(e){var t=x(e),n=t.parentNode;n&&a(R(n),e)}function s(e,t){c(t).push(e),F.set(e,t);var n=A.get(e);n||A.set(e,n=[]),n.push(t)}function u(e){I.set(e,[])}function c(e){return I.get(e)}function d(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function p(e,t,n){for(var r=d(e),i=0;r.length>i;i++){var o=r[i];if(t(o)){if(n(o)===!1)return}else p(o,t,n)}}function h(e,t){var n=!1;return p(e,y,function(e){u(e);for(var r=0;t.length>r;r++){var i=t[r];void 0!==i&&m(i,e)&&(s(i,e),t[r]=void 0,n=!0)}}),n?t.filter(function(e){return void 0!==e}):t}function f(e,t){for(var n=0;t.length>n;n++)if(t[n]in e)return t[n]}function m(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(e.nodeType!==D.ELEMENT_NODE)return!1;if(!k.test(n))return!1;if(":"===n[0]&&!G.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function g(){H=null,U.forEach(function(e){e.render()}),U=[]}function w(e){this.host=e,this.dirty=!1,this.associateNode(e)}function v(e){var t=W.get(e);return t||(t=new w(e),W.set(e,t)),t}function E(e){return"content"===e.localName}function y(e){return"content"===e.localName}function T(e){return"shadow"===e.localName}function b(e){return"shadow"===e.localName}function S(e){return!!e.shadowRoot}function M(e){return j.get(e)}function N(e){for(var t=[],n=e.shadowRoot;n;n=j.get(n))t.push(n);return t}function L(e,t){F.set(e,t)}function C(e){new w(e).render()}var H,O=e.wrappers.HTMLContentElement,D=e.wrappers.Node,_=e.assert,P=e.mixin,x=e.unwrap,R=e.wrap,I=new SideTable,A=new SideTable,F=new SideTable,j=new SideTable,W=new SideTable,B=new SideTable,k=/^[*.:#[a-zA-Z_|]/,G=new RegExp("^:("+["link","visited","target","enabled","disabled","checked","indeterminate","nth-child","nth-last-child","nth-of-type","nth-last-of-type","first-child","last-child","first-of-type","last-of-type","only-of-type"].join("|")+")"),q=f(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),U=[];w.prototype={render:function(){if(this.dirty){var e=this.host;this.treeComposition();var t=e.shadowRoot;if(t){this.removeAllChildNodes(this.host);var n=d(t);n.forEach(function(n){this.renderNode(e,t,n,!1)},this),this.dirty=!1}}},invalidate:function(){if(!this.dirty){if(this.dirty=!0,U.push(this),H)return;H=window[q](g,0)}},renderNode:function(e,t,n,r){if(S(n)){this.appendChild(e,n);var i=v(n);i.dirty=!0,i.render()}else E(n)?this.renderInsertionPoint(e,t,n,r):T(n)?this.renderShadowInsertionPoint(e,t,n):this.renderAsAnyDomTree(e,t,n,r)},renderAsAnyDomTree:function(e,t,n,r){if(this.appendChild(e,n),S(n))C(n);else{var i=n,o=d(i);o.forEach(function(e){this.renderNode(i,t,e,r)},this)}},renderInsertionPoint:function(e,t,n,r){var i=c(n);i.length?(this.removeAllChildNodes(n),i.forEach(function(n){E(n)&&r?this.renderInsertionPoint(e,t,n,r):this.renderAsAnyDomTree(e,t,n,r)},this)):this.renderFallbackContent(e,n),this.remove(n)},renderShadowInsertionPoint:function(e,t,n){var r=M(t);if(r){F.set(r,n),n.olderShadowRoot_=r,this.remove(n);var i=d(r);i.forEach(function(t){this.renderNode(e,r,t,!0)},this)}else this.renderFallbackContent(e,n)},renderFallbackContent:function(e,t){var n=d(t);n.forEach(function(t){this.appendChild(e,t)},this)},treeComposition:function(){var e=this.host,t=e.shadowRoot,n=[],r=d(e);r.forEach(function(e){if(E(e)){var t=c(e);t&&t.length||(t=d(e)),n.push.apply(n,t)}else n.push(e)});for(var i,o;t;){if(i=void 0,p(t,b,function(e){return i=e,!1}),o=i,n=h(t,n),o){var a=M(t);if(a){t=a,L(t,o);continue}break}break}},appendChild:function(e,t){o(e,t),this.associateNode(t)},remove:function(e){l(e),this.associateNode(e)},removeAllChildNodes:function(e){i(e)},associateNode:function(e){B.set(e,this)}},D.prototype.invalidateShadowRenderer=function(e){var t=B.get(this);if(!t)return!1;var n;return(e||this.shadowRoot||(n=this.parentNode)&&(n.shadowRoot||n instanceof ShadowRoot))&&t.invalidate(),!0},O.prototype.getDistributedNodes=function(){return g(),c(this)},P(D.prototype,{get insertionParent(){return F.get(this)||null}}),e.eventParentsTable=A,e.getRendererForHost=v,e.getShadowTrees=N,e.nextOlderShadowTreeTable=j,e.renderAllPending=g,e.visual={removeAllChildNodes:i,appendChild:o,removeChild:a}}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){l.call(this,e)}function n(e){var n=document[e];t.prototype[e]=function(){return g(n.apply(this.impl,arguments))}}function r(e){this.impl=e}function i(e,t){var n=document.implementation[t];e.prototype[t]=function(){return g(n.apply(this.impl,arguments))}}function o(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(this.impl,arguments)}}var a=e.GetElementsByInterface,l=e.wrappers.Node,s=e.ParentNodeInterface,u=e.SelectorsInterface,c=e.defineWrapGetter,d=e.elementFromPoint,p=e.forwardMethodsToWrapper,h=e.mixin,f=e.registerWrapper,m=e.unwrap,g=e.wrap,w=e.wrapEventTargetMethods;e.wrapNodeList;var v=new SideTable;t.prototype=Object.create(l.prototype),c(t,"documentElement"),c(t,"body"),c(t,"head"),["getElementById","createElement","createElementNS","createTextNode","createDocumentFragment","createEvent","createEventNS"].forEach(n);var E=document.adoptNode,y=document.write;h(t.prototype,{adoptNode:function(e){return E.call(this.impl,m(e)),e},elementFromPoint:function(e,t){return d(this,this,e,t)},write:function(e){for(var t=this.querySelectorAll("*"),n=t[t.length-1];n.nextSibling;)n=n.nextSibling;var r=n.parentNode;r.lastChild_=void 0,n.nextSibling_=void 0,y.call(this.impl,e)}}),p([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement],["appendChild","compareDocumentPosition","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),p([window.HTMLDocument||window.Document],["adoptNode","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createTextNode","elementFromPoint","getElementById","write"]),h(t.prototype,a),h(t.prototype,s),h(t.prototype,u),h(t.prototype,{get implementation(){var e=v.get(this);return e?e:(e=new r(m(this).implementation),v.set(this,e),e)}}),f(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&f(window.HTMLDocument,t),w([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),i(r,"createDocumentType"),i(r,"createDocument"),i(r,"createHTMLDocument"),o(r,"hasFeature"),f(window.DOMImplementation,r),p([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),e.wrappers.Document=t,e.wrappers.DOMImplementation=r}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,i=e.registerWrapper,o=e.unwrap,a=e.unwrapIfNeeded,l=e.wrap,s=window.Window;t.prototype=Object.create(n.prototype);var u=window.getComputedStyle;s.prototype.getComputedStyle=function(e,t){return u.call(this||window,a(e),t)},["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){s.prototype[e]=function(){var t=l(this||window);return t[e].apply(t,arguments)}}),r(t.prototype,{getComputedStyle:function(e,t){return u.call(o(this),a(e),t)}}),i(s,t),e.wrappers.Window=t}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){this.impl=e}function n(e){return new t(e)}function r(e){return e.map(n)}function i(e){var t=this;this.impl=new c(function(n){e.call(t,r(n),t)})}var o=e.defineGetter,a=e.defineWrapGetter,l=e.registerWrapper,s=e.unwrapIfNeeded,u=e.wrapNodeList;e.wrappers;var c=window.MutationObserver||window.WebKitMutationObserver;if(c){var d=window.MutationRecord;t.prototype={get addedNodes(){return u(this.impl.addedNodes)},get removedNodes(){return u(this.impl.removedNodes)}},["target","previousSibling","nextSibling"].forEach(function(e){a(t,e)}),["type","attributeName","attributeNamespace","oldValue"].forEach(function(e){o(t,e,function(){return this.impl[e]
+})}),d&&l(d,t),window.Node,i.prototype={observe:function(e,t){this.impl.observe(s(e),t)},disconnect:function(){this.impl.disconnect()},takeRecords:function(){return r(this.impl.takeRecords())}},e.wrappers.MutationObserver=i,e.wrappers.MutationRecord=t}}(this.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var i=document.createElement(e),o=i.constructor;window[t]=o}}e.isWrapperFor;var n={a:"HTMLAnchorElement",applet:"HTMLAppletElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",br:"HTMLBRElement",base:"HTMLBaseElement",body:"HTMLBodyElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",dl:"HTMLDListElement",datalist:"HTMLDataListElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",hr:"HTMLHRElement",head:"HTMLHeadElement",h1:"HTMLHeadingElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",input:"HTMLInputElement",li:"HTMLLIElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",link:"HTMLLinkElement",map:"HTMLMapElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",del:"HTMLModElement",ol:"HTMLOListElement",object:"HTMLObjectElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",table:"HTMLTableElement",tr:"HTMLTableRowElement",thead:"HTMLTableSectionElement",tbody:"HTMLTableSectionElement",textarea:"HTMLTextAreaElement",title:"HTMLTitleElement",ul:"HTMLUListElement",video:"HTMLVideoElement"};Object.keys(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]}),e.knownElements=n}(this.ShadowDOMPolyfill),function(){var e=window.ShadowDOMPolyfill;e.wrap,Object.defineProperties(HTMLElement.prototype,{webkitShadowRoot:{get:function(){return this.shadowRoot}}}),HTMLElement.prototype.webkitCreateShadowRoot=HTMLElement.prototype.createShadowRoot,window.dartExperimentalFixupGetTag=function(t){function n(e){if(e instanceof r)return"NodeList";if(e instanceof i)return"ShadowRoot";if(e instanceof MutationRecord)return"MutationRecord";if(e instanceof MutationObserver)return"MutationObserver";if(o(e)){e=a(e);var n=e.constructor;if(n&&n._ShadowDOMPolyfill$isGeneratedWrapper){var l=n._ShadowDOMPolyfill$cacheTag_;return l||(l=Object.prototype.toString.call(e),l=l.substring(8,l.length-1),n._ShadowDOMPolyfill$cacheTag_=l),l}}return t(e)}var r=e.wrappers.NodeList,i=e.wrappers.ShadowRoot,o=e.isWrapper,a=e.unwrap;return n}}()}
\ No newline at end of file
diff --git a/pkg/unittest/lib/interactive_html_config.dart b/pkg/unittest/lib/interactive_html_config.dart
index 4f5dccd..106b071 100644
--- a/pkg/unittest/lib/interactive_html_config.dart
+++ b/pkg/unittest/lib/interactive_html_config.dart
@@ -20,7 +20,6 @@
 import 'dart:html';
 import 'dart:async';
 import 'dart:json' as json;
-import 'dart:math';
 
 import 'package:stack_trace/stack_trace.dart';
 
diff --git a/pkg/unittest/lib/mirror_matchers.dart b/pkg/unittest/lib/mirror_matchers.dart
index 7e91529..7d1597f 100644
--- a/pkg/unittest/lib/mirror_matchers.dart
+++ b/pkg/unittest/lib/mirror_matchers.dart
@@ -27,9 +27,7 @@
  */
 library mirror_matchers;
 
-import 'dart:async';
 import 'dart:mirrors';
-import 'package:meta/meta.dart';
 
 import 'matcher.dart';
 
diff --git a/pkg/unittest/lib/src/test_case.dart b/pkg/unittest/lib/src/test_case.dart
index 75e126c..d965082 100644
--- a/pkg/unittest/lib/src/test_case.dart
+++ b/pkg/unittest/lib/src/test_case.dart
@@ -68,7 +68,14 @@
   bool get isComplete => !enabled || result != null;
 
   Function _errorHandler(String stage) => (e) {
-    var stack = getAttachedStackTrace(e);
+    var stack;
+    // TODO(kevmoo): Ideally, getAttachedStackTrace should handle Error as well?
+    // https://code.google.com/p/dart/issues/detail?id=12240
+    if(e is Error) {
+      stack = e.stackTrace;
+    } else {
+      stack = getAttachedStackTrace(e);
+    }
     if (result == null || result == PASS) {
       if (e is TestFailure) {
         fail("$e", stack);
diff --git a/pkg/unittest/lib/unittest.dart b/pkg/unittest/lib/unittest.dart
index 081439f..43365f4 100644
--- a/pkg/unittest/lib/unittest.dart
+++ b/pkg/unittest/lib/unittest.dart
@@ -146,7 +146,6 @@
 import 'dart:async';
 import 'dart:collection';
 import 'dart:isolate';
-import 'dart:math' show max;
 import 'matcher.dart';
 export 'matcher.dart';
 
diff --git a/pkg/unittest/test/matchers_test.dart b/pkg/unittest/test/matchers_test.dart
index b78ee47..1ec1e92 100644
--- a/pkg/unittest/test/matchers_test.dart
+++ b/pkg/unittest/test/matchers_test.dart
@@ -7,7 +7,6 @@
 
 import 'package:unittest/unittest.dart';
 
-import 'test_common.dart';
 import 'test_utils.dart';
 
 void main() {
diff --git a/pkg/unittest/test/mirror_matchers_test.dart b/pkg/unittest/test/mirror_matchers_test.dart
index 22e011c..4a445ed 100644
--- a/pkg/unittest/test/mirror_matchers_test.dart
+++ b/pkg/unittest/test/mirror_matchers_test.dart
@@ -2,13 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-import 'dart:collection';
-
 import 'package:unittest/unittest.dart';
 import 'package:unittest/mirror_matchers.dart';
 
-import 'test_common.dart';
 import 'test_utils.dart';
 
 void main() {
diff --git a/pkg/unmodifiable_collection/test/unmodifiable_collection_test.dart b/pkg/unmodifiable_collection/test/unmodifiable_collection_test.dart
index 2e96e48..c71b7e8 100644
--- a/pkg/unmodifiable_collection/test/unmodifiable_collection_test.dart
+++ b/pkg/unmodifiable_collection/test/unmodifiable_collection_test.dart
@@ -443,11 +443,11 @@
   });
 
   testThrows("$name - removeWhere throws", () {
-    wrapped.removeWhere((E element) => false);
+    wrapped.removeWhere((element) => false);
   });
 
   testThrows("$name - retainWhere throws", () {
-    wrapped.retainWhere((E element) => true);
+    wrapped.retainWhere((element) => true);
   });
 
   testThrows("$name - removeRange throws", () {
diff --git a/pkg/watcher/lib/src/async_queue.dart b/pkg/watcher/lib/src/async_queue.dart
new file mode 100644
index 0000000..9456631
--- /dev/null
+++ b/pkg/watcher/lib/src/async_queue.dart
@@ -0,0 +1,74 @@
+// 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 watcher.async_queue;
+
+import 'dart:async';
+import 'dart:collection';
+
+typedef Future ItemProcessor<T>(T item);
+typedef void ErrorHandler(error);
+
+/// A queue of items that are sequentially, asynchronously processed.
+///
+/// Unlike [Stream.map] or [Stream.forEach], the callback used to process each
+/// item returns a [Future], and it will not advance to the next item until the
+/// current item is finished processing.
+///
+/// Items can be added at any point in time and processing will be started as
+/// needed. When all items are processed, it stops processing until more items
+/// are added.
+class AsyncQueue<T> {
+  final _items = new Queue<T>();
+
+  /// Whether or not the queue is currently waiting on a processing future to
+  /// complete.
+  bool _isProcessing = false;
+
+  /// The callback to invoke on each queued item.
+  ///
+  /// The next item in the queue will not be processed until the [Future]
+  /// returned by this completes.
+  final ItemProcessor<T> _processor;
+
+  /// The handler for errors thrown during processing.
+  ///
+  /// Used to avoid top-leveling asynchronous errors.
+  final ErrorHandler _errorHandler;
+
+  AsyncQueue(this._processor, {ErrorHandler onError})
+      : _errorHandler = onError;
+
+  /// Enqueues [item] to be processed and starts asynchronously processing it
+  /// if a process isn't already running.
+  void add(T item) {
+    _items.add(item);
+
+    // Start up the asynchronous processing if not already running.
+    if (_isProcessing) return;
+    _isProcessing = true;
+
+    _processNextItem().catchError(_errorHandler);
+  }
+
+  /// Removes all remaining items to be processed.
+  void clear() {
+    _items.clear();
+  }
+
+  /// Pulls the next item off [_items] and processes it.
+  ///
+  /// When complete, recursively calls itself to continue processing unless
+  /// the process was cancelled.
+  Future _processNextItem() {
+    var item = _items.removeFirst();
+    return _processor(item).then((_) {
+      if (_items.isNotEmpty) return _processNextItem();
+
+      // We have drained the queue, stop processing and wait until something
+      // has been enqueued.
+      _isProcessing = false;
+    });
+  }
+}
\ No newline at end of file
diff --git a/pkg/watcher/lib/src/directory_watcher.dart b/pkg/watcher/lib/src/directory_watcher.dart
index 61bf6c5..c5dd9db 100644
--- a/pkg/watcher/lib/src/directory_watcher.dart
+++ b/pkg/watcher/lib/src/directory_watcher.dart
@@ -9,6 +9,7 @@
 
 import 'package:crypto/crypto.dart';
 
+import 'async_queue.dart';
 import 'stat.dart';
 import 'watch_event.dart';
 
@@ -27,7 +28,7 @@
   Stream<WatchEvent> get events => _events.stream;
   StreamController<WatchEvent> _events;
 
-  _WatchState _state = _WatchState.notWatching;
+  _WatchState _state = _WatchState.UNSUBSCRIBED;
 
   /// A [Future] that completes when the watcher is initialized and watching
   /// for file changes.
@@ -51,6 +52,26 @@
   /// Used to tell which files have been modified.
   final _statuses = new Map<String, _FileStatus>();
 
+  /// The subscription used while [directory] is being listed.
+  ///
+  /// Will be `null` if a list is not currently happening.
+  StreamSubscription<FileSystemEntity> _listSubscription;
+
+  /// The queue of files waiting to be processed to see if they have been
+  /// modified.
+  ///
+  /// Processing a file is asynchronous, as is listing the directory, so the
+  /// queue exists to let each of those proceed at their own rate. The lister
+  /// will enqueue files as quickly as it can. Meanwhile, files are dequeued
+  /// and processed sequentially.
+  AsyncQueue<String> _filesToProcess;
+
+  /// The set of files that have been seen in the current directory listing.
+  ///
+  /// Used to tell which files have been removed: files that are in [_statuses]
+  /// but not in here when a poll completes have been removed.
+  final _polledFiles = new Set<String>();
+
   /// Creates a new [DirectoryWatcher] monitoring [directory].
   ///
   /// If [pollingDelay] is passed, it specifies the amount of time the watcher
@@ -60,82 +81,133 @@
   DirectoryWatcher(this.directory, {Duration pollingDelay})
       : pollingDelay = pollingDelay != null ? pollingDelay :
                                               new Duration(seconds: 1) {
-    _events = new StreamController<WatchEvent>.broadcast(onListen: () {
-      _state = _state.listen(this);
-    }, onCancel: () {
-      _state = _state.cancel(this);
-    });
+    _events = new StreamController<WatchEvent>.broadcast(
+        onListen: _watch, onCancel: _cancel);
+
+    _filesToProcess = new AsyncQueue<String>(_processFile,
+        onError: _events.addError);
   }
 
-  /// Starts the asynchronous polling process.
-  ///
-  /// Scans the contents of the directory and compares the results to the
-  /// previous scan. Loops to continue monitoring as long as there are
-  /// subscribers to the [events] stream.
-  Future _watch() {
-    var files = new Set<String>();
+  /// Scans to see which files were already present before the watcher was
+  /// subscribed to, and then starts watching the directory for changes.
+  void _watch() {
+    assert(_state == _WatchState.UNSUBSCRIBED);
+    _state = _WatchState.SCANNING;
+    _poll();
+  }
+
+  /// Stops watching the directory when there are no more subscribers.
+  void _cancel() {
+    assert(_state != _WatchState.UNSUBSCRIBED);
+    _state = _WatchState.UNSUBSCRIBED;
+
+    // If we're in the middle of listing the directory, stop.
+    if (_listSubscription != null) _listSubscription.cancel();
+
+    // Don't process any remaining files.
+    _filesToProcess.clear();
+    _polledFiles.clear();
+    _statuses.clear();
+
+    _ready = new Completer();
+  }
+
+  /// Scans the contents of the directory once to see which files have been
+  /// added, removed, and modified.
+  void _poll() {
+    _filesToProcess.clear();
+    _polledFiles.clear();
 
     var stream = new Directory(directory).list(recursive: true);
+    _listSubscription = stream.listen((entity) {
+      assert(_state != _WatchState.UNSUBSCRIBED);
 
-    return stream.map((entity) {
-      if (entity is! File) return new Future.value();
-      files.add(entity.path);
-      // TODO(rnystrom): These all run as fast as possible and read the
-      // contents of the files. That means there's a pretty big IO hit all at
-      // once. Maybe these should be queued up and rate limited?
-      return _refreshFile(entity.path);
-    }).toList().then((futures) {
-      // Once the listing is done, make sure to wait until each file is also
-      // done.
-      return Future.wait(futures);
-    }).then((_) {
-      var removedFiles = _statuses.keys.toSet().difference(files);
-      for (var removed in removedFiles) {
-        if (_state.shouldNotify) {
-          _events.add(new WatchEvent(ChangeType.REMOVE, removed));
-        }
-        _statuses.remove(removed);
-      }
+      if (entity is! File) return;
+      _filesToProcess.add(entity.path);
+    }, onDone: () {
+      assert(_state != _WatchState.UNSUBSCRIBED);
+      _listSubscription = null;
 
-      var previousState = _state;
-      _state = _state.finish(this);
-
-      // If we were already sending notifications, add a bit of delay before
-      // restarting just so that we don't whale on the file system.
-      // TODO(rnystrom): Tune this and/or make it tunable?
-      if (_state.shouldNotify) {
-        return new Future.delayed(pollingDelay);
-      }
-    }).then((_) {
-      // Make sure we haven't transitioned to a non-watching state during the
-      // delay.
-      if (_state.shouldWatch) _watch();
+      // Null tells the queue consumer that we're done listing.
+      _filesToProcess.add(null);
     });
   }
 
-  /// Compares the current state of the file at [path] to the state it was in
-  /// the last time it was scanned.
-  Future _refreshFile(String path) {
-    return getModificationTime(path).then((modified) {
-      var lastStatus = _statuses[path];
+  /// Processes [file] to determine if it has been modified since the last
+  /// time it was scanned.
+  Future _processFile(String file) {
+    assert(_state != _WatchState.UNSUBSCRIBED);
 
-      // If it's modification time hasn't changed, assume the file is unchanged.
-      if (lastStatus != null && lastStatus.modified == modified) return;
+    // `null` is the sentinel which means the directory listing is complete.
+    if (file == null) return _completePoll();
 
-      return _hashFile(path).then((hash) {
+    return getModificationTime(file).then((modified) {
+      if (_checkForCancel()) return;
+
+      var lastStatus = _statuses[file];
+
+      // If its modification time hasn't changed, assume the file is unchanged.
+      if (lastStatus != null && lastStatus.modified == modified) {
+        // The file is still here.
+        _polledFiles.add(file);
+        return;
+      }
+
+      return _hashFile(file).then((hash) {
+        if (_checkForCancel()) return;
+
         var status = new _FileStatus(modified, hash);
-        _statuses[path] = status;
+        _statuses[file] = status;
+        _polledFiles.add(file);
 
-        // Only notify if the file contents changed.
-        if (_state.shouldNotify &&
-            (lastStatus == null || !_sameHash(lastStatus.hash, hash))) {
-          var change = lastStatus == null ? ChangeType.ADD : ChangeType.MODIFY;
-          _events.add(new WatchEvent(change, path));
-        }
+        // Only notify while in the watching state.
+        if (_state != _WatchState.WATCHING) return;
+
+        // And the file is different.
+        var changed = lastStatus == null || !_sameHash(lastStatus.hash, hash);
+        if (!changed) return;
+
+        var type = lastStatus == null ? ChangeType.ADD : ChangeType.MODIFY;
+        _events.add(new WatchEvent(type, file));
       });
     });
   }
 
+  /// After the directory listing is complete, this determines which files were
+  /// removed and then restarts the next poll.
+  Future _completePoll() {
+    // Any files that were not seen in the last poll but that we have a
+    // status for must have been removed.
+    var removedFiles = _statuses.keys.toSet().difference(_polledFiles);
+    for (var removed in removedFiles) {
+      if (_state == _WatchState.WATCHING) {
+        _events.add(new WatchEvent(ChangeType.REMOVE, removed));
+      }
+      _statuses.remove(removed);
+    }
+
+    if (_state == _WatchState.SCANNING) {
+      _state = _WatchState.WATCHING;
+      _ready.complete();
+    }
+
+    // Wait and then poll again.
+    return new Future.delayed(pollingDelay).then((_) {
+      if (_checkForCancel()) return;
+      _poll();
+    });
+  }
+
+  /// Returns `true` and clears the processing queue if the watcher has been
+  /// unsubscribed.
+  bool _checkForCancel() {
+    if (_state != _WatchState.UNSUBSCRIBED) return false;
+
+    // Don't process any more files.
+    _filesToProcess.clear();
+    return true;
+  }
+
   /// Calculates the SHA-1 hash of the file at [path].
   Future<List<int>> _hashFile(String path) {
     return new File(path).readAsBytes().then((bytes) {
@@ -159,71 +231,29 @@
   }
 }
 
-/// An "event" that is sent to the [_WatchState] FSM to trigger state
-/// transitions.
-typedef _WatchState _WatchStateEvent(DirectoryWatcher watcher);
-
-/// The different states that the watcher can be in and the transitions between
-/// them.
-///
-/// This class defines a finite state machine for keeping track of what the
-/// asynchronous file polling is doing. Each instance of this is a state in the
-/// machine and its [listen], [cancel], and [finish] fields define the state
-/// transitions when those events occur.
+/// Enum class for the states that the [DirectoryWatcher] can be in.
 class _WatchState {
-  /// The watcher has no subscribers.
-  static final notWatching = new _WatchState(
-      listen: (watcher) {
-    watcher._watch();
-    return _WatchState.scanning;
-  });
+  /// There are no subscribers to the watcher's event stream and no watching
+  /// is going on.
+  static const UNSUBSCRIBED = const _WatchState("unsubscribed");
 
-  /// The watcher has subscribers and is scanning for pre-existing files.
-  static final scanning = new _WatchState(
-      cancel: (watcher) {
-    // No longer watching, so create a new incomplete ready future.
-    watcher._ready = new Completer();
-    return _WatchState.cancelling;
-  }, finish: (watcher) {
-    watcher._ready.complete();
-    return _WatchState.watching;
-  }, shouldWatch: true);
+  /// There are subscribers and the watcher is doing an initial scan of the
+  /// directory to see which files were already present before watching started.
+  ///
+  /// The watcher does not send notifications for changes that occurred while
+  /// there were no subscribers, or for files already present before watching.
+  /// The initial scan is used to determine what "before watching" state of
+  /// the file system was.
+  static const SCANNING = const _WatchState("scanning");
 
-  /// The watcher was unsubscribed while polling and we're waiting for the poll
-  /// to finish.
-  static final cancelling = new _WatchState(
-      listen: (_) => _WatchState.scanning,
-      finish: (_) => _WatchState.notWatching);
+  /// There are subscribers and the watcher is polling the directory to look
+  /// for changes.
+  static const WATCHING = const _WatchState("watching");
 
-  /// The watcher has subscribers, we have scanned for pre-existing files and
-  /// now we're polling for changes.
-  static final watching = new _WatchState(
-      cancel: (watcher) {
-    // No longer watching, so create a new incomplete ready future.
-    watcher._ready = new Completer();
-    return _WatchState.cancelling;
-  }, finish: (_) => _WatchState.watching,
-      shouldWatch: true, shouldNotify: true);
+  /// The name of the state.
+  final String name;
 
-  /// Called when the first subscriber to the watcher has been added.
-  final _WatchStateEvent listen;
-
-  /// Called when all subscriptions on the watcher have been cancelled.
-  final _WatchStateEvent cancel;
-
-  /// Called when a poll loop has finished.
-  final _WatchStateEvent finish;
-
-  /// If the directory watcher should be watching the file system while in
-  /// this state.
-  final bool shouldWatch;
-
-  /// If a change event should be sent for a file modification while in this
-  /// state.
-  final bool shouldNotify;
-
-  _WatchState({this.listen, this.cancel, this.finish,
-      this.shouldWatch: false, this.shouldNotify: false});
+  const _WatchState(this.name);
 }
 
 class _FileStatus {
diff --git a/pkg/watcher/test/directory_watcher_test.dart b/pkg/watcher/test/directory_watcher_test.dart
index 800d54d..9070179 100644
--- a/pkg/watcher/test/directory_watcher_test.dart
+++ b/pkg/watcher/test/directory_watcher_test.dart
@@ -2,11 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-import 'dart:io';
-
 import 'package:scheduled_test/scheduled_test.dart';
-import 'package:watcher/watcher.dart';
 
 import 'utils.dart';
 
diff --git a/pkg/watcher/test/no_subscription_test.dart b/pkg/watcher/test/no_subscription_test.dart
index e9cb4e3..d0a396a 100644
--- a/pkg/watcher/test/no_subscription_test.dart
+++ b/pkg/watcher/test/no_subscription_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:watcher/watcher.dart';
@@ -23,11 +22,11 @@
 
     // Subscribe to the events.
     var completer = new Completer();
-    var subscription = watcher.events.listen((event) {
+    var subscription = watcher.events.listen(wrapAsync((event) {
       expect(event.type, equals(ChangeType.ADD));
       expect(event.path, endsWith("file.txt"));
       completer.complete();
-    });
+    }));
 
     writeFile("file.txt");
 
@@ -45,20 +44,20 @@
     // Then start listening again.
     schedule(() {
       completer = new Completer();
-      subscription = watcher.events.listen((event) {
+      subscription = watcher.events.listen(wrapAsync((event) {
         // We should get an event for the third file, not the one added while
         // we weren't subscribed.
         expect(event.type, equals(ChangeType.ADD));
         expect(event.path, endsWith("added.txt"));
         completer.complete();
-      });
+      }));
     });
 
     // The watcher will have been cancelled and then resumed in the middle of
     // its pause between polling loops. That means the second scan to skip
     // what changed while we were unsubscribed won't happen until after that
     // delay is done. Wait long enough for that to happen.
-    schedule(() => new Future.delayed(new Duration(seconds: 1)));
+    schedule(() => new Future.delayed(watcher.pollingDelay * 2));
 
     // And add a third file.
     writeFile("added.txt");
diff --git a/pkg/watcher/test/ready_test.dart b/pkg/watcher/test/ready_test.dart
index dd799ce..11b77e0 100644
--- a/pkg/watcher/test/ready_test.dart
+++ b/pkg/watcher/test/ready_test.dart
@@ -3,10 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 
 import 'package:scheduled_test/scheduled_test.dart';
-import 'package:watcher/watcher.dart';
 
 import 'utils.dart';
 
diff --git a/pkg/watcher/test/utils.dart b/pkg/watcher/test/utils.dart
index 5053b76..65d4719 100644
--- a/pkg/watcher/test/utils.dart
+++ b/pkg/watcher/test/utils.dart
@@ -84,7 +84,7 @@
   // Wait until the scan is finished so that we don't miss changes to files
   // that could occur before the scan completes.
   if (waitForReady != false) {
-    schedule(() => _watcher.ready);
+    schedule(() => _watcher.ready, "wait for watcher to be ready");
   }
 
   currentSchedule.onComplete.schedule(() {
@@ -107,7 +107,7 @@
 
   // Schedule it so that later file modifications don't occur until after this
   // event is received.
-  schedule(() => future);
+  schedule(() => future, "wait for $type event");
 }
 
 void expectAddEvent(String path) {
@@ -149,14 +149,14 @@
       var milliseconds = _mockFileModificationTimes.putIfAbsent(path, () => 0);
       _mockFileModificationTimes[path]++;
     }
-  });
+  }, "write file $path");
 }
 
 /// Schedules deleting a file in the sandbox at [path].
 void deleteFile(String path) {
   schedule(() {
     new File(p.join(_sandboxDir, path)).deleteSync();
-  });
+  }, "delete file $path");
 }
 
 /// Schedules renaming a file in the sandbox from [from] to [to].
@@ -172,7 +172,7 @@
     // Manually update the mock modification time for the file.
     var milliseconds = _mockFileModificationTimes.putIfAbsent(to, () => 0);
     _mockFileModificationTimes[to]++;
-  });
+  }, "rename file $from to $to");
 }
 
 /// A [Matcher] for [WatchEvent]s.
diff --git a/pkg/yaml/lib/src/model.dart b/pkg/yaml/lib/src/model.dart
index d7ee481..37247f0 100644
--- a/pkg/yaml/lib/src/model.dart
+++ b/pkg/yaml/lib/src/model.dart
@@ -7,7 +7,6 @@
 /// representation graph.
 library model;
 
-import 'model.dart';
 import 'parser.dart';
 import 'utils.dart';
 import 'visitor.dart';
diff --git a/runtime/bin/builtin_natives.cc b/runtime/bin/builtin_natives.cc
index e45088f..36d7a75 100644
--- a/runtime/bin/builtin_natives.cc
+++ b/runtime/bin/builtin_natives.cc
@@ -97,7 +97,6 @@
 // Implementation of native functions which are used for some
 // test/debug functionality in standalone dart mode.
 void FUNCTION_NAME(Logger_PrintString)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   intptr_t length = 0;
   uint8_t* chars = NULL;
   Dart_Handle str = Dart_GetNativeArgument(args, 0);
@@ -113,7 +112,6 @@
   }
   fputc('\n', stdout);
   fflush(stdout);
-  Dart_ExitScope();
 }
 
 }  // namespace bin
diff --git a/runtime/bin/crypto.cc b/runtime/bin/crypto.cc
index af3d386b4a..4c0943a 100644
--- a/runtime/bin/crypto.cc
+++ b/runtime/bin/crypto.cc
@@ -12,7 +12,6 @@
 namespace bin {
 
 void FUNCTION_NAME(Crypto_GetRandomBytes)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle count_obj = Dart_GetNativeArgument(args, 0);
   int64_t count = 0;
   if (!DartUtils::GetInt64Value(count_obj, &count)) {
@@ -35,7 +34,6 @@
   Dart_ListSetAsBytes(result, 0, buffer, count);
   Dart_SetReturnValue(args, result);
   delete[] buffer;
-  Dart_ExitScope();
 }
 
 }  // namespace bin
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index a90694d..a2fdf9d 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -364,12 +364,12 @@
 static const uint8_t* ReadFileFully(const char* filename,
                                     intptr_t* file_len,
                                     const char** error_msg) {
+  *file_len = -1;
   void* stream = DartUtils::OpenFile(filename, false);
   if (stream == NULL) {
     SET_ERROR_MSG(error_msg, "Unable to open file: %s", filename);
     return NULL;
   }
-  *file_len = -1;
   const uint8_t* text_buffer = NULL;
   DartUtils::ReadFile(&text_buffer, file_len, stream);
   if (text_buffer == NULL || *file_len == -1) {
diff --git a/runtime/bin/dbg_connection_macos.cc b/runtime/bin/dbg_connection_macos.cc
index d6766fd..3ee5bf3 100644
--- a/runtime/bin/dbg_connection_macos.cc
+++ b/runtime/bin/dbg_connection_macos.cc
@@ -88,7 +88,10 @@
     int status =
         TEMP_FAILURE_RETRY(kevent(kqueue_fd_, &ev_add, 1, NULL, 0, NULL));
     if (status == -1) {
-      FATAL1("Failed adding debugger socket to kqueue: %s\n", strerror(errno));
+      const int kBufferSize = 1024;
+      char error_message[kBufferSize];
+      strerror_r(errno, error_message, kBufferSize);
+      FATAL1("Failed adding debugger socket to kqueue: %s\n", error_message);
     }
     */
   } else if (ident == wakeup_fds_[0]) {
@@ -112,7 +115,10 @@
     int result = TEMP_FAILURE_RETRY(
         kevent(kqueue_fd_, NULL, 0, events, kMaxEvents, NULL));
     if (result == -1) {
-      FATAL1("kevent failed %s\n", strerror(errno));
+      const int kBufferSize = 1024;
+      char error_message[kBufferSize];
+      strerror_r(errno, error_message, kBufferSize);
+      FATAL1("kevent failed %s\n", error_message);
     } else {
       ASSERT(result <= kMaxEvents);
       for (int i = 0; i < result; i++) {
@@ -141,7 +147,10 @@
   EV_SET(&event, wakeup_fds_[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
   int status = TEMP_FAILURE_RETRY(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
   if (status == -1) {
-    FATAL1("Failed adding wakeup pipe fd to kqueue: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(errno, error_message, kBufferSize);
+    FATAL1("Failed adding wakeup pipe fd to kqueue: %s\n", error_message);
   }
 
   // Register the listening socket.
@@ -149,7 +158,10 @@
          EVFILT_READ, EV_ADD, 0, 0, NULL);
   status = TEMP_FAILURE_RETRY(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
   if (status == -1) {
-    FATAL1("Failed adding listener socket to kqueue: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(errno, error_message, kBufferSize);
+    FATAL1("Failed adding listener socket to kqueue: %s\n", error_message);
   }
 }
 
diff --git a/runtime/bin/directory.cc b/runtime/bin/directory.cc
index 3d86916..0f771ee 100644
--- a/runtime/bin/directory.cc
+++ b/runtime/bin/directory.cc
@@ -22,18 +22,15 @@
 
 
 void FUNCTION_NAME(Directory_Current)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   char* current = Directory::Current();
   if (current != NULL) {
     Dart_SetReturnValue(args, DartUtils::NewString(current));
     free(current);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Directory_SetCurrent)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   int argc = Dart_GetNativeArgumentCount(args);
   Dart_Handle path;
   if (argc == 1) {
@@ -50,14 +47,12 @@
       Dart_SetReturnValue(args, err);
     }
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Directory_Exists)(Dart_NativeArguments args) {
   static const int kExists = 1;
   static const int kDoesNotExist = 0;
-  Dart_EnterScope();
   Dart_Handle path = Dart_GetNativeArgument(args, 0);
   Directory::ExistsResult result =
       Directory::Exists(DartUtils::GetStringValue(path));
@@ -70,12 +65,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Directory_Create)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle path = Dart_GetNativeArgument(args, 0);
   if (Directory::Create(DartUtils::GetStringValue(path))) {
     Dart_SetReturnValue(args, Dart_True());
@@ -84,12 +77,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Directory_CreateTemp)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle path = Dart_GetNativeArgument(args, 0);
   char* result = Directory::CreateTemp(DartUtils::GetStringValue(path));
   if (result != NULL) {
@@ -100,12 +91,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Directory_Delete)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle path = Dart_GetNativeArgument(args, 0);
   Dart_Handle recursive = Dart_GetNativeArgument(args, 1);
   if (Directory::Delete(DartUtils::GetStringValue(path),
@@ -116,12 +105,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Directory_Rename)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle path = Dart_GetNativeArgument(args, 0);
   Dart_Handle newPath = Dart_GetNativeArgument(args, 1);
   if (Directory::Rename(DartUtils::GetStringValue(path),
@@ -132,12 +119,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Directory_List)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle path = Dart_GetNativeArgument(args, 0);
   Dart_Handle recursive = Dart_GetNativeArgument(args, 1);
   // Create the list to hold the directory listing here, and pass it to the
@@ -156,7 +141,6 @@
                                     DartUtils::GetBooleanValue(follow_links));
   Directory::List(&sync_listing);
   Dart_SetReturnValue(args, results);
-  Dart_ExitScope();
 }
 
 
@@ -356,7 +340,6 @@
 
 
 void FUNCTION_NAME(Directory_NewServicePort)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_SetReturnValue(args, Dart_Null());
   Dart_Port service_port = Directory::GetServicePort();
   if (service_port != ILLEGAL_PORT) {
@@ -364,7 +347,6 @@
     Dart_Handle send_port = Dart_NewSendPort(service_port);
     Dart_SetReturnValue(args, send_port);
   }
-  Dart_ExitScope();
 }
 
 
diff --git a/runtime/bin/eventhandler.cc b/runtime/bin/eventhandler.cc
index 3cb5456..a07cf3d 100644
--- a/runtime/bin/eventhandler.cc
+++ b/runtime/bin/eventhandler.cc
@@ -89,7 +89,6 @@
  * holds the reference to the dart EventHandler object.
  */
 void FUNCTION_NAME(EventHandler_SendData)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle sender = Dart_GetNativeArgument(args, 1);
   intptr_t id = kInvalidId;
   if (Dart_IsNull(sender)) {
@@ -109,7 +108,6 @@
       event_handler->SendData(id, dart_port, data);
     }
   }
-  Dart_ExitScope();
 }
 
 }  // namespace bin
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index 258a96b..90f94b4 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -88,7 +88,10 @@
       sd->set_tracked_by_epoll(true);
     }
     if (status == -1) {
-      FATAL1("Failed updating epoll instance: %s", strerror(errno));
+      const int kBufferSize = 1024;
+      char error_message[kBufferSize];
+      strerror_r(errno, error_message, kBufferSize);
+      FATAL1("Failed updating epoll instance: %s", error_message);
     }
   }
 }
@@ -306,7 +309,10 @@
             event_mask = (1 << kCloseEvent);
             sd->MarkClosedRead();
           } else if (errno != EWOULDBLOCK) {
-            Log::PrintErr("Error recv: %s\n", strerror(errno));
+            const int kBufferSize = 1024;
+            char error_message[kBufferSize];
+            strerror_r(errno, error_message, kBufferSize);
+            Log::PrintErr("Error recv: %s\n", error_message);
           }
         }
       }
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index cae7403..111e7e6 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -320,7 +320,10 @@
             event_mask = (1 << kCloseEvent);
             sd->MarkClosedRead();
           } else if (errno != EWOULDBLOCK) {
-            Log::PrintErr("Error recv: %s\n", strerror(errno));
+            const int kBufferSize = 1024;
+            char error_buf[kBufferSize];
+            Log::PrintErr("Error recv: %s\n",
+                          strerror_r(errno, error_buf, kBufferSize));
           }
         }
       }
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index 1570015..971ef1b 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -63,7 +63,10 @@
     int status =
       TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, changes, NULL, 0, NULL));
     if (status == -1) {
-      FATAL1("Failed deleting events from kqueue: %s\n", strerror(errno));
+      const int kBufferSize = 1024;
+      char error_message[kBufferSize];
+      strerror_r(errno, error_message, kBufferSize);
+      FATAL1("Failed deleting events from kqueue: %s\n", error_message);
     }
   }
 }
@@ -142,7 +145,10 @@
   EV_SET(&event, interrupt_fds_[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
   int status = TEMP_FAILURE_RETRY(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
   if (status == -1) {
-    FATAL1("Failed adding interrupt fd to kqueue: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(errno, error_message, kBufferSize);
+    FATAL1("Failed adding interrupt fd to kqueue: %s\n", error_message);
   }
 }
 
@@ -337,7 +343,10 @@
   for (int i = 0; i < size; i++) {
     // If flag EV_ERROR is set it indicates an error in kevent processing.
     if ((events[i].flags & EV_ERROR) != 0) {
-      FATAL1("kevent failed %s\n", strerror(events[i].data));
+      const int kBufferSize = 1024;
+      char error_message[kBufferSize];
+      strerror_r(events[i].data, error_message, kBufferSize);
+      FATAL1("kevent failed %s\n", error_message);
     }
     if (events[i].udata != NULL) {
       SocketData* sd = reinterpret_cast<SocketData*>(events[i].udata);
@@ -405,7 +414,10 @@
                                                 kMaxEvents,
                                                 timeout));
     if (result == -1) {
-      FATAL1("kevent failed %s\n", strerror(errno));
+      const int kBufferSize = 1024;
+      char error_message[kBufferSize];
+      strerror_r(errno, error_message, kBufferSize);
+      FATAL1("kevent failed %s\n", error_message);
     } else {
       handler_impl->HandleTimeout();
       handler_impl->HandleEvents(events, result);
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index ad1d6c0..bb68071 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -77,7 +77,6 @@
 
 
 void FUNCTION_NAME(File_Open)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   const char* filename =
       DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
   int64_t mode = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1));
@@ -98,32 +97,26 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_Exists)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   const char* filename =
       DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
   bool exists = File::Exists(filename);
   Dart_SetReturnValue(args, Dart_NewBoolean(exists));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_Close)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
   ASSERT(file != NULL);
   delete file;
   Dart_SetReturnValue(args, Dart_NewInteger(0));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_ReadByte)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
   ASSERT(file != NULL);
   uint8_t buffer;
@@ -137,12 +130,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_WriteByte)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
   ASSERT(file != NULL);
   int64_t byte = 0;
@@ -162,12 +153,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_Read)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
   ASSERT(file != NULL);
   Dart_Handle length_object = Dart_GetNativeArgument(args, 1);
@@ -208,12 +197,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_ReadInto)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
   ASSERT(file != NULL);
   Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1);
@@ -246,12 +233,10 @@
     Dart_SetReturnValue(args, err);
   }
   delete[] buffer;
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_WriteFrom)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
   ASSERT(file != NULL);
 
@@ -292,12 +277,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_Position)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
   ASSERT(file != NULL);
   intptr_t return_value = file->Position();
@@ -308,12 +291,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_SetPosition)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
   ASSERT(file != NULL);
   int64_t position = 0;
@@ -331,12 +312,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_Truncate)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
   ASSERT(file != NULL);
   int64_t length = 0;
@@ -354,12 +333,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_Length)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
   ASSERT(file != NULL);
   intptr_t return_value = file->Length();
@@ -370,12 +347,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_LengthFromPath)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   const char* path =
       DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
   intptr_t return_value = File::LengthFromPath(path);
@@ -386,12 +361,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_LastModified)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   const char* name =
       DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
   int64_t return_value = File::LastModified(name);
@@ -402,12 +375,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_Flush)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
   ASSERT(file != NULL);
   if (file->Flush()) {
@@ -417,12 +388,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_Create)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   const char* str =
       DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
   bool result = File::Create(str);
@@ -433,12 +402,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_CreateLink)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   if (Dart_IsString(Dart_GetNativeArgument(args, 0)) &&
       Dart_IsString(Dart_GetNativeArgument(args, 1))) {
     const char* name =
@@ -456,12 +423,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_LinkTarget)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   if (Dart_IsString(Dart_GetNativeArgument(args, 0))) {
     const char* name =
         DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
@@ -480,12 +445,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_Delete)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   const char* str =
       DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
   bool result = File::Delete(str);
@@ -496,12 +459,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_DeleteLink)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   const char* str =
       DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
   bool result = File::DeleteLink(str);
@@ -512,12 +473,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_Rename)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   const char* old_path =
       DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
   const char* new_path =
@@ -530,12 +489,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_RenameLink)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   const char* old_path =
       DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
   const char* new_path =
@@ -548,12 +505,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_FullPath)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   const char* str =
       DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
   char* path = File::GetCanonicalPath(str);
@@ -565,32 +520,26 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_OpenStdio)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   int64_t fd = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 0));
   ASSERT(fd == 0 || fd == 1 || fd == 2);
   File* file = File::OpenStdio(static_cast<int>(fd));
   Dart_SetReturnValue(args, Dart_NewInteger(reinterpret_cast<intptr_t>(file)));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_GetStdioHandleType)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   int64_t fd = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 0));
   ASSERT(fd == 0 || fd == 1 || fd == 2);
   File::StdioHandleType type = File::GetStdioHandleType(static_cast<int>(fd));
   Dart_SetReturnValue(args, Dart_NewInteger(type));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_GetType)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   if (Dart_IsString(Dart_GetNativeArgument(args, 0)) &&
       Dart_IsBoolean(Dart_GetNativeArgument(args, 1))) {
     const char* str =
@@ -605,12 +554,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_Stat)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   if (Dart_IsString(Dart_GetNativeArgument(args, 0))) {
     const char* path =
         DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
@@ -644,12 +591,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(File_AreIdentical)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   if (Dart_IsString(Dart_GetNativeArgument(args, 0)) &&
       Dart_IsString(Dart_GetNativeArgument(args, 1))) {
     const char* path_1 =
@@ -670,7 +615,6 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
@@ -1324,7 +1268,6 @@
 
 
 void FUNCTION_NAME(File_NewServicePort)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_SetReturnValue(args, Dart_Null());
   Dart_Port service_port = File::GetServicePort();
   if (service_port != ILLEGAL_PORT) {
@@ -1332,7 +1275,6 @@
     Dart_Handle send_port = Dart_NewSendPort(service_port);
     Dart_SetReturnValue(args, send_port);
   }
-  Dart_ExitScope();
 }
 
 }  // namespace bin
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 9b5ff1b..54ad86a 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -317,7 +317,10 @@
   struct stat buf;
   int result = fstat(fd, &buf);
   if (result == -1) {
-    FATAL2("Failed stat on file descriptor %d: %s", fd, strerror(errno));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(errno, error_message, kBufferSize);
+    FATAL2("Failed stat on file descriptor %d: %s", fd, error_message);
   }
   if (S_ISCHR(buf.st_mode)) return kTerminal;
   if (S_ISFIFO(buf.st_mode)) return kPipe;
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index b45ce04..1e9b49e 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -48,9 +48,8 @@
   int err = TEMP_FAILURE_RETRY(close(handle_->fd()));
   if (err != 0) {
     const int kBufferSize = 1024;
-    char error_message[kBufferSize];
-    strerror_r(errno, error_message, kBufferSize);
-    Log::PrintErr("%s\n", error_message);
+    char error_buf[kBufferSize];
+    Log::PrintErr("%s\n", strerror_r(errno, error_buf, kBufferSize));
   }
   handle_->set_fd(kClosedFd);
 }
@@ -311,7 +310,10 @@
   struct stat buf;
   int result = fstat(fd, &buf);
   if (result == -1) {
-    FATAL2("Failed stat on file descriptor %d: %s", fd, strerror(errno));
+    const int kBufferSize = 1024;
+    char error_buf[kBufferSize];
+    FATAL2("Failed stat on file descriptor %d: %s", fd,
+           strerror_r(errno, error_buf, kBufferSize));
   }
   if (S_ISCHR(buf.st_mode)) return kTerminal;
   if (S_ISFIFO(buf.st_mode)) return kPipe;
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 3cf40de..7b3815a 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -319,7 +319,10 @@
   struct stat buf;
   int result = fstat(fd, &buf);
   if (result == -1) {
-    FATAL2("Failed stat on file descriptor %d: %s", fd, strerror(errno));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(errno, error_message, kBufferSize);
+    FATAL2("Failed stat on file descriptor %d: %s", fd, error_message);
   }
   if (S_ISCHR(buf.st_mode)) return kTerminal;
   if (S_ISFIFO(buf.st_mode)) return kPipe;
diff --git a/runtime/bin/filter.cc b/runtime/bin/filter.cc
index d864c34..43b08e7 100644
--- a/runtime/bin/filter.cc
+++ b/runtime/bin/filter.cc
@@ -37,7 +37,6 @@
 }
 
 void FUNCTION_NAME(Filter_CreateZLibInflate)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0);
   Filter* filter = new ZLibInflateFilter();
   if (filter == NULL || !filter->Init()) {
@@ -50,11 +49,9 @@
     delete filter;
     Dart_PropagateError(result);
   }
-  Dart_ExitScope();
 }
 
 void FUNCTION_NAME(Filter_CreateZLibDeflate)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0);
   Dart_Handle gzip_obj = Dart_GetNativeArgument(args, 1);
   Dart_Handle level_obj = Dart_GetNativeArgument(args, 2);
@@ -79,11 +76,9 @@
     delete filter;
     Dart_PropagateError(result);
   }
-  Dart_ExitScope();
 }
 
 void FUNCTION_NAME(Filter_Process)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0);
   Filter* filter = GetFilter(filter_obj);
   Dart_Handle data_obj = Dart_GetNativeArgument(args, 1);
@@ -121,12 +116,10 @@
     Dart_ThrowException(DartUtils::NewInternalError(
         "Call to Process while still processing data"));
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Filter_Processed)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0);
   Filter* filter = GetFilter(filter_obj);
   Dart_Handle flush_obj = Dart_GetNativeArgument(args, 1);
@@ -158,16 +151,13 @@
     memmove(io_buffer, filter->processed_buffer(), read);
     Dart_SetReturnValue(args, result);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Filter_End)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle filter_obj = Dart_GetNativeArgument(args, 0);
   Filter* filter = GetFilter(filter_obj);
   EndFilter(filter_obj, filter);
-  Dart_ExitScope();
 }
 
 
diff --git a/runtime/bin/filter_unsupported.cc b/runtime/bin/filter_unsupported.cc
index 617e1c9..1742559 100644
--- a/runtime/bin/filter_unsupported.cc
+++ b/runtime/bin/filter_unsupported.cc
@@ -12,32 +12,22 @@
 namespace bin {
 
 void FUNCTION_NAME(Filter_CreateZLibInflate)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_ThrowException(DartUtils::NewInternalError(
         "ZLibInflater and Deflater not supported on this platform"));
-  Dart_ExitScope();
 }
 
 void FUNCTION_NAME(Filter_CreateZLibDeflate)(Dart_NativeArguments args) {
-  Dart_EnterScope();
-  Dart_ExitScope();
 }
 
 void FUNCTION_NAME(Filter_Process)(Dart_NativeArguments args) {
-  Dart_EnterScope();
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Filter_Processed)(Dart_NativeArguments args) {
-  Dart_EnterScope();
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Filter_End)(Dart_NativeArguments args) {
-  Dart_EnterScope();
-  Dart_ExitScope();
 }
 
 }  // namespace bin
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index e771d89..30cfb06 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -33,6 +33,7 @@
   V(Platform_OperatingSystem, 0)                                               \
   V(Platform_PathSeparator, 0)                                                 \
   V(Platform_LocalHostname, 0)                                                 \
+  V(Platform_ExecutableName, 0)                                                \
   V(Platform_Environment, 0)                                                   \
   V(Platform_GetVersion, 0)                                                    \
   V(Process_Start, 10)                                                         \
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index b1d60ee..57c5168 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -289,7 +289,6 @@
 static int ParseArguments(int argc,
                           char** argv,
                           CommandLineOptions* vm_options,
-                          char** executable_name,
                           char** script_name,
                           CommandLineOptions* dart_options,
                           bool* print_flags_seen,
@@ -297,8 +296,8 @@
   const char* kPrefix = "--";
   const intptr_t kPrefixLen = strlen(kPrefix);
 
-  // Get the executable name.
-  *executable_name = argv[0];
+  // Store the executable name.
+  Platform::SetExecutableName(argv[0]);
 
   // Start the rest after the executable name.
   int i = 1;
@@ -360,17 +359,8 @@
 
 
 static Dart_Handle SetupRuntimeOptions(CommandLineOptions* options,
-                                       const char* executable_name,
                                        const char* script_name) {
   int options_count = options->count();
-  Dart_Handle dart_executable = DartUtils::NewString(executable_name);
-  if (Dart_IsError(dart_executable)) {
-    return dart_executable;
-  }
-  Dart_Handle dart_script = DartUtils::NewString(script_name);
-  if (Dart_IsError(dart_script)) {
-    return dart_script;
-  }
   Dart_Handle dart_arguments = Dart_NewList(options_count);
   if (Dart_IsError(dart_arguments)) {
     return dart_arguments;
@@ -394,35 +384,6 @@
   if (Dart_IsError(io_lib)) {
     return io_lib;
   }
-  Dart_Handle platform_class_name = DartUtils::NewString("Platform");
-  if (Dart_IsError(platform_class_name)) {
-    return platform_class_name;
-  }
-  Dart_Handle platform_type =
-      Dart_GetType(io_lib, platform_class_name, 0, NULL);
-  if (Dart_IsError(platform_type)) {
-    return platform_type;
-  }
-  Dart_Handle executable_name_name = DartUtils::NewString("_nativeExecutable");
-  if (Dart_IsError(executable_name_name)) {
-    return executable_name_name;
-  }
-  Dart_Handle set_executable_name =
-      Dart_SetField(platform_type,
-                    executable_name_name,
-                    dart_executable);
-  if (Dart_IsError(set_executable_name)) {
-    return set_executable_name;
-  }
-  Dart_Handle script_name_name = DartUtils::NewString("_nativeScript");
-  if (Dart_IsError(script_name_name)) {
-    return script_name_name;
-  }
-  Dart_Handle set_script_name =
-      Dart_SetField(platform_type, script_name_name, dart_script);
-  if (Dart_IsError(set_script_name)) {
-    return set_script_name;
-  }
   Dart_Handle runtime_options_class_name = DartUtils::NewString("_OptionsImpl");
   if (Dart_IsError(runtime_options_class_name)) {
     return runtime_options_class_name;
@@ -500,7 +461,26 @@
     return NULL;
   }
 
-  VmService::SendIsolateStartupMessage(Dart_GetMainPortId());
+  Dart_Handle io_lib_url = DartUtils::NewString("dart:io");
+  CHECK_RESULT(io_lib_url);
+  Dart_Handle io_lib = Dart_LookupLibrary(io_lib_url);
+  CHECK_RESULT(io_lib);
+  Dart_Handle platform_class_name = DartUtils::NewString("Platform");
+  CHECK_RESULT(platform_class_name);
+  Dart_Handle platform_type =
+      Dart_GetType(io_lib, platform_class_name, 0, NULL);
+  CHECK_RESULT(platform_type);
+  Dart_Handle script_name_name = DartUtils::NewString("_nativeScript");
+  CHECK_RESULT(script_name_name);
+  Dart_Handle dart_script = DartUtils::NewString(script_uri);
+  CHECK_RESULT(dart_script);
+  Dart_Handle set_script_name =
+      Dart_SetField(platform_type, script_name_name, dart_script);
+  CHECK_RESULT(set_script_name);
+
+  Dart_Handle debug_name = Dart_DebugName();
+  CHECK_RESULT(debug_name);
+  VmService::SendIsolateStartupMessage(Dart_GetMainPortId(), debug_name);
 
   // Make the isolate runnable so that it is ready to handle messages.
   Dart_ExitScope();
@@ -696,7 +676,6 @@
 
 
 int main(int argc, char** argv) {
-  char* executable_name;
   char* script_name;
   CommandLineOptions vm_options(argc);
   CommandLineOptions dart_options(argc);
@@ -716,7 +695,6 @@
   if (ParseArguments(argc,
                      argv,
                      &vm_options,
-                     &executable_name,
                      &script_name,
                      &dart_options,
                      &print_flags_seen,
@@ -833,7 +811,7 @@
 
     // Create a dart options object that can be accessed from dart code.
     Dart_Handle options_result =
-        SetupRuntimeOptions(&dart_options, executable_name, script_name);
+        SetupRuntimeOptions(&dart_options, script_name);
     if (Dart_IsError(options_result)) {
       return DartErrorExit(options_result);
     }
diff --git a/runtime/bin/platform.cc b/runtime/bin/platform.cc
index 495ffe3..4d1bbed 100644
--- a/runtime/bin/platform.cc
+++ b/runtime/bin/platform.cc
@@ -12,29 +12,24 @@
 namespace dart {
 namespace bin {
 
+const char* Platform::executable_name_ = NULL;
+
 void FUNCTION_NAME(Platform_NumberOfProcessors)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_SetReturnValue(args, Dart_NewInteger(Platform::NumberOfProcessors()));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Platform_OperatingSystem)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_SetReturnValue(args, DartUtils::NewString(Platform::OperatingSystem()));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Platform_PathSeparator)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_SetReturnValue(args, DartUtils::NewString(File::PathSeparator()));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Platform_LocalHostname)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   const intptr_t HOSTNAME_LENGTH = 256;
   char hostname[HOSTNAME_LENGTH];
   if (Platform::LocalHostname(hostname, HOSTNAME_LENGTH)) {
@@ -42,12 +37,16 @@
   } else {
     Dart_SetReturnValue(args, DartUtils::NewDartOSError());
   }
-  Dart_ExitScope();
 }
 
 
+void FUNCTION_NAME(Platform_ExecutableName)(Dart_NativeArguments args) {
+  ASSERT(Platform::GetExecutableName() != NULL);
+  Dart_SetReturnValue(
+      args, Dart_NewStringFromCString(Platform::GetExecutableName()));
+}
+
 void FUNCTION_NAME(Platform_Environment)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   intptr_t count = 0;
   char** env = Platform::Environment(&count);
   if (env == NULL) {
@@ -76,14 +75,11 @@
     Platform::FreeEnvironment(env, count);
     Dart_SetReturnValue(args, result);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Platform_GetVersion)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_SetReturnValue(args, Dart_NewStringFromCString(Dart_VersionString()));
-  Dart_ExitScope();
 }
 
 }  // namespace bin
diff --git a/runtime/bin/platform.h b/runtime/bin/platform.h
index 54412ba..dd195c3 100644
--- a/runtime/bin/platform.h
+++ b/runtime/bin/platform.h
@@ -34,7 +34,17 @@
   static char** Environment(intptr_t* count);
   static void FreeEnvironment(char** env, intptr_t count);
 
+  // Stores and gets the executable name.
+  static void SetExecutableName(const char* executable_name) {
+    executable_name_ = executable_name;
+  }
+  static const char* GetExecutableName() {
+    return executable_name_;
+  }
+
  private:
+  static const char* executable_name_;
+
   DISALLOW_ALLOCATION();
   DISALLOW_IMPLICIT_CONSTRUCTORS(Platform);
 };
diff --git a/runtime/bin/platform_patch.dart b/runtime/bin/platform_patch.dart
index 9d21d48..cfe7a80 100644
--- a/runtime/bin/platform_patch.dart
+++ b/runtime/bin/platform_patch.dart
@@ -9,6 +9,7 @@
   /* patch */ static String _operatingSystem()
       native "Platform_OperatingSystem";
   /* patch */ static _localHostname() native "Platform_LocalHostname";
+  /* patch */ static _executable() native "Platform_ExecutableName";
   /* patch */ static _environment() native "Platform_Environment";
   /* patch */ static String _version() native "Platform_GetVersion";
 }
diff --git a/runtime/bin/process.cc b/runtime/bin/process.cc
index a6a5e2c..21750f1 100644
--- a/runtime/bin/process.cc
+++ b/runtime/bin/process.cc
@@ -59,7 +59,6 @@
 }
 
 void FUNCTION_NAME(Process_Start)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle process =  Dart_GetNativeArgument(args, 0);
   intptr_t process_stdin;
   intptr_t process_stdout;
@@ -157,54 +156,44 @@
   delete[] string_environment;
   free(os_error_message);
   Dart_SetReturnValue(args, Dart_NewBoolean(error_code == 0));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Process_Kill)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle process = Dart_GetNativeArgument(args, 1);
   intptr_t pid = -1;
   Process::GetProcessIdNativeField(process, &pid);
   int signal = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2));
   bool success = Process::Kill(pid, signal);
   Dart_SetReturnValue(args, Dart_NewBoolean(success));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Process_Exit)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   int64_t status = 0;
   // Ignore result if passing invalid argument and just exit 0.
   DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &status);
-  Dart_ExitScope();
   exit(static_cast<int>(status));
 }
 
 
 void FUNCTION_NAME(Process_SetExitCode)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   int64_t status = 0;
   // Ignore result if passing invalid argument and just set exit code to 0.
   DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &status);
   Process::SetGlobalExitCode(status);
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Process_Sleep)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   int64_t milliseconds = 0;
   // Ignore result if passing invalid argument and just set exit code to 0.
   DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &milliseconds);
   TimerUtils::Sleep(milliseconds);
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Process_Pid)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   // Ignore result if passing invalid argument and just set exit code to 0.
   intptr_t pid = -1;
   Dart_Handle process = Dart_GetNativeArgument(args, 0);
@@ -214,7 +203,6 @@
     Process::GetProcessIdNativeField(process, &pid);
   }
   Dart_SetReturnValue(args, Dart_NewInteger(pid));
-  Dart_ExitScope();
 }
 
 
@@ -231,7 +219,6 @@
 
 
 void FUNCTION_NAME(SystemEncodingToString)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle bytes = Dart_GetNativeArgument(args, 0);
   intptr_t bytes_length = 0;
   Dart_Handle result = Dart_ListLength(bytes, &bytes_length);
@@ -247,12 +234,10 @@
       StringUtils::ConsoleStringToUtf8(reinterpret_cast<char*>(buffer));
   Dart_SetReturnValue(args, DartUtils::NewString(str));
   if (str != reinterpret_cast<char*>(buffer)) free(str);
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(StringToSystemEncoding)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle str = Dart_GetNativeArgument(args, 0);
   const char* utf8 = DartUtils::GetStringValue(str);
   const char* system_string = StringUtils::Utf8ToConsoleString(utf8);
@@ -262,7 +247,6 @@
   memmove(buffer, system_string, external_length);
   if (utf8 != system_string) free(const_cast<char*>(system_string));
   Dart_SetReturnValue(args, external_array);
-  Dart_ExitScope();
 }
 
 }  // namespace bin
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index 49df0c5..30a488b 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -267,7 +267,10 @@
 
 
 static void SetChildOsErrorMessage(char** os_error_message) {
-  *os_error_message = strdup(strerror(errno));
+  const int kBufferSize = 1024;
+  char error_message[kBufferSize];
+  strerror_r(errno, error_message, kBufferSize);
+  *os_error_message = strdup(error_message);
 }
 
 
@@ -290,7 +293,9 @@
   // In the case of failure in the child process write the errno and
   // the OS error message to the exec control pipe and exit.
   int child_errno = errno;
-  char* os_error_message = strerror(errno);
+  const int kBufferSize = 1024;
+  char os_error_message[kBufferSize];
+  strerror_r(errno, os_error_message, kBufferSize);
   ASSERT(sizeof(child_errno) == sizeof(errno));
   int bytes_written =
       FDUtils::WriteToBlocking(
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index 7d97425..6102e70 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -269,7 +269,9 @@
 
 
 static void SetChildOsErrorMessage(char** os_error_message) {
-  *os_error_message = strdup(strerror(errno));
+  const int kBufferSize = 1024;
+  char error_buf[kBufferSize];
+  *os_error_message = strdup(strerror_r(errno, error_buf, kBufferSize));
 }
 
 
@@ -292,7 +294,9 @@
   // In the case of failure in the child process write the errno and
   // the OS error message to the exec control pipe and exit.
   int child_errno = errno;
-  char* os_error_message = strerror(errno);
+  const int kBufferSize = 1024;
+  char error_buf[kBufferSize];
+  char* os_error_message = strerror_r(errno, error_buf, kBufferSize);
   ASSERT(sizeof(child_errno) == sizeof(errno));
   int bytes_written =
       FDUtils::WriteToBlocking(
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 3335181..c87523c 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -268,7 +268,10 @@
 
 
 static void SetChildOsErrorMessage(char** os_error_message) {
-  *os_error_message = strdup(strerror(errno));
+  const int kBufferSize = 1024;
+  char error_message[kBufferSize];
+  strerror_r(errno, error_message, kBufferSize);
+  *os_error_message = strdup(error_message);
 }
 
 
@@ -291,7 +294,9 @@
   // In the case of failure in the child process write the errno and
   // the OS error message to the exec control pipe and exit.
   int child_errno = errno;
-  char* os_error_message = strerror(errno);
+  const int kBufferSize = 1024;
+  char os_error_message[kBufferSize];
+  strerror_r(errno, os_error_message, kBufferSize);
   ASSERT(sizeof(child_errno) == sizeof(errno));
   int bytes_written =
       FDUtils::WriteToBlocking(
diff --git a/runtime/bin/secure_socket.cc b/runtime/bin/secure_socket.cc
index ad6ae82..8a45101 100644
--- a/runtime/bin/secure_socket.cc
+++ b/runtime/bin/secure_socket.cc
@@ -106,17 +106,14 @@
 
 
 void FUNCTION_NAME(SecureSocket_Init)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0));
   SSLFilter* filter = new SSLFilter;
   SetFilter(args, filter);
   filter->Init(dart_this);
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_Connect)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle host_name_object = ThrowIfError(Dart_GetNativeArgument(args, 1));
   Dart_Handle host_sockaddr_storage_object =
       ThrowIfError(Dart_GetNativeArgument(args, 2));
@@ -168,29 +165,23 @@
                            request_client_certificate,
                            require_client_certificate,
                            send_client_certificate);
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_Destroy)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   SSLFilter* filter = GetFilter(args);
   SetFilter(args, NULL);
   filter->Destroy();
   delete filter;
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_Handshake)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   GetFilter(args)->Handshake();
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_Renegotiate)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   bool use_session_cache =
       DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 1));
   bool request_client_certificate =
@@ -200,13 +191,11 @@
   GetFilter(args)->Renegotiate(use_session_cache,
                                request_client_certificate,
                                require_client_certificate);
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_RegisterHandshakeCompleteCallback)(
     Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle handshake_complete =
       ThrowIfError(Dart_GetNativeArgument(args, 1));
   if (!Dart_IsClosure(handshake_complete)) {
@@ -214,13 +203,11 @@
         "Illegal argument to RegisterHandshakeCompleteCallback"));
   }
   GetFilter(args)->RegisterHandshakeCompleteCallback(handshake_complete);
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_RegisterBadCertificateCallback)(
     Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle callback =
       ThrowIfError(Dart_GetNativeArgument(args, 1));
   if (!Dart_IsClosure(callback) && !Dart_IsNull(callback)) {
@@ -228,13 +215,11 @@
         "Illegal argument to RegisterBadCertificateCallback"));
   }
   GetFilter(args)->RegisterBadCertificateCallback(callback);
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_InitializeLibrary)
     (Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle certificate_database_object =
       ThrowIfError(Dart_GetNativeArgument(args, 0));
   // Check that the type is string, and get the UTF-8 C string value from it.
@@ -274,7 +259,6 @@
   }
 
   SSLFilter::InitializeLibrary(certificate_database, password, builtin_roots);
-  Dart_ExitScope();
 }
 
 
@@ -318,7 +302,6 @@
 
 void FUNCTION_NAME(SecureSocket_AddCertificate)
     (Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle certificate_object =
       ThrowIfError(Dart_GetNativeArgument(args, 0));
   Dart_Handle trust_object = ThrowIfError(Dart_GetNativeArgument(args, 1));
@@ -358,7 +341,6 @@
   }
 
   Dart_SetReturnValue(args, X509FromCertificate(cert));
-  Dart_ExitScope();
   return;
 }
 
@@ -366,17 +348,13 @@
 
 void FUNCTION_NAME(SecureSocket_PeerCertificate)
     (Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_SetReturnValue(args, GetFilter(args)->PeerCertificate());
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_FilterPointer)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   intptr_t filter_pointer = reinterpret_cast<intptr_t>(GetFilter(args));
   Dart_SetReturnValue(args, Dart_NewInteger(filter_pointer));
-  Dart_ExitScope();
 }
 
 
@@ -1039,7 +1017,6 @@
 
 
 void FUNCTION_NAME(SecureSocket_NewServicePort)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_SetReturnValue(args, Dart_Null());
   Dart_Port service_port = SSLFilter::GetServicePort();
   if (service_port != ILLEGAL_PORT) {
@@ -1047,7 +1024,6 @@
     Dart_Handle send_port = Dart_NewSendPort(service_port);
     Dart_SetReturnValue(args, send_port);
   }
-  Dart_ExitScope();
 }
 
 
diff --git a/runtime/bin/secure_socket_unsupported.cc b/runtime/bin/secure_socket_unsupported.cc
index 6695fa9..f382425 100644
--- a/runtime/bin/secure_socket_unsupported.cc
+++ b/runtime/bin/secure_socket_unsupported.cc
@@ -12,110 +12,84 @@
 namespace bin {
 
 void FUNCTION_NAME(SecureSocket_Init)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_Connect)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_AddCertificate)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_Destroy)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_Handshake)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_RegisterHandshakeCompleteCallback)(
     Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_RegisterBadCertificateCallback)(
     Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_ProcessBuffer)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_InitializeLibrary)
     (Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_PeerCertificate)
     (Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_FilterPointer)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_Renegotiate)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(SecureSocket_NewServicePort)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
-  Dart_ExitScope();
 }
 }  // namespace bin
 }  // namespace dart
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index 68d40d8..13467af 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -39,7 +39,6 @@
 
 
 void FUNCTION_NAME(InternetAddress_Fixed)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle id_obj = Dart_GetNativeArgument(args, 0);
   ASSERT(!Dart_IsError(id_obj));
   int64_t id = 0;
@@ -79,12 +78,10 @@
   if (Dart_IsError(result)) Dart_PropagateError(result);
   Dart_ListSetAsBytes(result, 0, reinterpret_cast<uint8_t *>(&raw), len);
   Dart_SetReturnValue(args, result);
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
   Dart_Handle host_obj = Dart_GetNativeArgument(args, 1);
   RawAddr addr;
@@ -108,12 +105,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
   intptr_t socket = 0;
   Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
@@ -124,12 +119,10 @@
   } else {
     Dart_SetReturnValue(args, DartUtils::NewDartOSError());
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Socket_Read)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   static bool short_socket_reads = Dart_IsVMFlagSet("short_socket_read");
   Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
   intptr_t socket = 0;
@@ -181,13 +174,10 @@
   } else {
     Dart_SetReturnValue(args, DartUtils::NewDartOSError());
   }
-
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   static bool short_socket_writes = Dart_IsVMFlagSet("short_socket_write");
   Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
   intptr_t socket = 0;
@@ -220,12 +210,10 @@
     Dart_TypedDataReleaseData(buffer_obj);
     Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
   intptr_t socket = 0;
   Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
@@ -237,12 +225,10 @@
   } else {
     Dart_SetReturnValue(args, DartUtils::NewDartOSError());
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
   intptr_t socket = 0;
   Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
@@ -259,12 +245,10 @@
   } else {
     Dart_SetReturnValue(args, DartUtils::NewDartOSError());
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
   intptr_t socket = 0;
   Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
@@ -272,12 +256,10 @@
   OSError os_error;
   Socket::GetError(socket, &os_error);
   Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Socket_GetType)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
   intptr_t socket = 0;
   Socket::GetSocketIdNativeField(socket_obj, &socket);
@@ -288,12 +270,10 @@
   } else {
     Dart_SetReturnValue(args, DartUtils::NewDartOSError());
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
   intptr_t num =
       DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 1));
@@ -302,12 +282,10 @@
   Dart_Handle err = Socket::SetSocketIdNativeField(socket_obj, socket);
   if (Dart_IsError(err)) Dart_PropagateError(err);
   Dart_SetReturnValue(args, Dart_NewBoolean(socket >= 0));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
   Dart_Handle host_obj = Dart_GetNativeArgument(args, 1);
   RawAddr addr;
@@ -343,12 +321,10 @@
     if (Dart_IsError(err)) Dart_PropagateError(err);
     Dart_SetReturnValue(args, err);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
   intptr_t socket = 0;
   Dart_Handle err = Socket::GetSocketIdNativeField(socket_obj, &socket);
@@ -365,7 +341,6 @@
   } else {
     Dart_SetReturnValue(args, DartUtils::NewDartOSError());
   }
-  Dart_ExitScope();
 }
 
 
@@ -546,7 +521,6 @@
 
 
 void FUNCTION_NAME(Socket_NewServicePort)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_SetReturnValue(args, Dart_Null());
   Dart_Port service_port = Socket::GetServicePort();
   if (service_port != ILLEGAL_PORT) {
@@ -554,12 +528,10 @@
     Dart_Handle send_port = Dart_NewSendPort(service_port);
     Dart_SetReturnValue(args, send_port);
   }
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle socket_obj = Dart_GetNativeArgument(args, 0);
   intptr_t socket = 0;
   bool result = false;
@@ -581,7 +553,6 @@
       break;
   }
   Dart_SetReturnValue(args, Dart_NewBoolean(result));
-  Dart_ExitScope();
 }
 
 
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 976efcf..8ef4234 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -47,7 +47,10 @@
 
   fd = TEMP_FAILURE_RETRY(socket(addr.ss.ss_family, SOCK_STREAM, 0));
   if (fd < 0) {
-    Log::PrintErr("Error Create: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(errno, error_message, kBufferSize);
+    Log::PrintErr("Error Create: %s\n", error_message);
     return -1;
   }
 
@@ -121,7 +124,10 @@
           getsockname(fd,
                       &raw.addr,
                       &size))) {
-    Log::PrintErr("Error getsockname: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(errno, error_message, kBufferSize);
+    Log::PrintErr("Error getsockname: %s\n", error_message);
     return 0;
   }
   return SocketAddress::GetAddrPort(&raw);
@@ -136,7 +142,10 @@
           getpeername(fd,
                       &raw.addr,
                       &size))) {
-    Log::PrintErr("Error getpeername: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(errno, error_message, kBufferSize);
+    Log::PrintErr("Error getpeername: %s\n", error_message);
     return false;
   }
   const void* src;
@@ -149,7 +158,10 @@
                 src,
                 host,
                 INET_ADDRSTRLEN) == NULL) {
-    Log::PrintErr("Error inet_ntop: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(errno, error_message, kBufferSize);
+    Log::PrintErr("Error inet_ntop: %s\n", error_message);
     return false;
   }
   *port = SocketAddress::GetAddrPort(&raw);
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index 571a876..f247f5d 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -48,7 +48,10 @@
 
   fd = TEMP_FAILURE_RETRY(socket(addr.ss.ss_family, SOCK_STREAM, 0));
   if (fd < 0) {
-    Log::PrintErr("Error Create: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_buf[kBufferSize];
+    Log::PrintErr("Error Create: %s\n",
+                  strerror_r(errno, error_buf, kBufferSize));
     return -1;
   }
 
@@ -122,7 +125,10 @@
           getsockname(fd,
                       &raw.addr,
                       &size))) {
-    Log::PrintErr("Error getsockname: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_buf[kBufferSize];
+    Log::PrintErr("Error getsockname: %s\n",
+                  strerror_r(errno, error_buf, kBufferSize));
     return 0;
   }
   return SocketAddress::GetAddrPort(&raw);
@@ -137,7 +143,10 @@
           getpeername(fd,
                       &raw.addr,
                       &size))) {
-    Log::PrintErr("Error getpeername: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_buf[kBufferSize];
+    Log::PrintErr("Error getpeername: %s\n",
+                  strerror_r(errno, error_buf, kBufferSize));
     return false;
   }
   const void* src;
@@ -150,7 +159,10 @@
                 src,
                 host,
                 INET_ADDRSTRLEN) == NULL) {
-    Log::PrintErr("Error inet_ntop: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_buf[kBufferSize];
+    Log::PrintErr("Error inet_ntop: %s\n",
+                  strerror_r(errno, error_buf, kBufferSize));
     return false;
   }
   *port = SocketAddress::GetAddrPort(&raw);
@@ -382,9 +394,8 @@
   int err = TEMP_FAILURE_RETRY(close(fd));
   if (err != 0) {
     const int kBufferSize = 1024;
-    char error_message[kBufferSize];
-    strerror_r(errno, error_message, kBufferSize);
-    Log::PrintErr("%s\n", error_message);
+    char error_buf[kBufferSize];
+    Log::PrintErr("%s\n", strerror_r(errno, error_buf, kBufferSize));
   }
 }
 
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index 81b2d02..2e2dbb6 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -48,7 +48,10 @@
 
   fd = TEMP_FAILURE_RETRY(socket(addr.ss.ss_family, SOCK_STREAM, 0));
   if (fd < 0) {
-    Log::PrintErr("Error Create: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(errno, error_message, kBufferSize);
+    Log::PrintErr("Error Create: %s\n", error_message);
     return -1;
   }
 
@@ -122,7 +125,10 @@
           getsockname(fd,
                       &raw.addr,
                       &size))) {
-    Log::PrintErr("Error getsockname: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(errno, error_message, kBufferSize);
+    Log::PrintErr("Error getsockname: %s\n", error_message);
     return 0;
   }
   return SocketAddress::GetAddrPort(&raw);
@@ -137,7 +143,10 @@
           getpeername(fd,
                       &raw.addr,
                       &size))) {
-    Log::PrintErr("Error getpeername: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(errno, error_message, kBufferSize);
+    Log::PrintErr("Error getpeername: %s\n", error_message);
     return false;
   }
   const void* src;
@@ -150,7 +159,10 @@
                 src,
                 host,
                 INET_ADDRSTRLEN) == NULL) {
-    Log::PrintErr("Error inet_ntop: %s\n", strerror(errno));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(errno, error_message, kBufferSize);
+    Log::PrintErr("Error inet_ntop: %s\n", error_message);
     return false;
   }
   *port = SocketAddress::GetAddrPort(&raw);
diff --git a/runtime/bin/stdin.cc b/runtime/bin/stdin.cc
index 808bf8a..5b21b5b 100644
--- a/runtime/bin/stdin.cc
+++ b/runtime/bin/stdin.cc
@@ -18,27 +18,21 @@
 namespace bin {
 
 void FUNCTION_NAME(Stdin_ReadByte)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_SetReturnValue(args, Dart_NewInteger(Stdin::ReadByte()));
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Stdin_SetEchoMode)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   bool enabled = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 1));
   Stdin::SetEchoMode(enabled);
   Dart_SetReturnValue(args, Dart_Null());
-  Dart_ExitScope();
 }
 
 
 void FUNCTION_NAME(Stdin_SetLineMode)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   bool enabled = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 1));
   Stdin::SetLineMode(enabled);
   Dart_SetReturnValue(args, Dart_Null());
-  Dart_ExitScope();
 }
 
 }  // namespace bin
diff --git a/runtime/bin/utils_android.cc b/runtime/bin/utils_android.cc
index 25022b5..e88d248 100644
--- a/runtime/bin/utils_android.cc
+++ b/runtime/bin/utils_android.cc
@@ -19,7 +19,10 @@
 OSError::OSError() : sub_system_(kSystem), code_(0), message_(NULL) {
   set_sub_system(kSystem);
   set_code(errno);
-  SetMessage(strerror(errno));
+  const int kBufferSize = 1024;
+  char error_message[kBufferSize];
+  strerror_r(errno, error_message, kBufferSize);
+  SetMessage(error_message);
 }
 
 
@@ -27,7 +30,10 @@
   set_sub_system(sub_system);
   set_code(code);
   if (sub_system == kSystem) {
-    SetMessage(strerror(code));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(code, error_message, kBufferSize);
+    SetMessage(error_message);
   } else if (sub_system == kGetAddressInfo) {
     SetMessage(gai_strerror(code));
   } else {
diff --git a/runtime/bin/utils_linux.cc b/runtime/bin/utils_linux.cc
index e8230c8..66e6929 100644
--- a/runtime/bin/utils_linux.cc
+++ b/runtime/bin/utils_linux.cc
@@ -19,7 +19,9 @@
 OSError::OSError() : sub_system_(kSystem), code_(0), message_(NULL) {
   set_sub_system(kSystem);
   set_code(errno);
-  SetMessage(strerror(errno));
+  const int kBufferSize = 1024;
+  char error_buf[kBufferSize];
+  SetMessage(strerror_r(errno, error_buf, kBufferSize));
 }
 
 
@@ -27,7 +29,9 @@
   set_sub_system(sub_system);
   set_code(code);
   if (sub_system == kSystem) {
-    SetMessage(strerror(code));
+    const int kBufferSize = 1024;
+    char error_buf[kBufferSize];
+    SetMessage(strerror_r(code, error_buf, kBufferSize));
   } else if (sub_system == kGetAddressInfo) {
     SetMessage(gai_strerror(code));
   } else {
diff --git a/runtime/bin/utils_macos.cc b/runtime/bin/utils_macos.cc
index 69c738e..c47fedd 100644
--- a/runtime/bin/utils_macos.cc
+++ b/runtime/bin/utils_macos.cc
@@ -19,7 +19,10 @@
 OSError::OSError() : sub_system_(kSystem), code_(0), message_(NULL) {
   set_sub_system(kSystem);
   set_code(errno);
-  SetMessage(strerror(errno));
+  const int kBufferSize = 1024;
+  char error_message[kBufferSize];
+  strerror_r(errno, error_message, kBufferSize);
+  SetMessage(error_message);
 }
 
 
@@ -27,7 +30,10 @@
   set_sub_system(sub_system);
   set_code(code);
   if (sub_system == kSystem) {
-    SetMessage(strerror(code));
+    const int kBufferSize = 1024;
+    char error_message[kBufferSize];
+    strerror_r(code, error_message, kBufferSize);
+    SetMessage(error_message);
   } else if (sub_system == kGetAddressInfo) {
     SetMessage(gai_strerror(code));
   } else {
diff --git a/runtime/bin/vmservice/running_isolate.dart b/runtime/bin/vmservice/running_isolate.dart
index 6c7749a..2d4af13 100644
--- a/runtime/bin/vmservice/running_isolate.dart
+++ b/runtime/bin/vmservice/running_isolate.dart
@@ -6,9 +6,9 @@
 
 class RunningIsolate implements ServiceRequestRouter {
   final SendPort sendPort;
-  String name = 'Unknown';
+  final String name;
 
-  RunningIsolate(this.sendPort);
+  RunningIsolate(this.sendPort, this.name);
 
   Future sendMessage(List request) {
     final completer = new Completer.sync();
@@ -33,23 +33,4 @@
       return new Future.value(request);
     });
   }
-
-  void _sendNameRequest() {
-    var request = new ServiceRequest();
-    request.parse(Uri.parse('/name'));
-    sendMessage(request.toServiceCallMessage()).then(_handleNameResponse);
-  }
-
-  void _handleNameResponse(String responseString) {
-    try {
-      var response = JSON.parse(responseString);
-      name = response['name'];
-    } catch (e) {
-      name = 'Error retrieving isolate name.';
-      return;
-    }
-    if (name == null) {
-      name = 'Error retrieving isolate name.';
-    }
-  }
 }
diff --git a/runtime/bin/vmservice/running_isolates.dart b/runtime/bin/vmservice/running_isolates.dart
index 57e56fb..945e4f2 100644
--- a/runtime/bin/vmservice/running_isolates.dart
+++ b/runtime/bin/vmservice/running_isolates.dart
@@ -9,13 +9,12 @@
 
   RunningIsolates();
 
-  void isolateStartup(SendPort sp) {
+  void isolateStartup(SendPort sp, String name) {
     if (isolates[sp.hashCode] != null) {
       throw new StateError('Duplicate isolate startup.');
     }
-    var ri = new RunningIsolate(sp);
+    var ri = new RunningIsolate(sp, name);
     isolates[sp.hashCode] = ri;
-    ri._sendNameRequest();
   }
 
   void isolateShutdown(SendPort sp) {
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart
index 9eed701..08e8d9b 100644
--- a/runtime/bin/vmservice/server.dart
+++ b/runtime/bin/vmservice/server.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 vmservice;
+part of vmservice_io;
 
 class Server {
   int port;
diff --git a/runtime/bin/vmservice/vmservice.dart b/runtime/bin/vmservice/vmservice.dart
index f1f8995..a9790f1 100644
--- a/runtime/bin/vmservice/vmservice.dart
+++ b/runtime/bin/vmservice/vmservice.dart
@@ -6,21 +6,25 @@
 
 import 'dart:async';
 import 'dart:json' as JSON;
-// TODO(11927): Factor 'dart:io' dependency into separate library.
-import 'dart:io';
 import 'dart:isolate';
 import 'dart:typed_data';
 import 'dart:utf' as UTF;
 
+part 'constants.dart';
+part 'resources.dart';
+part 'running_isolate.dart';
+part 'running_isolates.dart';
+part 'service_request.dart';
+part 'service_request_router.dart';
 
-class VmService {
-  static VmService _instance;
+class VMService {
+  static VMService _instance;
   RunningIsolates runningIsolates = new RunningIsolates();
 
-  void controlMessageHandler(int code, SendPort sp) {
+  void controlMessageHandler(int code, SendPort sp, String name) {
     switch (code) {
       case Constants.ISOLATE_STARTUP_MESSAGE_ID:
-        runningIsolates.isolateStartup(sp);
+        runningIsolates.isolateStartup(sp, name);
       break;
       case Constants.ISOLATE_SHUTDOWN_MESSAGE_ID:
         runningIsolates.isolateShutdown(sp);
@@ -29,18 +33,18 @@
   }
 
   void messageHandler(message, SendPort replyTo) {
-    if (message is List && message.length == 2) {
-      controlMessageHandler(message[0], message[1]);
+    if (message is List && message.length == 3) {
+      controlMessageHandler(message[0], message[1], message[2]);
     }
   }
 
-  VmService._internal() {
+  VMService._internal() {
     port.receive(messageHandler);
   }
 
-  factory VmService() {
-    if (VmService._instance == null) {
-      VmService._instance = new VmService._internal();
+  factory VMService() {
+    if (VMService._instance == null) {
+      VMService._instance = new VMService._internal();
     }
     return _instance;
   }
diff --git a/runtime/bin/vmservice/vmservice_io.dart b/runtime/bin/vmservice/vmservice_io.dart
index 0ae0b6c..ee4ffb2 100644
--- a/runtime/bin/vmservice/vmservice_io.dart
+++ b/runtime/bin/vmservice/vmservice_io.dart
@@ -2,15 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(johnmccutchan): Convert this into separate library which imports
-// the vmservice library.
+library vmservice_io;
 
-part of vmservice;
+import 'dart:io';
+import 'vmservice.dart';
+
+part 'server.dart';
 
 var _port;
 
 main() {
-  var service = new VmService();
+  // Create VmService.
+  var service = new VMService();
+  // Start HTTP server.
   var server = new Server(service, _port);
   server.startServer();
 }
diff --git a/runtime/bin/vmservice_impl.cc b/runtime/bin/vmservice_impl.cc
index 69c2d48..a1a8e2c 100644
--- a/runtime/bin/vmservice_impl.cc
+++ b/runtime/bin/vmservice_impl.cc
@@ -42,19 +42,10 @@
   }
 
 #define kLibraryResourceNamePrefix "/vmservice"
-static const char* kLibraryScriptResourceName =
+static const char* kVMServiceIOLibraryScriptResourceName =
+    kLibraryResourceNamePrefix "/vmservice_io.dart";
+static const char* kVMServiceLibraryName =
     kLibraryResourceNamePrefix "/vmservice.dart";
-static const char* kLibrarySourceResourceNames[] = {
-    kLibraryResourceNamePrefix "/constants.dart",
-    kLibraryResourceNamePrefix "/resources.dart",
-    kLibraryResourceNamePrefix "/running_isolate.dart",
-    kLibraryResourceNamePrefix "/running_isolates.dart",
-    kLibraryResourceNamePrefix "/server.dart",
-    kLibraryResourceNamePrefix "/service_request.dart",
-    kLibraryResourceNamePrefix "/service_request_router.dart",
-    kLibraryResourceNamePrefix "/vmservice_io.dart",
-    NULL
-};
 
 #define kClientResourceNamePrefix "/client/web/out"
 
@@ -110,7 +101,7 @@
   }
 
   // Set up the library tag handler for this isolate.
-  Dart_Handle result = Dart_SetLibraryTagHandler(DartUtils::LibraryTagHandler);
+  Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler);
   SHUTDOWN_ON_ERROR(result);
 
   // Load the specified application script into the newly created isolate.
@@ -129,10 +120,8 @@
 
   {
     // Load source into service isolate.
-    Dart_Handle library = LoadScript(kLibraryScriptResourceName);
+    Dart_Handle library = LoadScript(kVMServiceIOLibraryScriptResourceName);
     SHUTDOWN_ON_ERROR(library);
-    result = LoadSources(library, kLibrarySourceResourceNames);
-    SHUTDOWN_ON_ERROR(result);
   }
 
   // Make the isolate runnable so that it is ready to handle messages.
@@ -154,9 +143,6 @@
   Dart_Handle library = Dart_RootLibrary();
   // Set requested port.
   DartUtils::SetIntegerField(library, "_port", server_port);
-  // Install native resolver.
-  result = Dart_SetNativeResolver(library, VmServiceNativeResolver);
-  SHUTDOWN_ON_ERROR(result);
   result = Dart_Invoke(library, DartUtils::NewString("main"), 0, NULL);
   SHUTDOWN_ON_ERROR(result);
 
@@ -194,25 +180,24 @@
 }
 
 
-Dart_Handle VmService::LoadScript(const char* name) {
-  Dart_Handle url = Dart_NewStringFromCString(name);
+Dart_Handle VmService::GetSource(const char* name) {
   const char* vmservice_source = NULL;
   int r = Resources::ResourceLookup(name, &vmservice_source);
   ASSERT(r != Resources::kNoSuchInstance);
-  Dart_Handle source = Dart_NewStringFromCString(vmservice_source);
+  return Dart_NewStringFromCString(vmservice_source);
+}
+
+
+Dart_Handle VmService::LoadScript(const char* name) {
+  Dart_Handle url = Dart_NewStringFromCString(name);
+  Dart_Handle source = GetSource(name);
   return Dart_LoadScript(url, source, 0, 0);
 }
 
 
 Dart_Handle VmService::LoadSource(Dart_Handle library, const char* name) {
   Dart_Handle url = Dart_NewStringFromCString(name);
-  const char* vmservice_source = NULL;
-  int r = Resources::ResourceLookup(name, &vmservice_source);
-  if (r == Resources::kNoSuchInstance) {
-    printf("Can't find %s\n", name);
-  }
-  ASSERT(r != Resources::kNoSuchInstance);
-  Dart_Handle source = Dart_NewStringFromCString(vmservice_source);
+  Dart_Handle source = GetSource(name);
   return Dart_LoadSource(library, url, source);
 }
 
@@ -285,6 +270,85 @@
 }
 
 
+static bool IsVMServiceURL(const char* url) {
+  static const intptr_t kLibraryResourceNamePrefixLen =
+      strlen(kLibraryResourceNamePrefix);
+  return 0 == strncmp(kLibraryResourceNamePrefix, url,
+                      kLibraryResourceNamePrefixLen);
+}
+
+
+static bool IsVMServiceLibrary(const char* url) {
+  return 0 == strcmp(kVMServiceLibraryName, url);
+}
+
+
+Dart_Handle VmService::LibraryTagHandler(Dart_LibraryTag tag,
+                                         Dart_Handle library,
+                                         Dart_Handle url) {
+  if (!Dart_IsLibrary(library)) {
+    return Dart_Error("not a library");
+  }
+  if (!Dart_IsString(url)) {
+    return Dart_Error("url is not a string");
+  }
+  const char* url_string = NULL;
+  Dart_Handle result = Dart_StringToCString(url, &url_string);
+  if (Dart_IsError(result)) {
+    return result;
+  }
+  Dart_Handle library_url = Dart_LibraryUrl(library);
+  const char* library_url_string = NULL;
+  result = Dart_StringToCString(library_url, &library_url_string);
+  if (Dart_IsError(result)) {
+    return result;
+  }
+  bool is_vm_service_url = IsVMServiceURL(url_string);
+  if (!is_vm_service_url) {
+    // Pass to DartUtils.
+    return DartUtils::LibraryTagHandler(tag, library, url);
+  }
+  switch (tag) {
+    case Dart_kCanonicalizeUrl:
+      // The URL is already canonicalized.
+      return url;
+    break;
+    case Dart_kImportTag: {
+      Dart_Handle source = GetSource(url_string);
+      if (Dart_IsError(source)) {
+        return source;
+      }
+      Dart_Handle lib = Dart_LoadLibrary(url, source);
+      if (Dart_IsError(lib)) {
+        return lib;
+      }
+      if (IsVMServiceLibrary(url_string)) {
+        // Install native resolver for this library.
+        result = Dart_SetNativeResolver(lib, VmServiceNativeResolver);
+        if (Dart_IsError(result)) {
+          return result;
+        }
+      }
+      return lib;
+    }
+    break;
+    case Dart_kSourceTag: {
+      Dart_Handle source = GetSource(url_string);
+      if (Dart_IsError(source)) {
+        return source;
+      }
+      return Dart_LoadSource(library, url, source);
+    }
+    break;
+    default:
+      UNIMPLEMENTED();
+    break;
+  }
+  UNREACHABLE();
+  return result;
+}
+
+
 void VmService::ThreadMain(uword parameters) {
   ASSERT(Dart_CurrentIsolate() == NULL);
   ASSERT(isolate_ == NULL);
@@ -323,26 +387,34 @@
 }
 
 
-static Dart_Handle MakeServiceControlMessage(Dart_Port port) {
-  Dart_Handle list = Dart_NewList(2);
+static Dart_Handle MakeServiceControlMessage(Dart_Port port, intptr_t code) {
+  Dart_Handle result;
+  Dart_Handle list = Dart_NewList(3);
   ASSERT(!Dart_IsError(list));
+  Dart_Handle codeHandle = Dart_NewInteger(code);
+  ASSERT(!Dart_IsError(codeHandle));
+  result = Dart_ListSetAt(list, 0, codeHandle);
+  ASSERT(!Dart_IsError(result));
   Dart_Handle sendPort = Dart_NewSendPort(port);
   ASSERT(!Dart_IsError(sendPort));
-  Dart_ListSetAt(list, 1, sendPort);
+  result = Dart_ListSetAt(list, 1, sendPort);
+  ASSERT(!Dart_IsError(result));
   return list;
 }
 
 
-bool VmService::SendIsolateStartupMessage(Dart_Port port) {
+bool VmService::SendIsolateStartupMessage(Dart_Port port, Dart_Handle name) {
   if (!IsRunning()) {
     return false;
   }
   Dart_Isolate isolate = Dart_CurrentIsolate();
   ASSERT(isolate != NULL);
   ASSERT(Dart_GetMainPortId() == port);
-  Dart_Handle list = MakeServiceControlMessage(port);
-  Dart_ListSetAt(list, 0,
-                 Dart_NewInteger(VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID));
+  Dart_Handle list =
+      MakeServiceControlMessage(port, VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID);
+  ASSERT(!Dart_IsError(list));
+  Dart_Handle result = Dart_ListSetAt(list, 2, name);
+  ASSERT(!Dart_IsError(result));
   return Dart_Post(port_, list);
 }
 
@@ -354,9 +426,9 @@
   Dart_Isolate isolate = Dart_CurrentIsolate();
   ASSERT(isolate != NULL);
   ASSERT(Dart_GetMainPortId() == port);
-  Dart_Handle list = MakeServiceControlMessage(port);
-  Dart_ListSetAt(list, 0,
-                 Dart_NewInteger(VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID));
+  Dart_Handle list =
+      MakeServiceControlMessage(port, VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID);
+  ASSERT(!Dart_IsError(list));
   return Dart_Post(port_, list);
 }
 
diff --git a/runtime/bin/vmservice_impl.h b/runtime/bin/vmservice_impl.h
index 7d6b08d..6a64560 100644
--- a/runtime/bin/vmservice_impl.h
+++ b/runtime/bin/vmservice_impl.h
@@ -23,7 +23,7 @@
 
   static bool IsRunning();
 
-  static bool SendIsolateStartupMessage(Dart_Port port);
+  static bool SendIsolateStartupMessage(Dart_Port port, Dart_Handle name);
   static bool SendIsolateShutdownMessage(Dart_Port port);
 
   static void VmServiceShutdownCallback(void* callback_data);
@@ -31,6 +31,7 @@
  private:
   static bool _Start(intptr_t server_port);
   static void _Stop();
+  static Dart_Handle GetSource(const char* name);
   static Dart_Handle LoadScript(const char* name);
   static Dart_Handle LoadSources(Dart_Handle library, const char** names);
   static Dart_Handle LoadSource(Dart_Handle library, const char* name);
@@ -38,6 +39,9 @@
   static Dart_Handle LoadResource(Dart_Handle library, const char* name,
                                   const char* prefix);
 
+  static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag, Dart_Handle library,
+                                       Dart_Handle url);
+
   static void ThreadMain(uword parameters);
 
   static Dart_Isolate isolate_;
diff --git a/runtime/dart-runtime.gyp b/runtime/dart-runtime.gyp
index 17f9bb3..7c4f4c4 100644
--- a/runtime/dart-runtime.gyp
+++ b/runtime/dart-runtime.gyp
@@ -79,8 +79,7 @@
           'inputs': [
             '../tools/make_version.py',
             '../tools/utils.py',
-            '../tools/version.dart',
-            '../tools/release/version.dart',
+            '../tools/print_version.py',
             '../tools/VERSION',
             '<(version_in_cc_file)',
             # Depend on libdart_dependency_helper to track the libraries it
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index b47b40c..255c704 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -1976,6 +1976,12 @@
                                                       intptr_t* value);
 
 /**
+ * Gets the native field of the receiver.
+ */
+DART_EXPORT Dart_Handle Dart_GetNativeReceiver(Dart_NativeArguments args,
+                                               intptr_t* value);
+
+/**
  * Sets the return value for a native function.
  */
 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args,
diff --git a/runtime/include/dart_mirrors_api.h b/runtime/include/dart_mirrors_api.h
index 60e499a..7805449 100644
--- a/runtime/include/dart_mirrors_api.h
+++ b/runtime/include/dart_mirrors_api.h
@@ -9,11 +9,6 @@
 
 #include "include/dart_api.h"
 
-/*
- * =================================
- * Classes and Interfaces Reflection
- * =================================
- */
 
 /**
  * Returns the class name for the provided class or interface.
@@ -21,71 +16,6 @@
 DART_EXPORT Dart_Handle Dart_ClassName(Dart_Handle clazz);
 
 /**
- * Returns the library for the provided class or interface.
- */
-DART_EXPORT Dart_Handle Dart_ClassGetLibrary(Dart_Handle clazz);
-
-/**
- * Returns the number of interfaces directly implemented by some class
- * or interface.
- *
- * TODO(turnidge): Finish documentation.
- */
-DART_EXPORT Dart_Handle Dart_ClassGetInterfaceCount(Dart_Handle clazz,
-                                                    intptr_t* count);
-
-/**
- * Returns the interface at some index in the list of interfaces some
- * class or inteface.
- *
- * TODO(turnidge): Finish documentation.
- */
-DART_EXPORT Dart_Handle Dart_ClassGetInterfaceAt(Dart_Handle clazz,
-                                                 intptr_t index);
-
-/**
- * Is this class defined by a typedef?
- *
- * Typedef definitions from the main program are represented as a
- * special kind of class handle.  See Dart_ClassGetTypedefReferent.
- *
- * TODO(turnidge): Finish documentation.
- */
-DART_EXPORT bool Dart_ClassIsTypedef(Dart_Handle clazz);
-
-/**
- * Returns a handle to the type to which a typedef refers.
- *
- * It is an error to call this function on a handle for which
- * Dart_ClassIsTypedef is not true.
- *
- * TODO(turnidge): Finish documentation.
- */
-DART_EXPORT Dart_Handle Dart_ClassGetTypedefReferent(Dart_Handle clazz);
-
-/**
- * Does this class represent the type of a function?
- */
-DART_EXPORT bool Dart_ClassIsFunctionType(Dart_Handle clazz);
-
-/**
- * Returns a function handle representing the signature associated
- * with a function type.
- *
- * The return value is a function handle (See Dart_IsFunction, etc.).
- *
- * TODO(turnidge): Finish documentation.
- */
-DART_EXPORT Dart_Handle Dart_ClassGetFunctionTypeSignature(Dart_Handle clazz);
-
-
-/*
- * =================================
- * Function and Variables Reflection
- * =================================
- */
-
-/**
  * Returns a list of the names of all functions or methods declared in
  * a library or class.
  *
@@ -133,17 +63,6 @@
 DART_EXPORT Dart_Handle Dart_FunctionOwner(Dart_Handle function);
 
 /**
- * Determines whether a function handle refers to an abstract method.
- *
- * \param function A handle to a function or method declaration.
- * \param is_static Returns whether the handle refers to an abstract method.
- *
- * \return A valid handle if no error occurs during the operation.
- */
-DART_EXPORT Dart_Handle Dart_FunctionIsAbstract(Dart_Handle function,
-                                                bool* is_abstract);
-
-/**
  * Determines whether a function handle referes to a static function
  * of method.
  *
@@ -193,157 +112,6 @@
                                               bool* is_setter);
 
 /**
- * Returns the return type of a function.
- *
- * \return A valid handle to a type or an error handle if the argument
- *   is not valid.
- */
-DART_EXPORT Dart_Handle Dart_FunctionReturnType(Dart_Handle function);
-
-/**
- * Determines the number of required and optional parameters.
- *
- * \param function A handle to a function or method declaration.
- * \param fixed_param_count Returns the number of required parameters.
- * \param opt_param_count Returns the number of optional parameters.
- *
- * \return A valid handle if no error occurs during the operation.
- */
-DART_EXPORT Dart_Handle Dart_FunctionParameterCounts(
-  Dart_Handle function,
-  int64_t* fixed_param_count,
-  int64_t* opt_param_count);
-
-/**
- * Returns a handle to the type of a function parameter.
- *
- * \return A valid handle to a type or an error handle if the argument
- *   is not valid.
- */
-DART_EXPORT Dart_Handle Dart_FunctionParameterType(Dart_Handle function,
-                                                   int parameter_index);
-
-/**
- * Returns a list of the names of all variables declared in a library
- * or class.
- *
- * \param target A library or class.
- *
- * \return If no error occurs, a list of strings is returned.
- *   Otherwise an error handle is returned.
- */
-DART_EXPORT Dart_Handle Dart_GetVariableNames(Dart_Handle target);
-
-/**
- * Looks up a variable declaration by name from a library or class.
- *
- * \param target The library or class containing the variable.
- * \param variable_name The name of the variable.
- *
- * \return If an error is encountered, returns an error handle.
- *   Otherwise returns a variable handle if the variable is found or
- *   Dart_Null() if the variable is not found.
- */
-DART_EXPORT Dart_Handle Dart_LookupVariable(Dart_Handle target,
-                                            Dart_Handle variable_name);
-
-/**
- * Returns the name for the provided variable.
- */
-DART_EXPORT Dart_Handle Dart_VariableName(Dart_Handle variable);
-
-/**
- * Determines whether a variable is declared static.
- *
- * For the purposes of the embedding API, a top-level variable is
- * implicitly declared static.
- *
- * \param variable A handle to a variable declaration.
- * \param is_static Returns whether the variable is declared static.
- *
- * \return A valid handle if no error occurs during the operation.
- */
-DART_EXPORT Dart_Handle Dart_VariableIsStatic(Dart_Handle variable,
-                                              bool* is_static);
-
-/**
- * Determines whether a variable is declared final.
- *
- * \param variable A handle to a variable declaration.
- * \param is_final Returns whether the variable is declared final.
- *
- * \return A valid handle if no error occurs during the operation.
- */
-DART_EXPORT Dart_Handle Dart_VariableIsFinal(Dart_Handle variable,
-                                             bool* is_final);
-
-/**
- * Returns the type of a variable.
- *
- * \return A valid handle to a type of or an error handle if the
- *   argument is not valid.
- */
-DART_EXPORT Dart_Handle Dart_VariableType(Dart_Handle function);
-
-/**
- * Returns a list of the names of all type variables declared in a class.
- *
- * The type variables list preserves the original declaration order.
- *
- * \param clazz A class.
- *
- * \return If no error occurs, a list of strings is returned.
- *   Otherwise an error handle is returned.
- */
-DART_EXPORT Dart_Handle Dart_GetTypeVariableNames(Dart_Handle clazz);
-
-/**
- * Looks up a type variable declaration by name from a class.
- *
- * \param clazz The class containing the type variable.
- * \param variable_name The name of the type variable.
- *
- * \return If an error is encountered, returns an error handle.
- *   Otherwise returns a type variable handle if the type variable is
- *   found or Dart_Null() if the type variable is not found.
- */
-DART_EXPORT Dart_Handle Dart_LookupTypeVariable(Dart_Handle clazz,
-                                                Dart_Handle type_variable_name);
-
-/**
- * Returns the name for the provided type variable.
- */
-DART_EXPORT Dart_Handle Dart_TypeVariableName(Dart_Handle type_variable);
-
-/**
- * Returns the owner of a function.
- *
- * The owner of a type variable is its defining class.
- *
- * \return A valid handle to the owner of the type variable, or an error
- *   handle if the argument is not a valid handle to a type variable.
- */
-DART_EXPORT Dart_Handle Dart_TypeVariableOwner(Dart_Handle type_variable);
-
-/**
- * Returns the upper bound of a type variable.
- *
- * The upper bound of a type variable is ...
- *
- * \return A valid handle to a type, or an error handle if the
- *   argument is not a valid handle.
- */
-DART_EXPORT Dart_Handle Dart_TypeVariableUpperBound(Dart_Handle type_variable);
-/* TODO(turnidge): Finish documentation. */
-
-
-/*
- * ====================
- * Libraries Reflection
- * ====================
- */
-
-/**
  * Returns the name of a library as declared in the #library directive.
  */
 DART_EXPORT Dart_Handle Dart_LibraryName(Dart_Handle library);
@@ -357,13 +125,6 @@
  */
 DART_EXPORT Dart_Handle Dart_LibraryGetClassNames(Dart_Handle library);
 
-
-/*
- * ===================
- * Closures Reflection
- * ===================
- */
-
 /**
  * Retrieves the function of a closure.
  *
@@ -372,22 +133,5 @@
  */
 DART_EXPORT Dart_Handle Dart_ClosureFunction(Dart_Handle closure);
 
-/*
- * ===================
- * Metadata Reflection
- * ===================
- */
-
-/**
- * Get metadata associated with an object.
- *
- * \param obj Object for which the metadata is retrieved.
- *
- * \return If no error occurs, returns an array of metadata values.
- *   Returns an empty array if there is no metadata for the object.
- *   Returns an error if the evaluation of the metadata expressions fails.
- *
- */
-DART_EXPORT Dart_Handle Dart_GetMetadata(Dart_Handle obj);
 
 #endif  /* INCLUDE_DART_MIRRORS_API_H_ */  /* NOLINT */
diff --git a/runtime/lib/collection_patch.dart b/runtime/lib/collection_patch.dart
index 415982c..66efd3a 100644
--- a/runtime/lib/collection_patch.dart
+++ b/runtime/lib/collection_patch.dart
@@ -94,7 +94,7 @@
     for (int offset = 0; offset < table.length; offset += entrySize) {
       Object entry = table[offset];
       if (!_hashTable._isFree(entry)) {
-        K key = entry;
+        K key = identical(entry, _NULL) ? null : entry;
         V value = _hashTable._value(offset);
         action(key, value);
         _hashTable._checkModification(modificationCount);
diff --git a/runtime/lib/corelib_sources.gypi b/runtime/lib/corelib_sources.gypi
index d3efd48..ec3c6c1 100644
--- a/runtime/lib/corelib_sources.gypi
+++ b/runtime/lib/corelib_sources.gypi
@@ -17,10 +17,8 @@
     'double.cc',
     'double.dart',
     'double_patch.dart',
-    'error.cc',
-    'error.dart',
+    'errors.cc',
     'errors_patch.dart',
-    'error.h',
     'expando_patch.dart',
     'function.cc',
     'function_patch.dart',
@@ -51,6 +49,8 @@
     'string_patch.dart',
     'string_buffer_patch.dart',
     'type_patch.dart',
+    'uri.cc',
+    'uri_patch.dart',
     'weak_property.dart',
     'weak_property.cc',
   ],
diff --git a/runtime/lib/error.dart b/runtime/lib/error.dart
deleted file mode 100644
index dc50c4c..0000000
--- a/runtime/lib/error.dart
+++ /dev/null
@@ -1,119 +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.
-// Errors are created and thrown by DartVM only.
-// Changes here should also be reflected in corelib/error.dart as well
-
-class _AssertionErrorImplementation extends AssertionError {
-  _AssertionErrorImplementation(
-    this.failedAssertion, this.url, this.line, this.column);
-
-  static _throwNew(int assertionStart, int assertionEnd)
-      native "AssertionError_throwNew";
-
-  String toString() {
-    return "'$url': Failed assertion: line $line pos $column: "
-        "'$failedAssertion' is not true.";
-  }
-  final String failedAssertion;
-  final String url;
-  final int line;
-  final int column;
-}
-
-class _TypeErrorImplementation
-    extends _AssertionErrorImplementation
-    implements TypeError {
-
-  _TypeErrorImplementation(
-    String failedAssertion, String url, int line, int column,
-    this.srcType, this.dstType, this.dstName, this._malformedError)
-      : super(failedAssertion, url, line, column);
-
-  static _throwNew(int location,
-                   Object src_value,
-                   String dst_type_name,
-                   String dst_name,
-                   String malformed_error)
-      native "TypeError_throwNew";
-
-  String toString() {
-    String str = (_malformedError != null) ? _malformedError : "";
-    if ((dstName != null) && (dstName.length > 0)) {
-      str = "${str}type '$srcType' is not a subtype of "
-            "type '$dstType' of '$dstName'.";
-    } else {
-      str = "${str}malformed type used.";
-    }
-    return str;
-  }
-
-  final String srcType;
-  final String dstType;
-  final String dstName;
-  final String _malformedError;
-}
-
-class _CastErrorImplementation
-    extends _TypeErrorImplementation
-    implements CastError {
-
-  _CastErrorImplementation(
-    String failedAssertion, String url, int line, int column,
-    String srcType, String dstType, String dstName, String malformedError)
-      : super(failedAssertion, url, line, column,
-              srcType, dstType, dstName, malformedError);
-
-  // A CastError is allocated by TypeError._throwNew() when dst_name equals
-  // Exceptions::kCastErrorDstName.
-  String toString() {
-    String str = (_malformedError != null) ? _malformedError : "";
-    if ((dstName != null) && (dstName.length > 0)) {
-      str = "${str}type '$srcType' is not a subtype of "
-            "type '$dstType' in type cast.";
-    } else {
-      str = "${str}malformed type used in type cast.";
-    }
-    return str;
-  }
-}
-
-class _FallThroughErrorImplementation extends FallThroughError {
-
-  _FallThroughErrorImplementation(this._url, this._line);
-
-  static _throwNew(int case_clause_pos) native "FallThroughError_throwNew";
-
-  String toString() {
-    return "'$_url': Switch case fall-through at line $_line.";
-  }
-
-  final String _url;
-  final int _line;
-}
-
-class _InternalError {
-  const _InternalError(this._msg);
-  String toString() => "InternalError: '${_msg}'";
-  final String _msg;
-}
-
-
-class _AbstractClassInstantiationErrorImplementation
-    extends AbstractClassInstantiationError {
-
-  _AbstractClassInstantiationErrorImplementation(
-      String className, this._url, this._line)
-      : super(className);
-
-  static _throwNew(int case_clause_pos, String className)
-      native "AbstractClassInstantiationError_throwNew";
-
-  String toString() {
-    return "Cannot instantiate abstract class $_className: "
-           "_url '$_url' line $_line";
-  }
-
-  final String _url;
-  final int _line;
-}
diff --git a/runtime/lib/error.h b/runtime/lib/error.h
deleted file mode 100644
index 598f78b..0000000
--- a/runtime/lib/error.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef LIB_ERROR_H_
-#define LIB_ERROR_H_
-
-#include "vm/runtime_entry.h"
-
-namespace dart {
-
-DECLARE_RUNTIME_ENTRY(ConditionTypeError);
-DECLARE_RUNTIME_ENTRY(MalformedTypeError);
-DECLARE_RUNTIME_ENTRY(TypeCheck);
-
-}  // namespace dart
-
-#endif  // LIB_ERROR_H_
-
diff --git a/runtime/lib/error.cc b/runtime/lib/errors.cc
similarity index 98%
rename from runtime/lib/error.cc
rename to runtime/lib/errors.cc
index 95bead2..4912747 100644
--- a/runtime/lib/error.cc
+++ b/runtime/lib/errors.cc
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "lib/error.h"
-
 #include "vm/bootstrap_natives.h"
 #include "vm/exceptions.h"
 #include "vm/object_store.h"
@@ -51,7 +49,7 @@
 }
 
 
-// Allocate and throw a new TypeError.
+// Allocate and throw a new TypeError or CastError.
 // Arg0: index of the token of the failed type check.
 // Arg1: src value.
 // Arg2: dst type name.
diff --git a/runtime/lib/errors_patch.dart b/runtime/lib/errors_patch.dart
index c68ea47..f841240 100644
--- a/runtime/lib/errors_patch.dart
+++ b/runtime/lib/errors_patch.dart
@@ -12,6 +12,118 @@
   StackTrace _stackTrace;
 }
 
+patch class AssertionError extends Error {
+  AssertionError._create(
+      this._failedAssertion, this._url, this._line, this._column);
+
+  static _throwNew(int assertionStart, int assertionEnd)
+      native "AssertionError_throwNew";
+
+  String toString() {
+    return "'$_url': Failed assertion: line $_line pos $_column: "
+        "'$_failedAssertion' is not true.";
+  }
+  final String _failedAssertion;
+  final String _url;
+  final int _line;
+  final int _column;
+}
+
+patch class TypeError extends AssertionError {
+  TypeError._create(String url, int line, int column,
+                    this._srcType, this._dstType, this._dstName,
+                    this._malformedError)
+      : super._create("is assignable", url, line, column);
+
+  static _throwNew(int location,
+                   Object src_value,
+                   String dst_type_name,
+                   String dst_name,
+                   String malformed_error)
+      native "TypeError_throwNew";
+
+  String toString() {
+    String str = (_malformedError != null) ? _malformedError : "";
+    if ((_dstName != null) && (_dstName.length > 0)) {
+      str = "${str}type '$_srcType' is not a subtype of "
+            "type '$_dstType' of '$_dstName'.";
+    } else {
+      str = "${str}malformed type used.";
+    }
+    return str;
+  }
+
+  final String _srcType;
+  final String _dstType;
+  final String _dstName;
+  final String _malformedError;
+}
+
+patch class CastError extends Error {
+  CastError._create(this._url, this._line, this._column,
+                    this._srcType, this._dstType, this._dstName,
+                    this._malformedError);
+
+  // A CastError is allocated by TypeError._throwNew() when dst_name equals
+  // Exceptions::kCastErrorDstName.
+
+  String toString() {
+    String str = (_malformedError != null) ? _malformedError : "";
+    str = "${str}type '$_srcType' is not a subtype of "
+          "type '$_dstType' in type cast.";
+    return str;
+  }
+
+  // Fields _url, _line, and _column are only used for debugging purposes.
+  final String _url;
+  final int _line;
+  final int _column;
+  final String _srcType;
+  final String _dstType;
+  final String _dstName;
+  final String _malformedError;
+}
+
+patch class FallThroughError {
+  FallThroughError._create(this._url, this._line);
+
+  static _throwNew(int case_clause_pos) native "FallThroughError_throwNew";
+
+  /* patch */ String toString() {
+    return "'$_url': Switch case fall-through at line $_line.";
+  }
+
+  // These new fields cannot be declared final, because a constructor exists
+  // in the original version of this patched class.
+  String _url;
+  int _line;
+}
+
+class _InternalError {
+  const _InternalError(this._msg);
+  String toString() => "InternalError: '${_msg}'";
+  final String _msg;
+}
+
+
+patch class AbstractClassInstantiationError {
+  AbstractClassInstantiationError._create(
+      this._className, this._url, this._line);
+
+  static _throwNew(int case_clause_pos, String className)
+      native "AbstractClassInstantiationError_throwNew";
+
+  /* patch */ String toString() {
+    return "Cannot instantiate abstract class $_className: "
+           "_url '$_url' line $_line";
+  }
+
+  // These new fields cannot be declared final, because a constructor exists
+  // in the original version of this patched class.
+  String _url;
+  int _line;
+}
+
 patch class NoSuchMethodError {
   // The compiler emits a call to _throwNew when it cannot resolve a static
   // method at compile time. The receiver is actually the literal class of the
diff --git a/runtime/lib/math.cc b/runtime/lib/math.cc
index 1116dd36..317045d 100644
--- a/runtime/lib/math.cc
+++ b/runtime/lib/math.cc
@@ -66,4 +66,63 @@
   return Double::New(log(operand.value()));
 }
 
+
+// Returns the typed-data array store in '_Random._state' field.
+static RawTypedData* GetRandomStateArray(const Instance& receiver) {
+  const Class& random_class = Class::Handle(receiver.clazz());
+  const Field& state_field =
+      Field::Handle(random_class.LookupField(Symbols::_state()));
+  ASSERT(!state_field.IsNull());
+  const Instance& state_field_value =
+      Instance::Cast(Object::Handle(receiver.GetField(state_field)));
+  ASSERT(!state_field_value.IsNull());
+  ASSERT(state_field_value.IsTypedData());
+  const TypedData& array = TypedData::Cast(state_field_value);
+  ASSERT(array.Length() == 2);
+  ASSERT(array.ElementType() == kUint32ArrayElement);
+  return array.raw();
+}
+
+
+// Implements:
+//   var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
+//   _state[kSTATE_LO] = state & _MASK_32;
+//   _state[kSTATE_HI] = state >> 32;
+DEFINE_NATIVE_ENTRY(Random_nextState, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(Instance, receiver, arguments->NativeArgAt(0));
+  const TypedData& array = TypedData::Handle(GetRandomStateArray(receiver));
+  const uint64_t state_lo = array.GetUint32(0);
+  const uint64_t state_hi = array.GetUint32(array.ElementSizeInBytes());
+  const uint64_t A = 0xffffda61;
+  uint64_t state = (A * state_lo) + state_hi;
+  array.SetUint32(0, static_cast<uint32_t>(state));
+  array.SetUint32(array.ElementSizeInBytes(),
+      static_cast<uint32_t>(state >> 32));
+  return Object::null();
+}
+
+
+// Implements:
+//   do {
+//     seed = (seed + 0x5A17) & _Random._MASK_64;
+//   } while (seed == 0);
+//   _state[kSTATE_LO] = seed & _MASK_32;
+//   _state[kSTATE_HI] = seed >> 32;
+DEFINE_NATIVE_ENTRY(Random_setupSeed, 2) {
+  GET_NON_NULL_NATIVE_ARGUMENT(Instance, receiver, arguments->NativeArgAt(0));
+  GET_NON_NULL_NATIVE_ARGUMENT(Integer, seed_int, arguments->NativeArgAt(1));
+  const TypedData& array = TypedData::Handle(GetRandomStateArray(receiver));
+  ASSERT(!seed_int.IsNull());
+  ASSERT(!array.IsNull());
+  // TODO(srdjan): Reduce Bigint to 64 bit value.
+  int64_t seed = seed_int.IsBigint() ? 0 : seed_int.AsInt64Value();
+  do {
+    seed = seed + 0x5A17;
+  } while (seed == 0);
+  array.SetUint32(0, static_cast<uint32_t>(seed));
+  array.SetUint32(array.ElementSizeInBytes(),
+      static_cast<uint32_t>(seed >> 32));
+  return Object::null();
+}
+
 }  // namespace dart
diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
index d5110da..1bf701d 100644
--- a/runtime/lib/math_patch.dart
+++ b/runtime/lib/math_patch.dart
@@ -46,14 +46,12 @@
     if (seed == null) {
       seed = _Random._nextSeed();
     }
-    do {
-      seed = (seed + 0x5A17) & _Random._MASK_64;
-    } while (seed == 0);
     // Crank a couple of times to distribute the seed bits a bit further.
-    return new _Random._internal(seed).._nextState()
-                                      .._nextState()
-                                      .._nextState()
-                                      .._nextState();
+    return new _Random().._setupSeed(seed)
+                        .._nextState()
+                        .._nextState()
+                        .._nextState()
+                        .._nextState();
   }
 }
 
@@ -64,19 +62,27 @@
   static const kSTATE_LO = 0;
   static const kSTATE_HI = 1;
 
-  _Random._internal(state) {
-    _state[kSTATE_LO] = state & _MASK_32;
-    _state[kSTATE_HI] = state >> 32;
-  }
+  // Implements:
+  //   do {
+  //     seed = (seed + 0x5A17) & _Random._MASK_64;
+  //   } while (seed == 0);
+  //   _state[kSTATE_LO] = seed & _MASK_32;
+  //   _state[kSTATE_HI] = seed >> 32;
+  // This is a native to prevent 64-bit operations in Dart, which
+  // fail with --throw_on_javascript_int_overflow.
+  void _setupSeed(int seed) native "Random_setupSeed";
 
   // The algorithm used here is Multiply with Carry (MWC) with a Base b = 2^32.
   // http://en.wikipedia.org/wiki/Multiply-with-carry
   // The constant A is selected from "Numerical Recipes 3rd Edition" p.348 B1.
-  void _nextState() {
-    var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
-    _state[kSTATE_LO] = state & _MASK_32;
-    _state[kSTATE_HI] = state >> 32;
-  }
+
+  // Implements:
+  //   var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
+  //   _state[kSTATE_LO] = state & _MASK_32;
+  //   _state[kSTATE_HI] = state >> 32;
+  // This is a native to prevent 64-bit operations in Dart, which
+  // fail with --throw_on_javascript_int_overflow.
+  void _nextState() native "Random_nextState";
 
   int nextInt(int max) {
     // TODO(srdjan): Remove the 'limit' check once optimizing  comparison of
@@ -103,7 +109,7 @@
   }
 
   double nextDouble() {
-    return ((nextInt(1 << 26) << 27) + nextInt(1 << 27)) / _POW2_53_D;
+    return ((nextInt(1 << 26) * _POW2_27_D) + nextInt(1 << 27)) / _POW2_53_D;
   }
 
   bool nextBool() {
@@ -115,6 +121,7 @@
   static const _MASK_64 = (1 << 64) - 1;
   static const _POW2_32 = 1 << 32;
   static const _POW2_53_D = 1.0 * (1 << 53);
+  static const _POW2_27_D = 1.0 * (1 << 27);
 
   static const _A = 0xffffda61;
 
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 874915f..d0e4524 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -4,6 +4,7 @@
 
 #include "lib/invocation_mirror.h"
 #include "vm/bootstrap_natives.h"
+#include "vm/class_finalizer.h"
 #include "vm/dart_entry.h"
 #include "vm/exceptions.h"
 #include "vm/object_store.h"
@@ -108,9 +109,11 @@
 }
 
 
-static RawInstance* CreateFunctionTypeMirror(const Class& cls) {
-  const Array& args = Array::Handle(Array::New(1));
+static RawInstance* CreateFunctionTypeMirror(const Class& cls,
+                                             const AbstractType& type) {
+  const Array& args = Array::Handle(Array::New(2));
   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls)));
+  args.SetAt(1, type);
   return CreateMirror(Symbols::_LocalFunctionTypeMirrorImpl(), args);
 }
 
@@ -153,26 +156,57 @@
   return CreateMirror(Symbols::_LocalVariableMirrorImpl(), args);
 }
 
+static RawFunction* CallMethod(const Class& cls) {
+  if (cls.IsSignatureClass()) {
+    return cls.signature_function();
+  }
+
+  Class& lookup_cls = Class::Handle(cls.raw());
+  Function& call_function = Function::Handle();
+  do {
+    call_function = lookup_cls.LookupDynamicFunction(Symbols::Call());
+    if (!call_function.IsNull()) {
+      return call_function.raw();
+    }
+    lookup_cls = lookup_cls.SuperClass();
+  } while (!lookup_cls.IsNull());
+  return Function::null();
+}
 
 static RawInstance* CreateClassMirror(const Class& cls,
+                                      const AbstractType& type,
                                       const Instance& owner_mirror) {
   if (cls.IsSignatureClass()) {
     if (cls.IsCanonicalSignatureClass()) {
       // We represent function types as canonical signature classes.
-      return CreateFunctionTypeMirror(cls);
+      return CreateFunctionTypeMirror(cls, type);
     } else {
       // We represent typedefs as non-canonical signature classes.
       return CreateTypedefMirror(cls, owner_mirror);
     }
   }
 
-  const Array& args = Array::Handle(Array::New(2));
+  const Bool& is_generic =
+      (cls.NumTypeParameters() == 0) ? Bool::False() : Bool::True();
+
+  const Array& args = Array::Handle(Array::New(4));
   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls)));
-  args.SetAt(1, String::Handle(cls.UserVisibleName()));
+  args.SetAt(1, type);
+  args.SetAt(2, String::Handle(cls.UserVisibleName()));
+  args.SetAt(3, is_generic);
   return CreateMirror(Symbols::_LocalClassMirrorImpl(), args);
 }
 
 
+// Note a "raw type" is not the same as a RawType.
+static RawAbstractType* RawTypeOfClass(const Class& cls) {
+  Type& type = Type::Handle(Type::New(cls,
+                                      Object::null_abstract_type_arguments(),
+                                      Scanner::kDummyTokenIndex));
+  return ClassFinalizer::FinalizeType(cls, type, ClassFinalizer::kCanonicalize);
+}
+
+
 static RawInstance* CreateLibraryMirror(const Library& lib) {
   const Array& args = Array::Handle(Array::New(3));
   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(lib)));
@@ -201,7 +235,7 @@
       // TODO(mlippautz): Create once in the VM isolate and retrieve from there.
       return CreateMirror(Symbols::_SpecialTypeMirrorImpl(), args);
     }
-    return CreateClassMirror(cls, Object::null_instance());
+    return CreateClassMirror(cls, type, Object::null_instance());
   } else if (type.IsTypeParameter()) {
     return CreateTypeVariableMirror(TypeParameter::Cast(type),
                                     Object::null_instance());
@@ -259,7 +293,16 @@
 DEFINE_NATIVE_ENTRY(Mirrors_makeLocalClassMirror, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(0));
   const Class& cls = Class::Handle(type.type_class());
-  return CreateClassMirror(cls, Object::null_instance());
+  ASSERT(!cls.IsNull());
+  return CreateClassMirror(cls,
+                           AbstractType::Handle(),
+                           Instance::null_instance());
+}
+
+
+DEFINE_NATIVE_ENTRY(Mirrors_makeLocalTypeMirror, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
+  return CreateTypeMirror(type);
 }
 
 
@@ -323,10 +366,23 @@
 }
 
 
+DEFINE_NATIVE_ENTRY(FunctionTypeMirror_call_method, 2) {
+  GET_NON_NULL_NATIVE_ARGUMENT(Instance,
+                               owner_mirror,
+                               arguments->NativeArgAt(0));
+  GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
+  const Class& cls = Class::Handle(ref.GetClassReferent());
+  const Function& func = Function::Handle(CallMethod(cls));
+  ASSERT(!func.IsNull());
+  return CreateMethodMirror(func, owner_mirror);
+}
+
+
 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   const Class& cls = Class::Handle(ref.GetClassReferent());
-  const Function& func = Function::Handle(cls.signature_function());
+  const Function& func = Function::Handle(CallMethod(cls));
+  ASSERT(!func.IsNull());
   return CreateParameterMirrorList(func);
 }
 
@@ -334,9 +390,9 @@
 DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   const Class& cls = Class::Handle(ref.GetClassReferent());
-  const Function& func = Function::Handle(cls.signature_function());
-  const AbstractType& return_type = AbstractType::Handle(func.result_type());
-  return CreateTypeMirror(return_type);
+  const Function& func = Function::Handle(CallMethod(cls));
+  ASSERT(!func.IsNull());
+  return func.result_type();
 }
 
 
@@ -499,7 +555,9 @@
         // The various implementations of public classes don't always have the
         // expected superinterfaces or other properties, so we filter them out.
         if (!RawObject::IsImplementationClassId(klass.id())) {
-          member_mirror = CreateClassMirror(klass, owner_mirror);
+          member_mirror = CreateClassMirror(klass,
+                                            AbstractType::Handle(),
+                                            owner_mirror);
           member_mirrors.Add(member_mirror);
         }
       }
@@ -529,16 +587,42 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(LocalTypeVariableMirror_owner, 1) {
+DEFINE_NATIVE_ENTRY(ClassMirror_type_arguments, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
+
+  const AbstractTypeArguments& args =
+      AbstractTypeArguments::Handle(type.arguments());
+  if (args.IsNull()) {
+    return Object::empty_array().raw();
+  }
+
+  const Class& cls = Class::Handle(type.type_class());
+  const intptr_t num_params = cls.NumTypeParameters();
+  const intptr_t num_inherited_args = args.Length() - num_params;
+
+  const Array& result = Array::Handle(Array::New(num_params));
+  AbstractType& arg_type = AbstractType::Handle();
+  Instance& type_mirror = Instance::Handle();
+  for (intptr_t i = 0; i < num_params; i++) {
+    arg_type ^= args.TypeAt(i + num_inherited_args);
+    type_mirror = CreateTypeMirror(arg_type);
+    result.SetAt(i, type_mirror);
+  }
+  return result.raw();
+}
+
+
+DEFINE_NATIVE_ENTRY(TypeVariableMirror_owner, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0));
   return CreateClassMirror(Class::Handle(param.parameterized_class()),
+                           AbstractType::Handle(),
                            Instance::null_instance());
 }
 
 
-DEFINE_NATIVE_ENTRY(LocalTypeVariableMirror_upper_bound, 1) {
+DEFINE_NATIVE_ENTRY(TypeVariableMirror_upper_bound, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0));
-  return CreateTypeMirror(AbstractType::Handle(param.bound()));
+  return param.bound();
 }
 
 
@@ -723,10 +807,13 @@
 
 DEFINE_NATIVE_ENTRY(ClosureMirror_function, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(0));
-  ASSERT(closure.IsClosure());
+  ASSERT(!closure.IsNull());
 
-  const Function& func = Function::Handle(Closure::function(closure));
-  return CreateMethodMirror(func, Instance::null_instance());
+  Function& function = Function::Handle();
+  bool callable = closure.IsCallable(&function, NULL);
+  ASSERT(callable);
+
+  return CreateMethodMirror(function, Instance::null_instance());
 }
 
 
@@ -763,11 +850,7 @@
                               const Function& function,
                               const InvocationMirror::Call call,
                               const InvocationMirror::Type type) {
-  AbstractTypeArguments& type_arguments = AbstractTypeArguments::Handle();
-  Type& pre_type = Type::Handle(
-      Type::New(klass, type_arguments, Scanner::kDummyTokenIndex));
-  pre_type.SetIsFinalized();
-  AbstractType& runtime_type = AbstractType::Handle(pre_type.Canonicalize());
+  AbstractType& runtime_type = AbstractType::Handle(RawTypeOfClass(klass));
 
   ThrowNoSuchMethod(runtime_type,
                     function_name,
@@ -1151,7 +1234,9 @@
   if (owner.IsTopLevel()) {
     return CreateLibraryMirror(Library::Handle(owner.library()));
   }
-  return CreateClassMirror(owner, Object::null_instance());
+  return CreateClassMirror(owner,
+                           AbstractType::Handle(),
+                           Object::null_instance());
 }
 
 
@@ -1167,8 +1252,7 @@
   const Function& func = Function::Handle(ref.GetFunctionReferent());
   // We handle constructors in Dart code.
   ASSERT(!func.IsConstructor());
-  const AbstractType& return_type = AbstractType::Handle(func.result_type());
-  return CreateTypeMirror(return_type);
+  return func.result_type();
 }
 
 
@@ -1185,18 +1269,14 @@
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, pos, arguments->NativeArgAt(1));
   const Function& func = Function::Handle(ref.GetFunctionReferent());
-  const AbstractType& param_type = AbstractType::Handle(func.ParameterTypeAt(
-      func.NumImplicitParameters() + pos.Value()));
-  return CreateTypeMirror(param_type);
+  return func.ParameterTypeAt(func.NumImplicitParameters() + pos.Value());
 }
 
 
 DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   const Field& field = Field::Handle(ref.GetFieldReferent());
-
-  const AbstractType& type = AbstractType::Handle(field.type());
-  return CreateTypeMirror(type);
+  return field.type();
 }
 
 }  // namespace dart
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index 5fb76c7..7c7331f 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -251,7 +251,7 @@
     if (_type == null) {
       // Note it not safe to use reflectee.runtimeType because runtimeType may
       // be overridden.
-      _type = reflectClass(_computeType(reflectee));
+      _type = _Mirrors._reflectType(_computeType(reflectee));
     }
     return _type;
   }
@@ -360,10 +360,15 @@
 class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl
     implements ClassMirror {
   _LocalClassMirrorImpl(reflectee,
-                        String simpleName)
+                        this._reflectedType,
+                        String simpleName,
+                        this._isGeneric)
       : this._simpleName = _s(simpleName),
         super(reflectee);
 
+  final Type _reflectedType;
+  final bool _isGeneric;
+
   Symbol _simpleName;
   Symbol get simpleName {
     // dynamic, void and the function types have their names set eagerly in the
@@ -501,19 +506,30 @@
     return _typeVariables;
   }
 
+  Map<Symbol, TypeMirror> _typeArguments = null;
   Map<Symbol, TypeMirror> get typeArguments {
-    throw new UnimplementedError(
-        'ClassMirror.typeArguments is not implemented');
+    if(_typeArguments == null) {
+      if(_reflectedType == null) {
+        _typeArguments = new LinkedHashMap<Symbol, TypeMirror>();
+      } else {
+        _typeArguments =
+            new LinkedHashMap<Symbol, TypeMirror>.fromIterables(typeVariables.keys,
+                                                                _computeTypeArguments(_reflectedType));
+      }
+    }
+    return _typeArguments;
   }
 
   bool get isOriginalDeclaration {
-    throw new UnimplementedError(
-        'ClassMirror.isOriginalDeclaration is not implemented');
+    return !_isGeneric || _reflectedType == null;
   }
 
-  ClassMirror get genericDeclaration {
-    throw new UnimplementedError(
-        'ClassMirror.originalDeclaration is not implemented');
+  ClassMirror get originalDeclaration {
+    if (isOriginalDeclaration) {
+      return this;
+    } else {
+      return reflectClass(_reflectedType);
+    }
   }
 
   String toString() {
@@ -558,7 +574,9 @@
 
   bool operator ==(other) {
     return this.runtimeType == other.runtimeType &&
-           this._reflectee == other._reflectee;
+           this._reflectee == other._reflectee &&
+           (isOriginalDeclaration || 
+            this._reflectedType == other._reflectedType);
   }
 
   int get hashCode => simpleName.hashCode;
@@ -595,11 +613,15 @@
 
   static _ClassMirror_type_variables(reflectee)
       native "ClassMirror_type_variables";
+
+  static _computeTypeArguments(reflectee)
+      native "ClassMirror_type_arguments";
 }
 
 class _LocalFunctionTypeMirrorImpl extends _LocalClassMirrorImpl
     implements FunctionTypeMirror {
-  _LocalFunctionTypeMirrorImpl(reflectee) : super(reflectee, null);
+  _LocalFunctionTypeMirrorImpl(reflectee, reflectedType)
+      : super(reflectee, reflectedType, null, false);
 
   // FunctionTypeMirrors have a simpleName generated from their signature.
   Symbol _simpleName = null;
@@ -610,10 +632,19 @@
     return _simpleName;
   }
 
+  MethodMirror _callMethod;
+  MethodMirror get callMethod {
+    if (_callMethod == null) {
+      _callMethod = this._FunctionTypeMirror_call_method(_reflectee);
+    }
+    return _callMethod;
+  }
+
   TypeMirror _returnType = null;
   TypeMirror get returnType {
     if (_returnType == null) {
-      _returnType = _FunctionTypeMirror_return_type(_reflectee);
+      _returnType =
+          _Mirrors._reflectType(_FunctionTypeMirror_return_type(_reflectee));
     }
     return _returnType;
   }
@@ -632,7 +663,10 @@
 
   String toString() => "FunctionTypeMirror on '${_n(simpleName)}'";
 
-  static TypeMirror _FunctionTypeMirror_return_type(reflectee)
+  MethodMirror _FunctionTypeMirror_call_method(reflectee)
+      native "FunctionTypeMirror_call_method";
+
+  static Type _FunctionTypeMirror_return_type(reflectee)
       native "FunctionTypeMirror_return_type";
 
   static List<ParameterMirror> _FunctionTypeMirror_parameters(reflectee)
@@ -679,7 +713,7 @@
   DeclarationMirror _owner;
   DeclarationMirror get owner {
     if (_owner == null) {
-      _owner = _LocalTypeVariableMirror_owner(_reflectee);
+      _owner = _TypeVariableMirror_owner(_reflectee);
     }
     return _owner;
   }
@@ -696,7 +730,8 @@
   TypeMirror _upperBound = null;
   TypeMirror get upperBound {
     if (_upperBound == null) {
-      _upperBound = _LocalTypeVariableMirror_upper_bound(_reflectee);
+      _upperBound =
+          _Mirrors._reflectType(_TypeVariableMirror_upper_bound(_reflectee));
     }
     return _upperBound;
   }
@@ -706,13 +741,16 @@
         'TypeVariableMirror.metadata is not implemented');
   }
 
+  bool get isOriginalDeclaration => true;
+  ClassMirror get originalDeclaration => this;
+
   String toString() => "TypeVariableMirror on '${_n(simpleName)}'";
 
-  static DeclarationMirror _LocalTypeVariableMirror_owner(reflectee)
-      native "LocalTypeVariableMirror_owner";
+  static DeclarationMirror _TypeVariableMirror_owner(reflectee)
+      native "TypeVariableMirror_owner";
 
-  static TypeMirror _LocalTypeVariableMirror_upper_bound(reflectee)
-      native "LocalTypeVariableMirror_upper_bound";
+  static Type _TypeVariableMirror_upper_bound(reflectee)
+      native "TypeVariableMirror_upper_bound";
 }
 
 
@@ -723,6 +761,9 @@
                           this._owner)
       : super(reflectee, _s(simpleName));
 
+  // TODO(12282): Deal with generic typedefs.
+  bool get _isGeneric => false;
+
   DeclarationMirror _owner;
   DeclarationMirror get owner {
     if (_owner == null) {
@@ -743,8 +784,9 @@
   TypeMirror _referent = null;
   TypeMirror get referent {
     if (_referent == null) {
+      // TODO(12282): Deal with generic typedef.
       return new _LocalFunctionTypeMirrorImpl(
-          _TypedefMirror_referent(_reflectee));
+          _TypedefMirror_referent(_reflectee), null);
     }
     return _referent;
   }
@@ -912,7 +954,8 @@
       if (isConstructor) {
         _returnType = owner;
       } else {
-        _returnType = _MethodMirror_return_type(_reflectee);
+        _returnType =
+            _Mirrors._reflectType(_MethodMirror_return_type(_reflectee));
       }
     }
     return _returnType;
@@ -1006,7 +1049,7 @@
   TypeMirror _type;
   TypeMirror get type {
     if (_type == null) {
-       _type = _VariableMirror_type(_reflectee);
+       _type = _Mirrors._reflectType(_VariableMirror_type(_reflectee));
     }
     return _type;
   }
@@ -1050,12 +1093,13 @@
   TypeMirror _type = null;
   TypeMirror get type {
     if (_type == null) {
-      _type = _ParameterMirror_type(_reflectee, _position);
+      _type =
+          _Mirrors._reflectType(_ParameterMirror_type(_reflectee, _position));
     }
     return _type;
   }
 
-  static TypeMirror _ParameterMirror_type(_reflectee, _position)
+  static Type _ParameterMirror_type(_reflectee, _position)
       native "ParameterMirror_type";
 }
 
@@ -1135,17 +1179,35 @@
         : new _LocalInstanceMirrorImpl(reflectee);
   }
 
-  // Creates a new local ClassMirror.
   static ClassMirror makeLocalClassMirror(Type key)
       native "Mirrors_makeLocalClassMirror";
+  static TypeMirror makeLocalTypeMirror(Type key)
+      native "Mirrors_makeLocalTypeMirror";
 
-  static Expando<ClassMirror> _classMirrorCache = new Expando("ClassMirror");
+  static Expando<ClassMirror> _declarationCache = new Expando("ClassMirror");
+  static Expando<ClassMirror> _instanitationCache = new Expando("TypeMirror");
+
   static ClassMirror reflectClass(Type key) {
-    var classMirror = _classMirrorCache[key];
+    var classMirror = _declarationCache[key];
     if (classMirror == null) {
       classMirror = makeLocalClassMirror(key);
-      _classMirrorCache[key] = classMirror;
+      _declarationCache[key] = classMirror;
+      if (!classMirror._isGeneric) {
+        _instanitationCache[key] = classMirror;
+      }
     }
     return classMirror;
   }
+
+  static TypeMirror _reflectType(Type key) {
+    var typeMirror = _instanitationCache[key];
+    if (typeMirror == null) {
+      typeMirror = makeLocalTypeMirror(key);
+      _instanitationCache[key] = typeMirror;
+      if (typeMirror is ClassMirror && !typeMirror._isGeneric) {
+        _declarationCache[key] = typeMirror;
+      }
+    }
+    return typeMirror;
+  }
 }
diff --git a/runtime/lib/stacktrace.cc b/runtime/lib/stacktrace.cc
index 085d9dc..2a8f96e 100644
--- a/runtime/lib/stacktrace.cc
+++ b/runtime/lib/stacktrace.cc
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "lib/error.h"
-
 #include "vm/bootstrap_natives.h"
 #include "vm/exceptions.h"
 #include "vm/object_store.h"
@@ -51,7 +49,7 @@
   Code& code = Code::Handle();
   Smi& offset = Smi::Handle();
   bool catch_frame_skipped = false;  // Tracks if catch frame has been skipped.
-  while (!frame->IsEntryFrame()) {
+  while (frame != NULL) {
     if (frame->IsDartFrame()) {
       code = frame->LookupDartCode();
       if (code.is_optimized()) {
@@ -90,7 +88,6 @@
       }
     }
     frame = frames.NextFrame();
-    ASSERT(frame != NULL);
   }
   const Array& func_array = Array::Handle(Array::MakeArray(func_list));
   const Array& code_array = Array::Handle(Array::MakeArray(code_list));
diff --git a/runtime/lib/uri.cc b/runtime/lib/uri.cc
new file mode 100644
index 0000000..f75d2ec
--- /dev/null
+++ b/runtime/lib/uri.cc
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/bootstrap_natives.h"
+#include "vm/native_entry.h"
+#include "vm/object.h"
+
+namespace dart {
+
+DEFINE_NATIVE_ENTRY(Uri_isWindowsPlatform, 0) {
+#if defined(_WIN32)
+  return Bool::True().raw();
+#else
+  return Bool::False().raw();
+#endif
+}
+
+}  // namespace dart
diff --git a/runtime/lib/uri_patch.dart b/runtime/lib/uri_patch.dart
new file mode 100644
index 0000000..b07946d
--- /dev/null
+++ b/runtime/lib/uri_patch.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.
+
+// VM implementation of Uri.
+patch class Uri {
+  static final bool _isWindowsCached = _isWindowsPlatform;
+
+  static bool get _isWindowsPlatform native "Uri_isWindowsPlatform";
+
+  /* patch */ static bool get _isWindows => _isWindowsCached;
+}
diff --git a/runtime/platform/json.cc b/runtime/platform/json.cc
index 899b62c..0823d0a 100644
--- a/runtime/platform/json.cc
+++ b/runtime/platform/json.cc
@@ -234,7 +234,7 @@
         if ((*s == '\n') || (*s == '\t')) {
           OS::Print("Un-escaped character in JSON string: '%s'\n",
                     ValueChars());
-          ASSERT(!"illegal character in JSON string value");
+          FATAL("illegal character in JSON string value");
         }
         s++;
         remaining--;
@@ -251,7 +251,7 @@
     default:
       OS::Print("Malformed JSON: expected a value but got '%s'\n",
                 scanner_.TokenChars());
-      ASSERT(!"illegal JSON value found");
+      FATAL("illegal JSON value found");
   }
 }
 
diff --git a/runtime/platform/thread_android.cc b/runtime/platform/thread_android.cc
index e789c01..20e0e9e 100644
--- a/runtime/platform/thread_android.cc
+++ b/runtime/platform/thread_android.cc
@@ -16,15 +16,21 @@
 
 #define VALIDATE_PTHREAD_RESULT(result) \
   if (result != 0) { \
-    FATAL2("pthread error: %d (%s)", result, strerror(result)); \
+    const int kBufferSize = 1024; \
+    char error_message[kBufferSize]; \
+    strerror_r(result, error_message, kBufferSize); \
+    FATAL2("pthread error: %d (%s)", result, error_message); \
   }
 
 
 #ifdef DEBUG
 #define RETURN_ON_PTHREAD_FAILURE(result) \
   if (result != 0) { \
+    const int kBufferSize = 1024; \
+    char error_message[kBufferSize]; \
+    strerror_r(result, error_message, kBufferSize); \
     fprintf(stderr, "%s:%d: pthread error: %d (%s)\n", \
-            __FILE__, __LINE__, result, strerror(result)); \
+            __FILE__, __LINE__, result, error_message); \
     return result; \
   }
 #else
diff --git a/runtime/platform/thread_linux.cc b/runtime/platform/thread_linux.cc
index dd02a38..acb78c7 100644
--- a/runtime/platform/thread_linux.cc
+++ b/runtime/platform/thread_linux.cc
@@ -16,15 +16,21 @@
 
 #define VALIDATE_PTHREAD_RESULT(result) \
   if (result != 0) { \
-    FATAL2("pthread error: %d (%s)", result, strerror(result)); \
+    const int kBufferSize = 1024; \
+    char error_buf[kBufferSize]; \
+    FATAL2("pthread error: %d (%s)", result, \
+           strerror_r(result, error_buf, kBufferSize)); \
   }
 
 
 #ifdef DEBUG
 #define RETURN_ON_PTHREAD_FAILURE(result) \
   if (result != 0) { \
+    const int kBufferSize = 1024; \
+    char error_buf[kBufferSize]; \
     fprintf(stderr, "%s:%d: pthread error: %d (%s)\n", \
-            __FILE__, __LINE__, result, strerror(result)); \
+            __FILE__, __LINE__, result, \
+            strerror_r(result, error_buf, kBufferSize)); \
     return result; \
   }
 #else
diff --git a/runtime/platform/thread_macos.cc b/runtime/platform/thread_macos.cc
index 29059fe..e9c6dfc 100644
--- a/runtime/platform/thread_macos.cc
+++ b/runtime/platform/thread_macos.cc
@@ -15,15 +15,21 @@
 
 #define VALIDATE_PTHREAD_RESULT(result)         \
   if (result != 0) { \
-    FATAL2("pthread error: %d (%s)", result, strerror(result)); \
+    const int kBufferSize = 1024; \
+    char error_message[kBufferSize]; \
+    strerror_r(result, error_message, kBufferSize); \
+    FATAL2("pthread error: %d (%s)", result, error_message); \
   }
 
 
 #ifdef DEBUG
 #define RETURN_ON_PTHREAD_FAILURE(result) \
   if (result != 0) { \
+    const int kBufferSize = 1024; \
+    char error_message[kBufferSize]; \
+    strerror_r(result, error_message, kBufferSize); \
     fprintf(stderr, "%s:%d: pthread error: %d (%s)\n", \
-            __FILE__, __LINE__, result, strerror(result)); \
+            __FILE__, __LINE__, result, error_message); \
     return result; \
   }
 #else
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index 9f1b610..0af0f3e 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -1517,11 +1517,13 @@
   NativeBodyNode(intptr_t token_pos,
                  const Function& function,
                  const String& native_c_function_name,
-                 NativeFunction native_c_function)
+                 NativeFunction native_c_function,
+                 bool is_bootstrap_native)
       : AstNode(token_pos),
         function_(function),
         native_c_function_name_(native_c_function_name),
-        native_c_function_(native_c_function) {
+        native_c_function_(native_c_function),
+        is_bootstrap_native_(is_bootstrap_native) {
     ASSERT(function_.IsZoneHandle());
     ASSERT(native_c_function_ != NULL);
     ASSERT(native_c_function_name_.IsZoneHandle());
@@ -1533,6 +1535,7 @@
     return native_c_function_name_;
   }
   NativeFunction native_c_function() const { return native_c_function_; }
+  bool is_bootstrap_native() const { return is_bootstrap_native_; }
 
   virtual void VisitChildren(AstNodeVisitor* visitor) const { }
 
@@ -1542,6 +1545,7 @@
   const Function& function_;  // Native Dart function.
   const String& native_c_function_name_;
   NativeFunction native_c_function_;  // Actual non-Dart implementation.
+  const bool is_bootstrap_native_;  // Is a bootstrap native method.
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(NativeBodyNode);
 };
@@ -1556,13 +1560,15 @@
                   const Array& handler_types,
                   const LocalVariable* context_var,
                   const LocalVariable* exception_var,
-                  const LocalVariable* stacktrace_var)
+                  const LocalVariable* stacktrace_var,
+                  intptr_t catch_handler_index)
       : AstNode(token_pos),
         catch_block_(catch_block),
         handler_types_(handler_types),
         context_var_(*context_var),
         exception_var_(*exception_var),
-        stacktrace_var_(*stacktrace_var) {
+        stacktrace_var_(*stacktrace_var),
+        catch_handler_index_(catch_handler_index) {
     ASSERT(catch_block_ != NULL);
     ASSERT(handler_types.IsZoneHandle());
     ASSERT(context_var != NULL);
@@ -1574,6 +1580,7 @@
   const LocalVariable& context_var() const { return context_var_; }
   const LocalVariable& exception_var() const { return exception_var_; }
   const LocalVariable& stacktrace_var() const { return stacktrace_var_; }
+  intptr_t catch_handler_index() const { return catch_handler_index_; }
 
   virtual void VisitChildren(AstNodeVisitor* visitor) const {
     catch_block_->Visit(visitor);
@@ -1587,6 +1594,7 @@
   const LocalVariable& context_var_;
   const LocalVariable& exception_var_;
   const LocalVariable& stacktrace_var_;
+  const intptr_t catch_handler_index_;
 
   DISALLOW_COPY_AND_ASSIGN(CatchClauseNode);
 };
@@ -1599,13 +1607,15 @@
                SourceLabel* end_catch_label,
                const LocalVariable* context_var,
                CatchClauseNode* catch_block,
-               SequenceNode* finally_block)
+               SequenceNode* finally_block,
+               intptr_t try_index)
       : AstNode(token_pos),
         try_block_(try_block),
         end_catch_label_(end_catch_label),
         context_var_(*context_var),
         catch_block_(catch_block),
-        finally_block_(finally_block) {
+        finally_block_(finally_block),
+        try_index_(try_index) {
     ASSERT(try_block_ != NULL);
     ASSERT(context_var != NULL);
     ASSERT(catch_block_ != NULL || finally_block_ != NULL);
@@ -1617,6 +1627,7 @@
   CatchClauseNode* catch_block() const { return catch_block_; }
   SequenceNode* finally_block() const { return finally_block_; }
   const LocalVariable& context_var() const { return context_var_; }
+  intptr_t try_index() const { return try_index_; }
 
   virtual void VisitChildren(AstNodeVisitor* visitor) const {
     try_block_->Visit(visitor);
@@ -1636,6 +1647,7 @@
   const LocalVariable& context_var_;
   CatchClauseNode* catch_block_;
   SequenceNode* finally_block_;
+  const intptr_t try_index_;
 
   DISALLOW_COPY_AND_ASSIGN(TryCatchNode);
 };
@@ -1672,16 +1684,19 @@
  public:
   InlinedFinallyNode(intptr_t token_pos,
                      AstNode* finally_block,
-                     const LocalVariable* context_var)
+                     const LocalVariable* context_var,
+                     intptr_t try_index)
       : AstNode(token_pos),
         finally_block_(finally_block),
-        context_var_(*context_var) {
+        context_var_(*context_var),
+        try_index_(try_index) {
     ASSERT(finally_block_ != NULL);
     ASSERT(context_var != NULL);
   }
 
   AstNode* finally_block() const { return finally_block_; }
   const LocalVariable& context_var() const { return context_var_; }
+  intptr_t try_index() const { return try_index_; }
 
   virtual void VisitChildren(AstNodeVisitor* visitor) const {
     finally_block()->Visit(visitor);
@@ -1692,6 +1707,7 @@
  private:
   AstNode* finally_block_;
   const LocalVariable& context_var_;
+  const intptr_t try_index_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(InlinedFinallyNode);
 };
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 888efb4..2ca11fe 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -106,20 +106,21 @@
 // The specific api functions called here are a bit arbitrary.  We are
 // trying to get a sense of the overhead for using the dart api.
 static void UseDartApi(Dart_NativeArguments args) {
-  Dart_EnterScope();
   int count = Dart_GetNativeArgumentCount(args);
   EXPECT_EQ(3, count);
 
-  // Get the receiver.
-  Dart_Handle recv = Dart_GetNativeArgument(args, 0);
-  EXPECT_VALID(recv);
+  // Get native field from receiver.
+  intptr_t receiver_value;
+  Dart_Handle result = Dart_GetNativeReceiver(args, &receiver_value);
+  EXPECT_VALID(result);
+  EXPECT_EQ(7, receiver_value);
 
   // Get param1.
   Dart_Handle param1 = Dart_GetNativeArgument(args, 1);
   EXPECT_VALID(param1);
   EXPECT(Dart_IsInteger(param1));
   bool fits = false;
-  Dart_Handle result = Dart_IntegerFitsIntoInt64(param1, &fits);
+  result = Dart_IntegerFitsIntoInt64(param1, &fits);
   EXPECT_VALID(result);
   EXPECT(fits);
   int64_t value1;
@@ -128,15 +129,8 @@
   EXPECT_LE(0, value1);
   EXPECT_LE(value1, 1000000);
 
-  // Get native field from receiver.
-  intptr_t value2;
-  result = Dart_GetNativeInstanceField(recv, 0, &value2);
-  EXPECT_VALID(result);
-  EXPECT_EQ(7, value2);
-
   // Return param + receiver.field.
-  Dart_SetReturnValue(args, Dart_NewInteger(value1 * value2));
-  Dart_ExitScope();
+  Dart_SetReturnValue(args, Dart_NewInteger(value1 * receiver_value));
 }
 
 
@@ -310,7 +304,6 @@
 //
 static void StackFrame_accessFrame(Dart_NativeArguments args) {
   const int kNumIterations = 100;
-  Dart_EnterScope();
   Code& code = Code::Handle();
   Timer timer(true, "LookupDartCode benchmark");
   timer.Start();
@@ -331,7 +324,6 @@
   timer.Stop();
   int64_t elapsed_time = timer.TotalElapsedTime();
   Dart_SetReturnValue(args, Dart_NewInteger(elapsed_time));
-  Dart_ExitScope();
 }
 
 
diff --git a/runtime/vm/bootstrap.h b/runtime/vm/bootstrap.h
index 66d7608..8d77617 100644
--- a/runtime/vm/bootstrap.h
+++ b/runtime/vm/bootstrap.h
@@ -5,6 +5,7 @@
 #ifndef VM_BOOTSTRAP_H_
 #define VM_BOOTSTRAP_H_
 
+#include "include/dart_api.h"
 #include "vm/allocation.h"
 
 namespace dart {
@@ -16,6 +17,7 @@
  public:
   static RawError* LoadandCompileScripts();
   static void SetupNativeResolver();
+  static bool IsBootstapResolver(Dart_NativeEntryResolver resolver);
 
   // Source path mapping for library URI and 'parts'.
   static const char* async_source_paths_[];
diff --git a/runtime/vm/bootstrap_natives.cc b/runtime/vm/bootstrap_natives.cc
index 2bede6c..a072563 100644
--- a/runtime/vm/bootstrap_natives.cc
+++ b/runtime/vm/bootstrap_natives.cc
@@ -81,4 +81,10 @@
   library.set_native_entry_resolver(resolver);
 }
 
+
+bool Bootstrap::IsBootstapResolver(Dart_NativeEntryResolver resolver) {
+  return (resolver ==
+          reinterpret_cast<Dart_NativeEntryResolver>(BootstrapNatives::Lookup));
+}
+
 }  // namespace dart
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index d890bf4..0cf705f 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -107,6 +107,8 @@
   V(Math_atan2, 2)                                                             \
   V(Math_exp, 1)                                                               \
   V(Math_log, 1)                                                               \
+  V(Random_nextState, 1)                                                       \
+  V(Random_setupSeed, 2)                                                       \
   V(DateNatives_currentTimeMillis, 0)                                          \
   V(DateNatives_timeZoneName, 1)                                               \
   V(DateNatives_timeZoneOffsetInSeconds, 1)                                    \
@@ -241,6 +243,7 @@
   V(isolate_spawnUri, 1)                                                       \
   V(Mirrors_isLocalPort, 1)                                                    \
   V(Mirrors_makeLocalClassMirror, 1)                                           \
+  V(Mirrors_makeLocalTypeMirror, 1)                                            \
   V(Mirrors_makeLocalMirrorSystem, 0)                                          \
   V(MirrorReference_equals, 2)                                                 \
   V(InstanceMirror_invoke, 4)                                                  \
@@ -260,12 +263,14 @@
   V(ClassMirror_invokeSetter, 4)                                               \
   V(ClassMirror_invokeConstructor, 3)                                          \
   V(ClassMirror_type_variables, 1)                                             \
+  V(ClassMirror_type_arguments, 1)                                             \
   V(LibraryMirror_invoke, 4)                                                   \
   V(LibraryMirror_invokeGetter, 3)                                             \
   V(LibraryMirror_invokeSetter, 4)                                             \
-  V(LocalTypeVariableMirror_owner, 1)                                          \
-  V(LocalTypeVariableMirror_upper_bound, 1)                                    \
+  V(TypeVariableMirror_owner, 1)                                               \
+  V(TypeVariableMirror_upper_bound, 1)                                         \
   V(DeclarationMirror_metadata, 1)                                             \
+  V(FunctionTypeMirror_call_method, 2)                                         \
   V(FunctionTypeMirror_parameters, 1)                                          \
   V(FunctionTypeMirror_return_type, 1)                                         \
   V(MethodMirror_owner, 1)                                                     \
@@ -285,6 +290,7 @@
   V(WeakProperty_getKey, 1)                                                    \
   V(WeakProperty_getValue, 1)                                                  \
   V(WeakProperty_setValue, 2)                                                  \
+  V(Uri_isWindowsPlatform, 0)                                                  \
 
 class BootstrapNatives : public AllStatic {
  public:
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 91410fa..25fb423 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1376,9 +1376,9 @@
           Function::New(clone_name,
                         func.kind(),
                         func.is_static(),
-                        func.is_const(),
-                        func.is_abstract(),
-                        func.is_external(),
+                        false,  // Not const.
+                        false,  // Not abstract.
+                        false,  // Not external.
                         mixin_app,
                         mixin_app.token_pos()));
 
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index a3d8fb9..f1c41db 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -182,7 +182,6 @@
 
 
 static void NativeFunc(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle i = Dart_GetNativeArgument(args, 0);
   Dart_Handle k = Dart_GetNativeArgument(args, 1);
   int64_t value = -1;
@@ -191,7 +190,6 @@
   EXPECT_VALID(Dart_IntegerToInt64(k, &value));
   EXPECT_EQ(20, value);
   Isolate::Current()->heap()->CollectAllGarbage();
-  Dart_ExitScope();
 }
 
 
@@ -283,4 +281,3 @@
 }
 
 }  // namespace dart
-
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index c818976..7aaf5bc 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -653,36 +653,6 @@
 }
 
 
-// Test whether a formal parameter was defined by a passed-in argument.
-// Arg0: formal parameter index as Smi.
-// Arg1: formal parameter name as Symbol.
-// Arg2: arguments descriptor array.
-// Return value: true or false.
-DEFINE_RUNTIME_ENTRY(ArgumentDefinitionTest, 3) {
-  ASSERT(arguments.ArgCount() ==
-         kArgumentDefinitionTestRuntimeEntry.argument_count());
-  const Smi& param_index = Smi::CheckedHandle(arguments.ArgAt(0));
-  const String& param_name = String::CheckedHandle(arguments.ArgAt(1));
-  ASSERT(param_name.IsSymbol());
-  const Array& arg_desc_array = Array::CheckedHandle(arguments.ArgAt(2));
-  ArgumentsDescriptor arg_desc(arg_desc_array);
-  const intptr_t num_pos_args = arg_desc.PositionalCount();
-  // Check if the formal parameter is defined by a positional argument.
-  bool is_defined = num_pos_args > param_index.Value();
-  if (!is_defined) {
-    // Check if the formal parameter is defined by a named argument.
-    const intptr_t num_named_args = arg_desc.NamedCount();
-    for (intptr_t i = 0; i < num_named_args; i++) {
-      if (arg_desc.MatchesNameAt(i, param_name)) {
-        is_defined = true;
-        break;
-      }
-    }
-  }
-  arguments.SetReturn(is_defined ? Bool::True() : Bool::False());
-}
-
-
 // Report that the type of the given object is not bool in conditional context.
 // Arg0: bad object.
 // Return value: none, throws a TypeError.
diff --git a/runtime/vm/code_generator.h b/runtime/vm/code_generator.h
index 511676c..60a3cd7 100644
--- a/runtime/vm/code_generator.h
+++ b/runtime/vm/code_generator.h
@@ -22,7 +22,6 @@
 DECLARE_RUNTIME_ENTRY(AllocateContext);
 DECLARE_RUNTIME_ENTRY(AllocateObject);
 DECLARE_RUNTIME_ENTRY(AllocateObjectWithBoundsCheck);
-DECLARE_RUNTIME_ENTRY(ArgumentDefinitionTest);
 DECLARE_RUNTIME_ENTRY(BreakpointRuntimeHandler);
 DECLARE_RUNTIME_ENTRY(BreakpointStaticHandler);
 DECLARE_RUNTIME_ENTRY(BreakpointReturnHandler);
@@ -37,6 +36,9 @@
 DECLARE_RUNTIME_ENTRY(StaticCallMissHandlerTwoArgs);
 DECLARE_RUNTIME_ENTRY(InstanceFunctionLookup);
 DECLARE_RUNTIME_ENTRY(Instanceof);
+DECLARE_RUNTIME_ENTRY(TypeCheck);
+DECLARE_RUNTIME_ENTRY(MalformedTypeError);
+DECLARE_RUNTIME_ENTRY(ConditionTypeError);
 DECLARE_RUNTIME_ENTRY(InstantiateType);
 DECLARE_RUNTIME_ENTRY(InstantiateTypeArguments);
 DECLARE_RUNTIME_ENTRY(InvokeNoSuchMethodFunction);
@@ -54,7 +56,6 @@
 DECLARE_RUNTIME_ENTRY(UpdateICDataTwoArgs);
 DECLARE_RUNTIME_ENTRY(UpdateFieldCid);
 
-
 #define DEOPT_REASONS(V)                                                       \
   V(Unknown)                                                                   \
   V(InstanceGetter)                                                            \
diff --git a/runtime/vm/code_generator_test.cc b/runtime/vm/code_generator_test.cc
index 5470f0d..6dceb4c 100644
--- a/runtime/vm/code_generator_test.cc
+++ b/runtime/vm/code_generator_test.cc
@@ -218,11 +218,13 @@
       String::ZoneHandle(Symbols::New("TestSmiSub"));
   NativeFunction native_function =
       reinterpret_cast<NativeFunction>(TestSmiSub);
-  node_seq->Add(new ReturnNode(kPos,
-                               new NativeBodyNode(kPos,
-                                                  function,
-                                                  native_name,
-                                                  native_function)));
+  node_seq->Add(
+      new ReturnNode(kPos,
+                     new NativeBodyNode(kPos,
+                                        function,
+                                        native_name,
+                                        native_function,
+                                        false /* not bootstrap native */)));
 }
 
 
@@ -398,11 +400,13 @@
       String::ZoneHandle(Symbols::New("TestSmiSum"));
   NativeFunction native_function =
       reinterpret_cast<NativeFunction>(TestSmiSum);
-  node_seq->Add(new ReturnNode(kPos,
-                               new NativeBodyNode(kPos,
-                                                  function,
-                                                  native_name,
-                                                  native_function)));
+  node_seq->Add(
+      new ReturnNode(kPos,
+                     new NativeBodyNode(kPos,
+                                        function,
+                                        native_name,
+                                        native_function,
+                                        false /* Not bootstrap native */)));
 }
 
 
@@ -485,11 +489,13 @@
       String::ZoneHandle(Symbols::New("TestNonNullSmiSum"));
   NativeFunction native_function =
       reinterpret_cast<NativeFunction>(TestNonNullSmiSum);
-  node_seq->Add(new ReturnNode(kPos,
-                               new NativeBodyNode(kPos,
-                                                  function,
-                                                  native_name,
-                                                  native_function)));
+  node_seq->Add(
+      new ReturnNode(kPos,
+                     new NativeBodyNode(kPos,
+                                        function,
+                                        native_name,
+                                        native_function,
+                                        false /* Not bootstrap native */)));
 }
 
 
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 5f14950..8adb292 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -260,8 +260,8 @@
   // while loop, done is set to true. use_far_branches is always false on ia32
   // and x64.
   bool done = false;
-  // static to evade gcc's longjmp variable smashing checks.
-  static bool use_far_branches = false;
+  // volatile because the variable may be clobbered by a longjmp.
+  volatile bool use_far_branches = false;
   while (!done) {
     const intptr_t prev_deopt_id = isolate->deopt_id();
     isolate->set_deopt_id(0);
@@ -576,7 +576,6 @@
     isolate->set_long_jump_base(old_base);
     isolate->set_deopt_id(prev_deopt_id);
   }
-  use_far_branches = false;
   return is_compiled;
 }
 
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index cc20314..3299340 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -826,7 +826,7 @@
 
 DART_EXPORT Dart_Handle Dart_DebugName() {
   Isolate* isolate = Isolate::Current();
-  CHECK_ISOLATE(isolate);
+  DARTSCOPE(isolate);
   return Api::NewHandle(isolate, String::New(isolate->name()));
 }
 
@@ -3623,6 +3623,30 @@
   return Api::Success();
 }
 
+DART_EXPORT Dart_Handle Dart_GetNativeReceiver(Dart_NativeArguments args,
+                                               intptr_t* value) {
+  NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+  Isolate* isolate = arguments->isolate();
+  DARTSCOPE(isolate);
+  const Object& obj = Object::Handle(isolate, arguments->NativeArgAt(0));
+  intptr_t cid = obj.GetClassId();
+  if (cid <= kNumPredefinedCids) {
+    if (cid == kNullCid) {
+      return Api::NewError("%s expects receiver argument to be non-null.",
+                           CURRENT_FUNC);
+    }
+    return Api::NewError("%s expects receiver argument to be of"
+                         " type Instance.", CURRENT_FUNC);
+  }
+  const Instance& instance = Instance::Cast(obj);
+  ASSERT(instance.IsValidNativeIndex(0));
+  if (value == NULL) {
+    RETURN_NULL_ERROR(value);
+  }
+  *value = instance.GetNativeField(isolate, 0);
+  return Api::Success();
+}
+
 
 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args,
                                      Dart_Handle retval) {
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index f84b492..8be7d0a 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -2727,54 +2727,6 @@
 }
 
 
-TEST_CASE(ClassTypedefsEtc) {
-  const char* kScriptChars =
-      "class SomeClass {\n"
-      "}\n"
-      "typedef void SomeHandler(String a);\n";
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  EXPECT_VALID(lib);
-  Dart_Handle normal_cls = Dart_GetClass(lib, NewString("SomeClass"));
-  EXPECT_VALID(normal_cls);
-  Dart_Handle typedef_cls = Dart_GetClass(lib, NewString("SomeHandler"));
-  EXPECT_VALID(typedef_cls);
-
-  EXPECT(Dart_IsClass(normal_cls));
-  EXPECT(!Dart_ClassIsTypedef(normal_cls));
-  EXPECT(!Dart_ClassIsFunctionType(normal_cls));
-
-  EXPECT(Dart_IsClass(typedef_cls));
-  EXPECT(Dart_ClassIsTypedef(typedef_cls));
-  EXPECT(!Dart_ClassIsFunctionType(typedef_cls));
-
-  // Exercise the typedef class api.
-  Dart_Handle functype_cls = Dart_ClassGetTypedefReferent(typedef_cls);
-  EXPECT_VALID(functype_cls);
-
-  // Pass the wrong class kind to Dart_ClassGetTypedefReferent
-  EXPECT_ERROR(Dart_ClassGetTypedefReferent(normal_cls),
-               "class 'SomeClass' is not a typedef class.");
-
-  EXPECT(Dart_IsClass(functype_cls));
-  EXPECT(!Dart_ClassIsTypedef(functype_cls));
-  EXPECT(Dart_ClassIsFunctionType(functype_cls));
-
-  // Exercise the function type class.
-  Dart_Handle sig_func = Dart_ClassGetFunctionTypeSignature(functype_cls);
-  EXPECT_VALID(sig_func);
-  EXPECT(Dart_IsFunction(sig_func));
-  int64_t fixed_params = -1;
-  int64_t opt_params = -1;
-  EXPECT_VALID(
-      Dart_FunctionParameterCounts(sig_func, &fixed_params, &opt_params));
-  EXPECT_EQ(1, fixed_params);
-  EXPECT_EQ(0, opt_params);
-
-  // Pass the wrong class kind to Dart_ClassGetFunctionTypeSignature
-  EXPECT_ERROR(Dart_ClassGetFunctionTypeSignature(normal_cls),
-               "class 'SomeClass' is not a function-type class.");
-}
-
 #define CHECK_CLASS(handle, name)                                              \
   {                                                                            \
     Dart_Handle tmp = (handle);                                                \
@@ -2788,73 +2740,6 @@
   }
 
 
-TEST_CASE(ClassGetInterfaces) {
-  const char* kScriptChars =
-      "class MyClass0 {\n"
-      "}\n"
-      "\n"
-      "class MyClass1 implements MyInterface1 {\n"
-      "}\n"
-      "\n"
-      "class MyClass2 implements MyInterface0, MyInterface1 {\n"
-      "}\n"
-      "\n"
-      "abstract class MyInterface0 {\n"
-      "}\n"
-      "\n"
-      "abstract class MyInterface1 implements MyInterface0 {\n"
-      "}\n";
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-
-  Dart_Handle cls0 = Dart_GetClass(lib, NewString("MyClass0"));
-  Dart_Handle cls1 = Dart_GetClass(lib, NewString("MyClass1"));
-  Dart_Handle cls2 = Dart_GetClass(lib, NewString("MyClass2"));
-  Dart_Handle intf0 = Dart_GetClass(lib, NewString("MyInterface0"));
-  Dart_Handle intf1 = Dart_GetClass(lib, NewString("MyInterface1"));
-
-  intptr_t len = -1;
-  EXPECT_VALID(Dart_ClassGetInterfaceCount(cls0, &len));
-  EXPECT_EQ(0, len);
-
-  EXPECT_ERROR(Dart_ClassGetInterfaceAt(cls0, 0),
-               "Dart_ClassGetInterfaceAt: argument 'index' out of bounds");
-
-  len = -1;
-  EXPECT_VALID(Dart_ClassGetInterfaceCount(cls1, &len));
-  EXPECT_EQ(1, len);
-  CHECK_CLASS(Dart_ClassGetInterfaceAt(cls1, 0), "MyInterface1");
-
-  EXPECT_ERROR(Dart_ClassGetInterfaceAt(cls1, -1),
-               "Dart_ClassGetInterfaceAt: argument 'index' out of bounds");
-  EXPECT_ERROR(Dart_ClassGetInterfaceAt(cls1, 1),
-               "Dart_ClassGetInterfaceAt: argument 'index' out of bounds");
-
-  len = -1;
-  EXPECT_VALID(Dart_ClassGetInterfaceCount(cls2, &len));
-  EXPECT_EQ(2, len);
-
-  // TODO(turnidge): The test relies on the ordering here.  Sort this.
-  CHECK_CLASS(Dart_ClassGetInterfaceAt(cls2, 0), "MyInterface0");
-  CHECK_CLASS(Dart_ClassGetInterfaceAt(cls2, 1), "MyInterface1");
-
-  len = -1;
-  EXPECT_VALID(Dart_ClassGetInterfaceCount(intf0, &len));
-  EXPECT_EQ(0, len);
-
-  len = -1;
-  EXPECT_VALID(Dart_ClassGetInterfaceCount(intf1, &len));
-  EXPECT_EQ(1, len);
-  CHECK_CLASS(Dart_ClassGetInterfaceAt(intf1, 0), "MyInterface0");
-
-  // Error cases.
-  EXPECT_ERROR(Dart_ClassGetInterfaceCount(Dart_True(), &len),
-               "Dart_ClassGetInterfaceCount expects argument 'object' to be of "
-               "type Class/Type.");
-  EXPECT_ERROR(Dart_ClassGetInterfaceCount(Dart_NewApiError("MyError"), &len),
-               "MyError");
-}
-
-
 TEST_CASE(TypeGetNonParamtericTypes) {
   const char* kScriptChars =
       "class MyClass0 {\n"
@@ -4429,186 +4314,6 @@
                "did not find top-level function '_imported'");
 }
 
-TEST_CASE(ClosureFunction) {
-  const char* kScriptChars =
-      "Function getClosure() {\n"
-      "  return (x, y, [z]) => x + y + z;\n"
-      "}\n"
-      "class Foo {\n"
-      "  getInstanceClosure() {\n"
-      "    return () { return this; };\n"
-      "  }\n"
-      "  getInstanceClosureWithArgs() {\n"
-      "    return (x, y, [z]) { return this; };\n"
-      "  }\n"
-      "  static getStaticClosure() {\n"
-      "    return () { return 42; };\n"
-      "  }\n"
-      "  static getStaticClosureWithArgs() {\n"
-      "    return (x, y, [z]) { return 42; };\n"
-      "  }\n"
-      "}\n"
-      "Function getInstanceClosure() {\n"
-      "  return new Foo().getInstanceClosure();\n"
-      "}\n"
-      "Function getInstanceClosureWithArgs() {\n"
-      "  return new Foo().getInstanceClosureWithArgs();\n"
-      "}\n"
-      "Function getStaticClosure() {\n"
-      "  return Foo.getStaticClosure();\n"
-      "}\n"
-      "Function getStaticClosureWithArgs() {\n"
-      "  return Foo.getStaticClosureWithArgs();\n"
-      "}\n";
-  Dart_Handle result;
-  Dart_Handle owner;
-  Dart_Handle defining_function;
-  DARTSCOPE(Isolate::Current());
-
-  // Create a test library and Load up a test script in it.
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  EXPECT_VALID(lib);
-  Dart_Handle type = Dart_GetType(lib, NewString("Foo"), 0, NULL);
-  EXPECT_VALID(type);
-
-  // Invoke a function which returns a closure.
-  Dart_Handle retobj = Dart_Invoke(lib, NewString("getClosure"), 0, NULL);
-  EXPECT_VALID(retobj);
-
-  EXPECT(Dart_IsClosure(retobj));
-  EXPECT(!Dart_IsClosure(Dart_NewInteger(101)));
-
-  // Retrieve the closure's function
-  result = Dart_ClosureFunction(retobj);
-  EXPECT_VALID(result);
-  EXPECT(Dart_IsFunction(result));
-  owner = Dart_FunctionOwner(result);
-  EXPECT_VALID(owner);
-  defining_function = Dart_LookupFunction(lib, NewString("getClosure"));
-  EXPECT(Dart_IdentityEquals(owner, defining_function));
-  int64_t fixed_param_count = -999;
-  int64_t opt_param_count = -999;
-  result = Dart_FunctionParameterCounts(result,
-                                        &fixed_param_count,
-                                        &opt_param_count);
-  EXPECT_VALID(result);
-  EXPECT_EQ(2, fixed_param_count);
-  EXPECT_EQ(1, opt_param_count);
-
-  // Try to retrieve function from a non-closure object
-  result = Dart_ClosureFunction(Dart_NewInteger(1));
-  EXPECT(Dart_IsError(result));
-
-  // Invoke a function which returns an "instance" closure.
-  retobj = Dart_Invoke(lib, NewString("getInstanceClosure"), 0, NULL);
-  EXPECT_VALID(retobj);
-  EXPECT(Dart_IsClosure(retobj));
-
-  // Retrieve the closure's function
-  result = Dart_ClosureFunction(retobj);
-  EXPECT_VALID(result);
-  EXPECT(Dart_IsFunction(result));
-  owner = Dart_FunctionOwner(result);
-  EXPECT_VALID(owner);
-  Isolate* isolate = Isolate::Current();
-  Dart_Handle cls = Api::NewHandle(
-      isolate, Api::UnwrapTypeHandle(isolate, type).type_class());
-  defining_function = Dart_LookupFunction(cls,
-                                          NewString("getInstanceClosure"));
-  EXPECT(Dart_IdentityEquals(owner, defining_function));
-  // -999: We want to distinguish between a non-answer and a wrong answer, and
-  // -1 has been a previous wrong answer
-  fixed_param_count = -999;
-  opt_param_count = -999;
-  result = Dart_FunctionParameterCounts(result,
-                                        &fixed_param_count,
-                                        &opt_param_count);
-  EXPECT_VALID(result);
-  EXPECT_EQ(0, fixed_param_count);
-  EXPECT_EQ(0, opt_param_count);
-
-  // Invoke a function which returns an "instance" closure with arguments.
-  retobj = Dart_Invoke(lib,
-                       NewString("getInstanceClosureWithArgs"),
-                       0,
-                       NULL);
-  EXPECT_VALID(retobj);
-  EXPECT(Dart_IsClosure(retobj));
-
-  // Retrieve the closure's function
-  result = Dart_ClosureFunction(retobj);
-  EXPECT_VALID(result);
-  EXPECT(Dart_IsFunction(result));
-  owner = Dart_FunctionOwner(result);
-  EXPECT_VALID(owner);
-  defining_function =
-      Dart_LookupFunction(cls, NewString("getInstanceClosureWithArgs"));
-  EXPECT(Dart_IdentityEquals(owner, defining_function));
-  // -999: We want to distinguish between a non-answer and a wrong answer, and
-  // -1 has been a previous wrong answer
-  fixed_param_count = -999;
-  opt_param_count = -999;
-  result = Dart_FunctionParameterCounts(result,
-                                        &fixed_param_count,
-                                        &opt_param_count);
-  EXPECT_VALID(result);
-  EXPECT_EQ(2, fixed_param_count);
-  EXPECT_EQ(1, opt_param_count);
-
-  // Invoke a function which returns a "static" closure.
-  retobj = Dart_Invoke(lib, NewString("getStaticClosure"), 0, NULL);
-  EXPECT_VALID(retobj);
-  EXPECT(Dart_IsClosure(retobj));
-
-  // Retrieve the closure's function
-  result = Dart_ClosureFunction(retobj);
-  EXPECT_VALID(result);
-  EXPECT(Dart_IsFunction(result));
-  owner = Dart_FunctionOwner(result);
-  EXPECT_VALID(owner);
-  defining_function = Dart_LookupFunction(cls,
-                                          NewString("getStaticClosure"));
-  EXPECT(Dart_IdentityEquals(owner, defining_function));
-  // -999: We want to distinguish between a non-answer and a wrong answer, and
-  // -1 has been a previous wrong answer
-  fixed_param_count = -999;
-  opt_param_count = -999;
-  result = Dart_FunctionParameterCounts(result,
-                                        &fixed_param_count,
-                                        &opt_param_count);
-  EXPECT_VALID(result);
-  EXPECT_EQ(0, fixed_param_count);
-  EXPECT_EQ(0, opt_param_count);
-
-
-  // Invoke a function which returns a "static" closure with arguments.
-  retobj = Dart_Invoke(lib,
-                       NewString("getStaticClosureWithArgs"),
-                       0,
-                       NULL);
-  EXPECT_VALID(retobj);
-  EXPECT(Dart_IsClosure(retobj));
-
-  // Retrieve the closure's function
-  result = Dart_ClosureFunction(retobj);
-  EXPECT_VALID(result);
-  EXPECT(Dart_IsFunction(result));
-  owner = Dart_FunctionOwner(result);
-  EXPECT_VALID(owner);
-  defining_function =
-      Dart_LookupFunction(cls, NewString("getStaticClosureWithArgs"));
-  EXPECT(Dart_IdentityEquals(owner, defining_function));
-  // -999: We want to distinguish between a non-answer and a wrong answer, and
-  // -1 has been a previous wrong answer
-  fixed_param_count = -999;
-  opt_param_count = -999;
-  result = Dart_FunctionParameterCounts(result,
-                                        &fixed_param_count,
-                                        &opt_param_count);
-  EXPECT_VALID(result);
-  EXPECT_EQ(2, fixed_param_count);
-  EXPECT_EQ(1, opt_param_count);
-}
 
 TEST_CASE(InvokeClosure) {
   const char* kScriptChars =
@@ -4805,684 +4510,6 @@
 }
 
 
-static void BuildFunctionDescription(TextBuffer* buffer, Dart_Handle func) {
-  buffer->Clear();
-  if (Dart_IsNull(func)) {
-    WARN("Function not found");
-    return;
-  }
-  Dart_Handle name = Dart_FunctionName(func);
-  EXPECT_VALID(name);
-  const char* name_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(name, &name_cstr));
-  bool is_abstract = false;
-  bool is_static = false;
-  bool is_getter = false;
-  bool is_setter = false;
-  bool is_constructor = false;
-  int64_t fixed_param_count = -1;
-  int64_t opt_param_count = -1;
-  EXPECT_VALID(Dart_FunctionIsAbstract(func, &is_abstract));
-  EXPECT_VALID(Dart_FunctionIsStatic(func, &is_static));
-  EXPECT_VALID(Dart_FunctionIsGetter(func, &is_getter));
-  EXPECT_VALID(Dart_FunctionIsSetter(func, &is_setter));
-  EXPECT_VALID(Dart_FunctionIsConstructor(func, &is_constructor));
-  EXPECT_VALID(Dart_FunctionParameterCounts(func,
-    &fixed_param_count, &opt_param_count));
-
-  buffer->Printf("%s %"Pd64" %"Pd64"",
-    name_cstr,
-    fixed_param_count,
-    opt_param_count);
-  if (is_abstract) {
-    buffer->Printf(" abstract");
-  }
-  if (is_static) {
-    buffer->Printf(" static");
-  }
-  if (is_getter) {
-    buffer->Printf(" getter");
-  }
-  if (is_setter) {
-    buffer->Printf(" setter");
-  }
-  if (is_constructor) {
-    buffer->Printf(" constructor");
-  }
-}
-
-
-TEST_CASE(FunctionReflection) {
-  const char* kScriptChars =
-      "a() => 'a';\n"
-      "_b() => '_b';\n"
-      "get c => 'bar';\n"
-      "set d(x) {}\n"
-      "get _e => 'bar';\n"
-      "set _f(x) {}\n"
-      "class MyClass {\n"
-      "  MyClass() {}\n"
-      "  MyClass.named() {}\n"
-      "  a() => 'a';\n"
-      "  _b() => '_b';\n"
-      "  get c => 'bar';\n"
-      "  set d(x) {}\n"
-      "  get _e => 'bar';\n"
-      "  set _f(x) {}\n"
-      "  static g() => 'g';\n"
-      "  static _h() => '_h';\n"
-      "  static get i => 'i';\n"
-      "  static set j(x) {}\n"
-      "  static get _k => 'k';\n"
-      "  static set _l(x) {}\n"
-      "  m();\n"
-      "  _n();\n"
-      "  get o;\n"
-      "  set p(x);\n"
-      "  get _q;\n"
-      "  set _r(x);\n"
-      "  s(x, [y, z]) {}\n"
-      "  t([x, y, z]) {}\n"
-      "  operator ==(x) {}\n"
-      "}\n"
-      "class _PrivateClass {\n"
-      "  _PrivateClass() {}\n"
-      "  _PrivateClass.named() {}\n"
-      "}\n";
-
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  EXPECT_VALID(lib);
-  Dart_Handle cls = Dart_GetClass(lib, NewString("MyClass"));
-  EXPECT_VALID(cls);
-  Dart_Handle private_cls = Dart_GetClass(lib, NewString("_PrivateClass"));
-  EXPECT_VALID(private_cls);
-  TextBuffer buffer(128);
-
-  // Lookup a top-level function.
-  Dart_Handle func = Dart_LookupFunction(lib, NewString("a"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("a 0 0 static", buffer.buf());
-  EXPECT(Dart_IsLibrary(Dart_FunctionOwner(func)));
-  Dart_Handle owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, lib));
-
-  // Lookup a private top-level function.
-  func = Dart_LookupFunction(lib, NewString("_b"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("_b 0 0 static", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, lib));
-
-  // Lookup a top-level getter.
-  func = Dart_LookupFunction(lib, NewString("c"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("c 0 0 static getter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, lib));
-
-  // Lookup a top-level setter.
-  func = Dart_LookupFunction(lib, NewString("d="));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("d= 1 0 static setter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, lib));
-
-  // Lookup a private top-level getter.
-  func = Dart_LookupFunction(lib, NewString("_e"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("_e 0 0 static getter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, lib));
-
-  // Lookup a private top-level setter.
-  func = Dart_LookupFunction(lib, NewString("_f="));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("_f= 1 0 static setter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, lib));
-
-  // Lookup an unnamed constructor
-  func = Dart_LookupFunction(cls, NewString("MyClass"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("MyClass 0 0 constructor", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a named constructor
-  func = Dart_LookupFunction(cls, NewString("MyClass.named"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("MyClass.named 0 0 constructor", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup an private unnamed constructor
-  func = Dart_LookupFunction(private_cls, NewString("_PrivateClass"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("_PrivateClass 0 0 constructor", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, private_cls));
-
-  // Lookup a private named constructor
-  func = Dart_LookupFunction(private_cls,
-                             NewString("_PrivateClass.named"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("_PrivateClass.named 0 0 constructor", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, private_cls));
-
-  // Lookup a method.
-  func = Dart_LookupFunction(cls, NewString("a"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("a 0 0", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a private method.
-  func = Dart_LookupFunction(cls, NewString("_b"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("_b 0 0", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a instance getter.
-  func = Dart_LookupFunction(cls, NewString("c"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("c 0 0 getter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a instance setter.
-  func = Dart_LookupFunction(cls, NewString("d="));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("d= 1 0 setter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a private instance getter.
-  func = Dart_LookupFunction(cls, NewString("_e"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("_e 0 0 getter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a private instance setter.
-  func = Dart_LookupFunction(cls, NewString("_f="));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("_f= 1 0 setter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a static method.
-  func = Dart_LookupFunction(cls, NewString("g"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("g 0 0 static", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a private static method.
-  func = Dart_LookupFunction(cls, NewString("_h"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("_h 0 0 static", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a static getter.
-  func = Dart_LookupFunction(cls, NewString("i"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("i 0 0 static getter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a static setter.
-  func = Dart_LookupFunction(cls, NewString("j="));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("j= 1 0 static setter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a private static getter.
-  func = Dart_LookupFunction(cls, NewString("_k"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("_k 0 0 static getter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a private static setter.
-  func = Dart_LookupFunction(cls, NewString("_l="));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("_l= 1 0 static setter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup an abstract method.
-  func = Dart_LookupFunction(cls, NewString("m"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("m 0 0 abstract", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a private abstract method.
-  func = Dart_LookupFunction(cls, NewString("_n"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("_n 0 0 abstract", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a abstract getter.
-  func = Dart_LookupFunction(cls, NewString("o"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("o 0 0 abstract getter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a abstract setter.
-  func = Dart_LookupFunction(cls, NewString("p="));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("p= 1 0 abstract setter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a private abstract getter.
-  func = Dart_LookupFunction(cls, NewString("_q"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("_q 0 0 abstract getter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a private abstract setter.
-  func = Dart_LookupFunction(cls, NewString("_r="));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("_r= 1 0 abstract setter", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a method with fixed and optional parameters.
-  func = Dart_LookupFunction(cls, NewString("s"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("s 1 2", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a method with only optional parameters.
-  func = Dart_LookupFunction(cls, NewString("t"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("t 0 3", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup an operator
-  func = Dart_LookupFunction(cls, NewString("=="));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-  BuildFunctionDescription(&buffer, func);
-  EXPECT_STREQ("== 1 0", buffer.buf());
-  owner = Dart_FunctionOwner(func);
-  EXPECT_VALID(owner);
-  EXPECT(Dart_IdentityEquals(owner, cls));
-
-  // Lookup a function that does not exist from a library.
-  func = Dart_LookupFunction(lib, NewString("DoesNotExist"));
-  EXPECT(Dart_IsNull(func));
-
-  // Lookup a function that does not exist from a class.
-  func = Dart_LookupFunction(cls, NewString("DoesNotExist"));
-  EXPECT(Dart_IsNull(func));
-
-  // Lookup a class using an error class name.  The error propagates.
-  func = Dart_LookupFunction(cls, Api::NewError("myerror"));
-  EXPECT_ERROR(func, "myerror");
-
-  // Lookup a class from an error library.  The error propagates.
-  func = Dart_LookupFunction(Api::NewError("myerror"), NewString("foo"));
-  EXPECT_ERROR(func, "myerror");
-}
-
-
-TEST_CASE(TypeReflection) {
-  const char* kScriptChars =
-      "void func(String a, int b) {}\n"
-      "int variable;\n";
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  EXPECT_VALID(lib);
-
-  Dart_Handle func = Dart_LookupFunction(lib, NewString("func"));
-  EXPECT_VALID(func);
-  EXPECT(Dart_IsFunction(func));
-
-  // Make sure parameter counts are right.
-  int64_t fixed_params = -1;
-  int64_t opt_params = -1;
-  EXPECT_VALID(Dart_FunctionParameterCounts(func, &fixed_params, &opt_params));
-  EXPECT_EQ(2, fixed_params);
-  EXPECT_EQ(0, opt_params);
-
-  // Check the return type.
-  Dart_Handle type = Dart_FunctionReturnType(func);
-  EXPECT_VALID(type);
-  Dart_Handle cls_name = Dart_ClassName(type);
-  EXPECT_VALID(cls_name);
-  const char* cls_name_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(cls_name, &cls_name_cstr));
-  EXPECT_STREQ("void", cls_name_cstr);
-
-  // Check a parameter type.
-  type = Dart_FunctionParameterType(func, 0);
-  EXPECT_VALID(type);
-  cls_name = Dart_ClassName(type);
-  EXPECT_VALID(cls_name);
-  cls_name_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(cls_name, &cls_name_cstr));
-  EXPECT_STREQ("String", cls_name_cstr);
-
-  Dart_Handle var = Dart_LookupVariable(lib, NewString("variable"));
-  EXPECT_VALID(var);
-  EXPECT(Dart_IsVariable(var));
-
-  // Check the variable type.
-  type = Dart_VariableType(var);
-  EXPECT_VALID(type);
-  cls_name = Dart_ClassName(type);
-  EXPECT_VALID(cls_name);
-  cls_name_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(cls_name, &cls_name_cstr));
-  if (FLAG_enable_type_checks) {
-    EXPECT_STREQ("int", cls_name_cstr);
-  } else {
-    EXPECT_STREQ("dynamic", cls_name_cstr);
-  }
-}
-
-
-static void BuildVariableDescription(TextBuffer* buffer, Dart_Handle var) {
-  buffer->Clear();
-  Dart_Handle name = Dart_VariableName(var);
-  EXPECT_VALID(name);
-  const char* name_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(name, &name_cstr));
-  bool is_static = false;
-  bool is_final = false;
-  EXPECT_VALID(Dart_VariableIsStatic(var, &is_static));
-  EXPECT_VALID(Dart_VariableIsFinal(var, &is_final));
-  buffer->Printf("%s", name_cstr);
-  if (is_static) {
-    buffer->Printf(" static");
-  }
-  if (is_final) {
-    buffer->Printf(" final");
-  }
-}
-
-
-TEST_CASE(VariableReflection) {
-  const char* kScriptChars =
-      "var a = 'a';\n"
-      "var _b = '_b';\n"
-      "final c = 'c';\n"
-      "final _d = '_d';\n"
-      "class MyClass {\n"
-      "  var a = 'a';\n"
-      "  var _b = '_b';\n"
-      "  final c = 'c';\n"
-      "  final _d = '_d';\n"
-      "  static var e = 'e';\n"
-      "  static var _f = '_f';\n"
-      "  static const g = 'g';\n"
-      "  static const _h = '_h';\n"
-      "}\n";
-
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  EXPECT_VALID(lib);
-  Dart_Handle cls = Dart_GetClass(lib, NewString("MyClass"));
-  EXPECT_VALID(cls);
-  TextBuffer buffer(128);
-
-  // Lookup a top-level variable.
-  Dart_Handle var = Dart_LookupVariable(lib, NewString("a"));
-  EXPECT_VALID(var);
-  EXPECT(Dart_IsVariable(var));
-  BuildVariableDescription(&buffer, var);
-  EXPECT_STREQ("a static", buffer.buf());
-
-  // Lookup a private top-level variable.
-  var = Dart_LookupVariable(lib, NewString("_b"));
-  EXPECT_VALID(var);
-  EXPECT(Dart_IsVariable(var));
-  BuildVariableDescription(&buffer, var);
-  EXPECT_STREQ("_b static", buffer.buf());
-
-  // Lookup a const top-level variable.
-  var = Dart_LookupVariable(lib, NewString("c"));
-  EXPECT_VALID(var);
-  EXPECT(Dart_IsVariable(var));
-  BuildVariableDescription(&buffer, var);
-  EXPECT_STREQ("c static final", buffer.buf());
-
-  // Lookup a private const top-level variable.
-  var = Dart_LookupVariable(lib, NewString("_d"));
-  EXPECT_VALID(var);
-  EXPECT(Dart_IsVariable(var));
-  BuildVariableDescription(&buffer, var);
-  EXPECT_STREQ("_d static final", buffer.buf());
-
-  // Lookup a instance variable.
-  var = Dart_LookupVariable(cls, NewString("a"));
-  EXPECT_VALID(var);
-  EXPECT(Dart_IsVariable(var));
-  BuildVariableDescription(&buffer, var);
-  EXPECT_STREQ("a", buffer.buf());
-
-  // Lookup a private instance variable.
-  var = Dart_LookupVariable(cls, NewString("_b"));
-  EXPECT_VALID(var);
-  EXPECT(Dart_IsVariable(var));
-  BuildVariableDescription(&buffer, var);
-  EXPECT_STREQ("_b", buffer.buf());
-
-  // Lookup a final instance variable.
-  var = Dart_LookupVariable(cls, NewString("c"));
-  EXPECT_VALID(var);
-  EXPECT(Dart_IsVariable(var));
-  BuildVariableDescription(&buffer, var);
-  EXPECT_STREQ("c final", buffer.buf());
-
-  // Lookup a private final instance variable.
-  var = Dart_LookupVariable(cls, NewString("_d"));
-  EXPECT_VALID(var);
-  EXPECT(Dart_IsVariable(var));
-  BuildVariableDescription(&buffer, var);
-  EXPECT_STREQ("_d final", buffer.buf());
-
-  // Lookup a static variable.
-  var = Dart_LookupVariable(cls, NewString("e"));
-  EXPECT_VALID(var);
-  EXPECT(Dart_IsVariable(var));
-  BuildVariableDescription(&buffer, var);
-  EXPECT_STREQ("e static", buffer.buf());
-
-  // Lookup a private static variable.
-  var = Dart_LookupVariable(cls, NewString("_f"));
-  EXPECT_VALID(var);
-  EXPECT(Dart_IsVariable(var));
-  BuildVariableDescription(&buffer, var);
-  EXPECT_STREQ("_f static", buffer.buf());
-
-  // Lookup a const static variable.
-  var = Dart_LookupVariable(cls, NewString("g"));
-  EXPECT_VALID(var);
-  EXPECT(Dart_IsVariable(var));
-  BuildVariableDescription(&buffer, var);
-  EXPECT_STREQ("g static final", buffer.buf());
-
-  // Lookup a private const static variable.
-  var = Dart_LookupVariable(cls, NewString("_h"));
-  EXPECT_VALID(var);
-  EXPECT(Dart_IsVariable(var));
-  BuildVariableDescription(&buffer, var);
-  EXPECT_STREQ("_h static final", buffer.buf());
-
-  // Lookup a variable that does not exist from a library.
-  var = Dart_LookupVariable(lib, NewString("DoesNotExist"));
-  EXPECT(Dart_IsNull(var));
-
-  // Lookup a variable that does not exist from a class.
-  var = Dart_LookupVariable(cls, NewString("DoesNotExist"));
-  EXPECT(Dart_IsNull(var));
-
-  // Lookup a class from an error library.  The error propagates.
-  var = Dart_LookupVariable(Api::NewError("myerror"), NewString("foo"));
-  EXPECT_ERROR(var, "myerror");
-
-  // Lookup a class using an error class name.  The error propagates.
-  var = Dart_LookupVariable(lib, Api::NewError("myerror"));
-  EXPECT_ERROR(var, "myerror");
-}
-
-
-TEST_CASE(TypeVariableReflection) {
-  const char* kScriptChars =
-      "abstract class UpperBound {}\n"
-      "class GenericClass<U, T extends UpperBound> {\n"
-      "  T func1() { return null; }\n"
-      "  U func2() { return null; }\n"
-      "}\n";
-
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  Dart_Handle cls = Dart_GetClass(lib, NewString("GenericClass"));
-  EXPECT_VALID(cls);
-
-  // Test Dart_GetTypeVariableNames.
-  Dart_Handle names = Dart_GetTypeVariableNames(cls);
-  EXPECT_VALID(names);
-  Dart_Handle names_str = Dart_ToString(names);
-  EXPECT_VALID(names_str);
-  const char* cstr = "";
-  EXPECT_VALID(Dart_StringToCString(names_str, &cstr));
-  EXPECT_STREQ("[U, T]", cstr);
-
-  // Test variable U.
-  Dart_Handle type_var = Dart_LookupTypeVariable(cls, NewString("U"));
-  EXPECT_VALID(type_var);
-  EXPECT(Dart_IsTypeVariable(type_var));
-  Dart_Handle type_var_name = Dart_TypeVariableName(type_var);
-  EXPECT_VALID(type_var_name);
-  EXPECT_VALID(Dart_StringToCString(type_var_name, &cstr));
-  EXPECT_STREQ("U", cstr);
-  Dart_Handle type_var_owner = Dart_TypeVariableOwner(type_var);
-  EXPECT_VALID(type_var_owner);
-  EXPECT(Dart_IdentityEquals(cls, type_var_owner));
-  Dart_Handle type_var_bound = Dart_TypeVariableUpperBound(type_var);
-  Dart_Handle bound_name = Dart_ClassName(type_var_bound);
-  EXPECT_VALID(Dart_StringToCString(bound_name, &cstr));
-  EXPECT_STREQ("Object", cstr);
-
-  // Test variable T.
-  type_var = Dart_LookupTypeVariable(cls, NewString("T"));
-  EXPECT_VALID(type_var);
-  EXPECT(Dart_IsTypeVariable(type_var));
-  type_var_name = Dart_TypeVariableName(type_var);
-  EXPECT_VALID(type_var_name);
-  EXPECT_VALID(Dart_StringToCString(type_var_name, &cstr));
-  EXPECT_STREQ("T", cstr);
-  type_var_owner = Dart_TypeVariableOwner(type_var);
-  EXPECT_VALID(type_var_owner);
-  EXPECT(Dart_IdentityEquals(cls, type_var_owner));
-  type_var_bound = Dart_TypeVariableUpperBound(type_var);
-  bound_name = Dart_ClassName(type_var_bound);
-  EXPECT_VALID(Dart_StringToCString(bound_name, &cstr));
-  EXPECT_STREQ("UpperBound", cstr);
-}
-
-
 TEST_CASE(InstanceOf) {
   const char* kScriptChars =
       "class OtherClass {\n"
@@ -5920,71 +4947,6 @@
 }
 
 
-TEST_CASE(GetVariableNames) {
-  const char* kLibraryChars =
-      "library library_name;\n"
-      "\n"
-      "var A;\n"
-      "get B => 12;\n"
-      "set C(x) { }\n"
-      "D(x) => (x + 1);\n"
-      "var _A;\n"
-      "get _B => 12;\n"
-      "set _C(x) { }\n"
-      "_D(x) => (x + 1);\n"
-      "\n"
-      "class MyClass {\n"
-      "  var A2;\n"
-      "  var _A2;\n"
-      "}\n"
-      "\n"
-      "_compare(String a, String b) => a.compareTo(b);\n"
-      "sort(list) => list.sort(_compare);\n";
-
-  // Get the variables from a library.
-  Dart_Handle url = NewString("library_url");
-  Dart_Handle source = NewString(kLibraryChars);
-  Dart_Handle lib = Dart_LoadLibrary(url, source);
-  EXPECT_VALID(lib);
-
-  Dart_Handle list = Dart_GetVariableNames(lib);
-  EXPECT_VALID(list);
-  EXPECT(Dart_IsList(list));
-
-  // Sort the list.
-  const int kNumArgs = 1;
-  Dart_Handle args[1];
-  args[0] = list;
-  EXPECT_VALID(Dart_Invoke(lib, NewString("sort"), kNumArgs, args));
-
-  // Check list contents.
-  Dart_Handle list_string = Dart_ToString(list);
-  EXPECT_VALID(list_string);
-  const char* list_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr));
-  EXPECT_STREQ("[A, _A]", list_cstr);
-
-  // Get the variables from a class.
-  Dart_Handle cls = Dart_GetClass(lib, NewString("MyClass"));
-  EXPECT_VALID(cls);
-
-  list = Dart_GetVariableNames(cls);
-  EXPECT_VALID(list);
-  EXPECT(Dart_IsList(list));
-
-  // Sort the list.
-  args[0] = list;
-  EXPECT_VALID(Dart_Invoke(lib, NewString("sort"), kNumArgs, args));
-
-  // Check list contents.
-  list_string = Dart_ToString(list);
-  EXPECT_VALID(list_string);
-  list_cstr = "";
-  EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr));
-  EXPECT_STREQ("[A2, _A2]", list_cstr);
-}
-
-
 TEST_CASE(LibraryImportLibrary) {
   const char* kLibrary1Chars =
       "library library1_name;";
@@ -8154,6 +7116,47 @@
 }
 
 
+// Do not use guarding mechanism on externalizable classes, since their class
+// can change on the fly,
+TEST_CASE(GuardExternalizedString) {
+  const char* kScriptChars =
+      "main() {\n"
+      "  var a = new A('hello');\n"
+      "  var res = runOne(a);\n"
+      "  if (res != 10640000) return -1;\n"
+      "  change_str(a.f);\n"
+      "  res = runOne(a);\n"
+      "  return res;\n"
+      "}\n"
+      "runOne(a) {\n"
+      "  var sum = 0;\n"
+      "  for (int i = 0; i < 20000; i++) {\n"
+      "    for (int j = 0; j < a.f.length; j++) {\n"
+      "      sum += a.f.codeUnitAt(j);\n"
+      "    }\n"
+      "  }\n"
+      "  return sum;\n"
+      "}\n"
+      "class A {\n"
+      "  var f;\n"
+      "  A(this.f);\n"
+      "}\n"
+      "change_str(String s) native 'A_change_str';\n"
+      "";
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kScriptChars,
+                               &ExternalStringDeoptimize_native_lookup);
+  Dart_Handle result = Dart_Invoke(lib,
+                                   NewString("main"),
+                                   0,
+                                   NULL);
+  int64_t value = 0;
+  result = Dart_IntegerToInt64(result, &value);
+  EXPECT_VALID(result);
+  EXPECT_EQ(10640000, value);
+}
+
+
 TEST_CASE(ExternalStringDeoptimize) {
   const char* kScriptChars =
       "String str = 'A';\n"
@@ -8246,57 +7249,4 @@
   EXPECT_EQ(8, value);
 }
 
-
-TEST_CASE(AmbiguousReference) {
-  const char* kImportedScript1Chars =
-      "library library1.dart;\n"
-      "var foo;\n"
-      "var foo1;\n"
-      "bar() => 'library1.dart bar()';\n"
-      "bar1() => 'library1.dart bar1()';\n"
-      "baz() => 'library1.dart baz()';\n"
-      "var bay;\n"
-      "typedef int bax(int a, int b);\n"
-      "class baw {}\n";
-  const char* kImportedScript2Chars =
-      "library library2.dart;\n"
-      "var foo;\n"
-      "var foo2;\n"
-      "bar() => 'library2.dart bar()';\n"
-      "bar2() => 'library2.dart bar2()';\n"
-      "var baz;\n"
-      "bay() => 'library2.dart bay()';\n"
-      "typedef double bax(int a, int b);\n"
-      "var baw;\n";
-  const char* kScriptChars =
-      "import 'library1.dart';\n"
-      "import 'library2.dart';\n";
-
-  // Load imported libs.
-  Dart_Handle url1 = NewString("library1.dart");
-  Dart_Handle source1 = NewString(kImportedScript1Chars);
-  Dart_Handle imported_lib1 = Dart_LoadLibrary(url1, source1);
-  EXPECT_VALID(imported_lib1);
-  Dart_Handle url2 = NewString("library2.dart");
-  Dart_Handle source2 = NewString(kImportedScript2Chars);
-  Dart_Handle imported_lib2 = Dart_LoadLibrary(url2, source2);
-  EXPECT_VALID(imported_lib2);
-  // Load main script.
-  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
-  EXPECT_VALID(lib);
-  // Expect an error for ambiguous references.
-  EXPECT(Dart_IsError(Dart_LookupVariable(lib, NewString("foo"))));
-  EXPECT(Dart_IsError(Dart_LookupFunction(lib, NewString("bar"))));
-  EXPECT(Dart_IsError(Dart_LookupFunction(lib, NewString("baz"))));
-  EXPECT(Dart_IsError(Dart_LookupVariable(lib, NewString("bay"))));
-  EXPECT(Dart_IsError(Dart_GetClass(lib, NewString("bax"))));
-  EXPECT(Dart_IsError(Dart_GetClass(lib, NewString("baw"))));
-  // Variables foo1 and foo2 are unambiguous.
-  EXPECT(!Dart_IsError(Dart_LookupVariable(lib, NewString("foo1"))));
-  EXPECT(!Dart_IsError(Dart_LookupVariable(lib, NewString("foo2"))));
-  // Functions bar1 and bar2 are unambiguous.
-  EXPECT(!Dart_IsError(Dart_LookupFunction(lib, NewString("bar1"))));
-  EXPECT(!Dart_IsError(Dart_LookupFunction(lib, NewString("bar2"))));
-}
-
 }  // namespace dart
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index b956c8d..b6ba0726 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -57,8 +57,6 @@
   const Code& code = Code::Handle(function.CurrentCode());
   ASSERT(!code.IsNull());
   ASSERT(Isolate::Current()->no_callback_scope_depth() == 0);
-  IsolateRunStateManager run_state_manager;
-  run_state_manager.SetRunState(Isolate::kIsolateRunning);
 #if defined(USING_SIMULATOR)
     return bit_copy<RawObject*, int64_t>(Simulator::Current()->Call(
         reinterpret_cast<int32_t>(entrypoint),
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index c67d3e8..bdecf76 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -1064,11 +1064,13 @@
   ASSERT(stack_trace_ == NULL);
   stack_trace_ = stack_trace;
   ASSERT(obj_cache_ == NULL);
+  in_event_notification_ = true;
   obj_cache_ = new RemoteObjectCache(64);
   DebuggerEvent event;
   event.type = kExceptionThrown;
   event.exception = &exc;
   (*event_handler_)(&event);
+  in_event_notification_ = false;
   stack_trace_ = NULL;
   obj_cache_ = NULL;  // Remote object cache is zone allocated.
 }
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index 7890195..070cf3f 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -1463,6 +1463,7 @@
       "class Test5<A, B, C> extends Test4<A, B> {\n"
       "}\n"
       "var s = new Set();\n"
+      "var l = new List();\n"
       "int main() {\n"
       "}\n";
 
@@ -1482,6 +1483,7 @@
   Dart_Handle int_name = Dart_NewStringFromCString("int");
   Dart_Handle set_name = Dart_NewStringFromCString("Set");
   Dart_Handle iterable_name = Dart_NewStringFromCString("IterableBase");
+  Dart_Handle list_name = Dart_NewStringFromCString("List");
 
   Dart_Handle object_type = Dart_GetType(core_lib, object_name, 0, NULL);
   Dart_Handle int_type = Dart_GetType(core_lib, int_name, 0, NULL);
@@ -1546,6 +1548,49 @@
     const Type& actual_type = Api::UnwrapTypeHandle(isolate, super_type);
     EXPECT(expected_type.raw() == actual_type.raw());
   }
+  {
+    Dart_Handle list_type = Dart_GetType(core_lib, list_name, 0, NULL);
+    Dart_Handle super_type = Dart_GetSupertype(list_type);
+    EXPECT(!Dart_IsError(super_type));
+    super_type = Dart_GetSupertype(super_type);
+    EXPECT(!Dart_IsError(super_type));
+    EXPECT(super_type == Dart_Null());
+  }
+}
+
+
+TEST_CASE(Debug_ListSuperType) {
+  const char* kScriptChars =
+      "List testMain() {"
+      "  List a = new List();"
+      "  a.add(10);"
+      "  a.add(20);"
+      "  a.add(30);"
+      "  return a;"
+      "}"
+      ""
+      "List immutable() {"
+      "  return const [0, 1, 2];"
+      "}";
+  Dart_Handle result;
+
+  // Create a test library and Load up a test script in it.
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+
+  // Invoke a function which returns an object of type List.
+  result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // First ensure that the returned object is a list.
+  Dart_Handle list_access_test_obj = result;
+  EXPECT(Dart_IsList(list_access_test_obj));
+
+  Dart_Handle list_type = Dart_InstanceGetType(list_access_test_obj);
+  Dart_Handle super_type = Dart_GetSupertype(list_type);
+  EXPECT(!Dart_IsError(super_type));
+  super_type = Dart_GetSupertype(super_type);
+  EXPECT(!Dart_IsError(super_type));
+  EXPECT(super_type == Dart_Null());
 }
 
 }  // namespace dart
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 2712f6f..109bb84 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -496,40 +496,31 @@
 }
 
 
-// Allocate, initialize, and throw a TypeError.
+// Allocate, initialize, and throw a TypeError or CastError.
 void Exceptions::CreateAndThrowTypeError(intptr_t location,
                                          const String& src_type_name,
                                          const String& dst_type_name,
                                          const String& dst_name,
                                          const String& malformed_error) {
-  const Array& args = Array::Handle(Array::New(8));
+  const Array& args = Array::Handle(Array::New(7));
 
   ExceptionType exception_type =
       dst_name.Equals(kCastErrorDstName) ? kCast : kType;
 
-  // Initialize argument 'failedAssertion'.
-  // Printing the src_obj value would be possible, but ToString() is expensive
-  // and not meaningful for all classes, so we just print '$expr instanceof...'.
-  // Users should look at TypeError.ToString(), which contains more useful
-  // information than AssertionError.failedAssertion.
-  String& failed_assertion = String::Handle(String::New("$expr instanceof "));
-  failed_assertion = String::Concat(failed_assertion, dst_type_name);
-  args.SetAt(0, failed_assertion);
-
-  // Initialize 'url', 'line', and 'column' arguments.
   DartFrameIterator iterator;
   const Script& script = Script::Handle(GetCallerScript(&iterator));
   intptr_t line, column;
   script.GetTokenLocation(location, &line, &column);
-  args.SetAt(1, String::Handle(script.url()));
-  args.SetAt(2, Smi::Handle(Smi::New(line)));
-  args.SetAt(3, Smi::Handle(Smi::New(column)));
+  // Initialize '_url', '_line', and '_column' arguments.
+  args.SetAt(0, String::Handle(script.url()));
+  args.SetAt(1, Smi::Handle(Smi::New(line)));
+  args.SetAt(2, Smi::Handle(Smi::New(column)));
 
-  // Initialize argument 'srcType'.
-  args.SetAt(4, src_type_name);
-  args.SetAt(5, dst_type_name);
-  args.SetAt(6, dst_name);
-  args.SetAt(7, malformed_error);
+  // Initialize '_srcType', '_dstType', '_dstName', and '_malformedError'.
+  args.SetAt(3, src_type_name);
+  args.SetAt(4, dst_type_name);
+  args.SetAt(5, dst_name);
+  args.SetAt(6, malformed_error);
 
   // Type errors in the core library may be difficult to diagnose.
   // Print type error information before throwing the error when debugging.
@@ -550,7 +541,7 @@
       OS::Print("malformed type used.\n");
     }
   }
-  // Throw TypeError instance.
+  // Throw TypeError or CastError instance.
   Exceptions::ThrowByType(exception_type, args);
   UNREACHABLE();
 }
@@ -645,7 +636,7 @@
     case kNoSuchMethod:
       library = Library::CoreLibrary();
       class_name = &Symbols::NoSuchMethodError();
-      constructor_name = &String::Handle(Symbols::New("._withType"));
+      constructor_name = &Symbols::DotWithType();
       break;
     case kFormat:
       library = Library::CoreLibrary();
@@ -678,22 +669,27 @@
     case kAssertion:
       library = Library::CoreLibrary();
       class_name = &Symbols::AssertionError();
+      constructor_name = &Symbols::DotCreate();
       break;
     case kCast:
       library = Library::CoreLibrary();
       class_name = &Symbols::CastError();
+      constructor_name = &Symbols::DotCreate();
       break;
     case kType:
       library = Library::CoreLibrary();
       class_name = &Symbols::TypeError();
+      constructor_name = &Symbols::DotCreate();
       break;
     case kFallThrough:
       library = Library::CoreLibrary();
       class_name = &Symbols::FallThroughError();
+      constructor_name = &Symbols::DotCreate();
       break;
     case kAbstractClassInstantiation:
       library = Library::CoreLibrary();
       class_name = &Symbols::AbstractClassInstantiationError();
+      constructor_name = &Symbols::DotCreate();
       break;
     case kMirroredUncaughtExceptionError:
       library = Library::MirrorsLibrary();
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index c63b362..5548c43 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -60,12 +60,6 @@
 }
 
 
-static intptr_t NextInstructionPos(intptr_t pos) {
-  ASSERT(IsInstructionStartPosition(pos));
-  return pos + 2;
-}
-
-
 FlowGraphAllocator::FlowGraphAllocator(const FlowGraph& flow_graph)
   : flow_graph_(flow_graph),
     reaching_defs_(flow_graph),
@@ -264,13 +258,17 @@
     // If the first use interval and the use interval we are adding
     // touch then we can just extend the first interval to cover their
     // union.
-    if (start >= first_use_interval()->start()) {
+    if (start > first_use_interval()->start()) {
       // The only case when we can add intervals with start greater than
       // start of an already created interval is BlockLocation.
-      ASSERT((start == first_use_interval()->start()) ||
-             (vreg() == kNoVirtualRegister));
+      ASSERT(vreg() == kNoVirtualRegister);
       ASSERT(end <= first_use_interval()->end());
       return;
+    } else if (start == first_use_interval()->start()) {
+      // Grow first interval if necessary.
+      if (end <= first_use_interval()->end()) return;
+      first_use_interval_->end_ = end;
+      return;
     } else if (end == first_use_interval()->start()) {
       first_use_interval()->start_ = start;
       return;
@@ -518,16 +516,16 @@
         range->DefineAt(catch_entry->start_pos());  // Defined at block entry.
         ProcessInitialDefinition(defn, range, catch_entry);
       }
-      // Block the two registers used by CatchEntryInstr from the block start to
-      // until the end of the instruction so that they are preserved.
-      ASSERT(catch_entry->next()->IsCatchEntry());
+      // Block the two fixed registers used by CatchBlockEntryInstr from the
+      // block start to until the end of the instruction so that they are
+      // preserved.
       intptr_t start = catch_entry->start_pos();
       BlockLocation(Location::RegisterLocation(kExceptionObjectReg),
                     start,
-                    ToInstructionEnd(NextInstructionPos(start)));
+                    ToInstructionEnd(start));
       BlockLocation(Location::RegisterLocation(kStackTraceObjectReg),
                     start,
-                    ToInstructionEnd(NextInstructionPos(start)));
+                    ToInstructionEnd(start));
     }
   }
 
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 900e7ff..f9c395c 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -57,7 +57,6 @@
     exit_collector_(exit_collector),
     last_used_block_id_(0),  // 0 is used for the graph entry.
     context_level_(0),
-    last_used_try_index_(CatchClauseNode::kInvalidTryIndex),
     try_index_(CatchClauseNode::kInvalidTryIndex),
     loop_depth_(0),
     graph_entry_(NULL),
@@ -3299,11 +3298,7 @@
 
 void EffectGraphVisitor::VisitCatchClauseNode(CatchClauseNode* node) {
   InlineBailout("EffectGraphVisitor::VisitCatchClauseNode (exception)");
-  // NOTE: The implicit variables ':saved_context', ':exception_var'
-  // and ':stacktrace_var' can never be captured variables.
   // Restores CTX from local variable ':saved_context'.
-  AddInstruction(
-      new CatchEntryInstr(node->exception_var(), node->stacktrace_var()));
   BuildRestoreContext(node->context_var());
 
   EffectGraphVisitor for_catch(owner(), temp_index());
@@ -3315,7 +3310,8 @@
 void EffectGraphVisitor::VisitTryCatchNode(TryCatchNode* node) {
   InlineBailout("EffectGraphVisitor::VisitTryCatchNode (exception)");
   intptr_t original_handler_index = owner()->try_index();
-  intptr_t try_handler_index = owner()->AllocateTryIndex();
+  intptr_t try_handler_index = node->try_index();
+  ASSERT(try_handler_index != original_handler_index);
   owner()->set_try_index(try_handler_index);
 
   // Preserve CTX into local variable '%saved_context'.
@@ -3343,65 +3339,72 @@
 
   CatchClauseNode* catch_block = node->catch_block();
   SequenceNode* finally_block = node->finally_block();
-  if (catch_block != NULL) {
-    // If there is a finally block, it is the handler for code in the catch
-    // block.
-    intptr_t catch_handler_index = (finally_block == NULL)
-        ? original_handler_index
-        : owner()->AllocateTryIndex();
-    owner()->set_try_index(catch_handler_index);
-    EffectGraphVisitor for_catch(owner(), temp_index());
-    catch_block->Visit(&for_catch);
-    CatchBlockEntryInstr* catch_entry =
+
+  // If there is a finally block, it is the handler for code in the catch
+  // block.
+  const intptr_t catch_handler_index = (finally_block == NULL)
+      ? original_handler_index
+      : catch_block->catch_handler_index();
+
+  owner()->set_try_index(catch_handler_index);
+  EffectGraphVisitor for_catch(owner(), temp_index());
+  catch_block->Visit(&for_catch);
+
+  // NOTE: The implicit variables ':saved_context', ':exception_var'
+  // and ':stacktrace_var' can never be captured variables.
+  ASSERT(!catch_block->exception_var().is_captured());
+  ASSERT(!catch_block->stacktrace_var().is_captured());
+
+  CatchBlockEntryInstr* catch_entry =
+      new CatchBlockEntryInstr(owner()->AllocateBlockId(),
+                               catch_handler_index,
+                               catch_block->handler_types(),
+                               try_handler_index,
+                               catch_block->exception_var(),
+                               catch_block->stacktrace_var());
+  owner()->AddCatchEntry(catch_entry);
+  ASSERT(!for_catch.is_open());
+  AppendFragment(catch_entry, for_catch);
+  if (node->end_catch_label() != NULL) {
+    JoinEntryInstr* join = node->end_catch_label()->join_for_continue();
+    if (join != NULL) {
+      if (is_open()) Goto(join);
+      exit_ = join;
+    }
+  }
+
+  if (finally_block != NULL) {
+    // Create a handler for the code in the catch block, containing the
+    // code in the finally block.
+    owner()->set_try_index(original_handler_index);
+    EffectGraphVisitor for_finally(owner(), temp_index());
+    for_finally.BuildRestoreContext(catch_block->context_var());
+
+    finally_block->Visit(&for_finally);
+    if (for_finally.is_open()) {
+      // Rethrow the exception.  Manually build the graph for rethrow.
+      Value* exception = for_finally.Bind(
+          for_finally.BuildLoadLocal(catch_block->exception_var()));
+      for_finally.PushArgument(exception);
+      Value* stacktrace = for_finally.Bind(
+          for_finally.BuildLoadLocal(catch_block->stacktrace_var()));
+      for_finally.PushArgument(stacktrace);
+      for_finally.AddInstruction(new ReThrowInstr(catch_block->token_pos()));
+      for_finally.CloseFragment();
+    }
+    ASSERT(!for_finally.is_open());
+
+    const Array& types = Array::ZoneHandle(Array::New(1, Heap::kOld));
+    types.SetAt(0, Type::Handle(Type::DynamicType()));
+    CatchBlockEntryInstr* finally_entry =
         new CatchBlockEntryInstr(owner()->AllocateBlockId(),
+                                 original_handler_index,
+                                 types,
                                  catch_handler_index,
-                                 catch_block->handler_types(),
-                                 try_handler_index);
-    owner()->AddCatchEntry(catch_entry);
-    ASSERT(!for_catch.is_open());
-    AppendFragment(catch_entry, for_catch);
-    if (node->end_catch_label() != NULL) {
-      JoinEntryInstr* join = node->end_catch_label()->join_for_continue();
-      if (join != NULL) {
-        if (is_open()) Goto(join);
-        exit_ = join;
-      }
-    }
-
-    if (finally_block != NULL) {
-      // Create a handler for the code in the catch block, containing the
-      // code in the finally block.
-      owner()->set_try_index(original_handler_index);
-      EffectGraphVisitor for_finally(owner(), temp_index());
-      for_finally.AddInstruction(
-          new CatchEntryInstr(catch_block->exception_var(),
-                              catch_block->stacktrace_var()));
-      for_finally.BuildRestoreContext(catch_block->context_var());
-
-      finally_block->Visit(&for_finally);
-      if (for_finally.is_open()) {
-        // Rethrow the exception.  Manually build the graph for rethrow.
-        Value* exception = for_finally.Bind(
-            for_finally.BuildLoadLocal(catch_block->exception_var()));
-        for_finally.PushArgument(exception);
-        Value* stacktrace = for_finally.Bind(
-            for_finally.BuildLoadLocal(catch_block->stacktrace_var()));
-        for_finally.PushArgument(stacktrace);
-        for_finally.AddInstruction(new ReThrowInstr(catch_block->token_pos()));
-        for_finally.CloseFragment();
-      }
-      ASSERT(!for_finally.is_open());
-
-      const Array& types = Array::ZoneHandle(Array::New(1, Heap::kOld));
-      types.SetAt(0, Type::Handle(Type::DynamicType()));
-      CatchBlockEntryInstr* finally_entry =
-          new CatchBlockEntryInstr(owner()->AllocateBlockId(),
-                                   original_handler_index,
-                                   types,
-                                   catch_handler_index);
-      owner()->AddCatchEntry(finally_entry);
-      AppendFragment(finally_entry, for_finally);
-    }
+                                 catch_block->exception_var(),
+                                 catch_block->stacktrace_var());
+    owner()->AddCatchEntry(finally_entry);
+    AppendFragment(finally_entry, for_finally);
   }
 
   // Generate code for the finally block if one exists.
@@ -3544,7 +3547,8 @@
     // We are about to generate code for an inlined finally block. Exceptions
     // thrown in this block of code should be treated as though they are
     // thrown not from the current try block but the outer try block if any.
-    owner()->set_try_index((try_index - 1));
+    intptr_t outer_try_index = node->try_index();
+    owner()->set_try_index(outer_try_index);
   }
   BuildRestoreContext(node->context_var());
 
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 4674a2a..9c6f259 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -124,9 +124,6 @@
   void DecrementLoopDepth() { --loop_depth_; }
   intptr_t loop_depth() const { return loop_depth_; }
 
-  // Each try in this function gets its own try index.
-  intptr_t AllocateTryIndex() { return ++last_used_try_index_; }
-
   // Manage the currently active try index.
   void set_try_index(intptr_t value) { try_index_ = value; }
   intptr_t try_index() const { return try_index_; }
@@ -171,7 +168,6 @@
 
   intptr_t last_used_block_id_;
   intptr_t context_level_;
-  intptr_t last_used_try_index_;
   intptr_t try_index_;
   intptr_t loop_depth_;
   GraphEntryInstr* graph_entry_;
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 8ee48ca..e9b2b37 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -241,6 +241,7 @@
   ~FlowGraphCompiler();
 
   static bool SupportsUnboxedMints();
+  static bool SupportsInlinedTrigonometrics();
 
   // Accessors.
   Assembler* assembler() const { return assembler_; }
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 28497ca..2dc5f64 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -7,7 +7,6 @@
 
 #include "vm/flow_graph_compiler.h"
 
-#include "lib/error.h"
 #include "vm/ast_printer.h"
 #include "vm/dart_entry.h"
 #include "vm/deopt_instructions.h"
@@ -44,6 +43,12 @@
 }
 
 
+// TODO(srdjan): Enable by calling C-functions.
+bool FlowGraphCompiler::SupportsInlinedTrigonometrics() {
+  return false;
+}
+
+
 RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder) {
   if (deopt_env_ == NULL) return DeoptInfo::null();
@@ -785,10 +790,9 @@
   }
 
   // Process locals. Skip exception_var and stacktrace_var.
-  CatchEntryInstr* catch_entry = catch_block->next()->AsCatchEntry();
   intptr_t local_base = kFirstLocalSlotFromFp + num_non_copied_params;
-  intptr_t ex_idx = local_base - catch_entry->exception_var().index();
-  intptr_t st_idx = local_base - catch_entry->stacktrace_var().index();
+  intptr_t ex_idx = local_base - catch_block->exception_var().index();
+  intptr_t st_idx = local_base - catch_block->stacktrace_var().index();
   for (; i < flow_graph().variable_count(); ++i) {
     if (i == ex_idx || i == st_idx) continue;
     if ((*idefs)[i]->IsConstant()) continue;
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 6857292..e2a7bc8 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -7,7 +7,6 @@
 
 #include "vm/flow_graph_compiler.h"
 
-#include "lib/error.h"
 #include "vm/ast_printer.h"
 #include "vm/dart_entry.h"
 #include "vm/deopt_instructions.h"
@@ -48,6 +47,11 @@
 }
 
 
+bool FlowGraphCompiler::SupportsInlinedTrigonometrics() {
+  return true;
+}
+
+
 RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder) {
   if (deopt_env_ == NULL) return DeoptInfo::null();
@@ -806,10 +810,9 @@
   }
 
   // Process locals. Skip exception_var and stacktrace_var.
-  CatchEntryInstr* catch_entry = catch_block->next()->AsCatchEntry();
   intptr_t local_base = kFirstLocalSlotFromFp + num_non_copied_params;
-  intptr_t ex_idx = local_base - catch_entry->exception_var().index();
-  intptr_t st_idx = local_base - catch_entry->stacktrace_var().index();
+  intptr_t ex_idx = local_base - catch_block->exception_var().index();
+  intptr_t st_idx = local_base - catch_block->stacktrace_var().index();
   for (; i < flow_graph().variable_count(); ++i) {
     if (i == ex_idx || i == st_idx) continue;
     if ((*idefs)[i]->IsConstant()) continue;
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index ea29621..98527cf 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -7,7 +7,6 @@
 
 #include "vm/flow_graph_compiler.h"
 
-#include "lib/error.h"
 #include "vm/ast_printer.h"
 #include "vm/dart_entry.h"
 #include "vm/deopt_instructions.h"
@@ -44,6 +43,12 @@
 }
 
 
+// TODO(srdjan): Enable by calling C-functions.
+bool FlowGraphCompiler::SupportsInlinedTrigonometrics() {
+  return false;
+}
+
+
 RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder) {
   if (deopt_env_ == NULL) return DeoptInfo::null();
@@ -812,10 +817,9 @@
   }
 
   // Process locals. Skip exception_var and stacktrace_var.
-  CatchEntryInstr* catch_entry = catch_block->next()->AsCatchEntry();
   intptr_t local_base = kFirstLocalSlotFromFp + num_non_copied_params;
-  intptr_t ex_idx = local_base - catch_entry->exception_var().index();
-  intptr_t st_idx = local_base - catch_entry->stacktrace_var().index();
+  intptr_t ex_idx = local_base - catch_block->exception_var().index();
+  intptr_t st_idx = local_base - catch_block->stacktrace_var().index();
   for (; i < flow_graph().variable_count(); ++i) {
     if (i == ex_idx || i == st_idx) continue;
     if ((*idefs)[i]->IsConstant()) continue;
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 00784c9..f07d491 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -7,7 +7,6 @@
 
 #include "vm/flow_graph_compiler.h"
 
-#include "lib/error.h"
 #include "vm/ast_printer.h"
 #include "vm/dart_entry.h"
 #include "vm/deopt_instructions.h"
@@ -45,6 +44,11 @@
 }
 
 
+bool FlowGraphCompiler::SupportsInlinedTrigonometrics() {
+  return true;
+}
+
+
 RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
                                                  DeoptInfoBuilder* builder) {
   if (deopt_env_ == NULL) return DeoptInfo::null();
@@ -799,10 +803,9 @@
   }
 
   // Process locals. Skip exception_var and stacktrace_var.
-  CatchEntryInstr* catch_entry = catch_block->next()->AsCatchEntry();
   intptr_t local_base = kFirstLocalSlotFromFp + num_non_copied_params;
-  intptr_t ex_idx = local_base - catch_entry->exception_var().index();
-  intptr_t st_idx = local_base - catch_entry->stacktrace_var().index();
+  intptr_t ex_idx = local_base - catch_block->exception_var().index();
+  intptr_t st_idx = local_base - catch_block->stacktrace_var().index();
   for (; i < flow_graph().variable_count(); ++i) {
     if (i == ex_idx || i == st_idx) continue;
     if ((*idefs)[i]->IsConstant()) continue;
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index fce131c..d1a8555 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -2627,14 +2627,20 @@
   }
 }
 
-
 void FlowGraphOptimizer::VisitStaticCall(StaticCallInstr* call) {
   MethodRecognizer::Kind recognized_kind =
       MethodRecognizer::RecognizeKind(call->function());
-  if (recognized_kind == MethodRecognizer::kMathSqrt) {
-    MathSqrtInstr* sqrt =
-        new MathSqrtInstr(new Value(call->ArgumentAt(0)), call->deopt_id());
-    ReplaceCall(call, sqrt);
+  if ((recognized_kind == MethodRecognizer::kMathSqrt) ||
+      (recognized_kind == MethodRecognizer::kMathSin) ||
+      (recognized_kind == MethodRecognizer::kMathCos)) {
+    if ((recognized_kind == MethodRecognizer::kMathSqrt) ||
+        FlowGraphCompiler::SupportsInlinedTrigonometrics()) {
+      MathUnaryInstr* math_unary =
+          new MathUnaryInstr(recognized_kind,
+                             new Value(call->ArgumentAt(0)),
+                             call->deopt_id());
+      ReplaceCall(call, math_unary);
+    }
   } else if ((recognized_kind == MethodRecognizer::kFloat32x4Zero) ||
              (recognized_kind == MethodRecognizer::kFloat32x4Splat) ||
              (recognized_kind == MethodRecognizer::kFloat32x4Constructor)) {
@@ -2874,6 +2880,8 @@
                                strict_kind,
                                compare->left()->CopyWithType(),
                                compare->right()->CopyWithType());
+    // Numbers override equality and are therefore not part of this conversion.
+    strict_comp->set_needs_number_check(false);
     current_instruction->ReplaceWith(strict_comp, current_iterator());
     return true;
   }
@@ -3623,15 +3631,14 @@
   for (intptr_t catch_idx = 0;
        catch_idx < catch_entries.length();
        ++catch_idx) {
-    CatchBlockEntryInstr* cb = catch_entries[catch_idx];
-    CatchEntryInstr* catch_entry = cb->next()->AsCatchEntry();
+    CatchBlockEntryInstr* catch_entry = catch_entries[catch_idx];
 
     // Initialize cdefs with the original initial definitions (ParameterInstr).
     // The following representation is used:
     // ParameterInstr => unknown
     // ConstantInstr => known constant
     // NULL => non-constant
-    GrowableArray<Definition*>* idefs = cb->initial_definitions();
+    GrowableArray<Definition*>* idefs = catch_entry->initial_definitions();
     GrowableArray<Definition*> cdefs(idefs->length());
     cdefs.AddArray(*idefs);
 
@@ -3644,7 +3651,7 @@
          !block_it.Done();
          block_it.Advance()) {
       BlockEntryInstr* block = block_it.Current();
-      if (block->try_index() == cb->catch_try_index()) {
+      if (block->try_index() == catch_entry->catch_try_index()) {
         for (ForwardInstructionIterator instr_it(block);
              !instr_it.Done();
              instr_it.Advance()) {
@@ -5718,9 +5725,6 @@
 void ConstantPropagator::VisitStoreContext(StoreContextInstr* instr) { }
 
 
-void ConstantPropagator::VisitCatchEntry(CatchEntryInstr* instr) { }
-
-
 void ConstantPropagator::VisitCheckStackOverflow(
     CheckStackOverflowInstr* instr) { }
 
@@ -6469,12 +6473,12 @@
 }
 
 
-void ConstantPropagator::VisitMathSqrt(MathSqrtInstr* instr) {
+void ConstantPropagator::VisitMathUnary(MathUnaryInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
   if (IsNonConstant(value)) {
     SetValue(instr, non_constant_);
   } else if (IsConstant(value)) {
-    // TODO(kmillikin): Handle sqrt.
+    // TODO(kmillikin): Handle Math's unary operations (sqrt, cos, sin).
     SetValue(instr, non_constant_);
   }
 }
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index e20774b..bbd7cd3 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -945,14 +945,23 @@
   }
 
   if (FLAG_enable_type_checks) {
+    ASSERT(!type().HasResolvedTypeClass() ||
+           !Field::IsExternalizableCid(Class::Handle(
+                type().type_class()).id()));
     return CompileType::FromAbstractType(type());
   }
 
-  if (field_ != NULL && (field_->guarded_cid() != kIllegalCid)) {
-    return CompileType::CreateNullable(field_->is_nullable(),
-                                       field_->guarded_cid());
+  if ((field_ != NULL) && (field_->guarded_cid() != kIllegalCid)) {
+    intptr_t field_cid =  field_->guarded_cid();
+    if (Field::IsExternalizableCid(field_cid)) {
+      // We cannot assume that the type of the value in the field has not
+      // changed on the fly.
+      field_cid = kDynamicCid;
+    }
+    return CompileType::CreateNullable(field_->is_nullable(), field_cid);
   }
 
+  ASSERT(!Field::IsExternalizableCid(result_cid_));
   return CompileType::FromCid(result_cid_);
 }
 
@@ -1122,7 +1131,7 @@
 }
 
 
-CompileType MathSqrtInstr::ComputeType() const {
+CompileType MathUnaryInstr::ComputeType() const {
   return CompileType::FromCid(kDoubleCid);
 }
 
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index e396518..02880071 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -578,13 +578,6 @@
 }
 
 
-void CatchEntryInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, %s",
-           exception_var().name().ToCString(),
-           stacktrace_var().name().ToCString());
-}
-
-
 void BinarySmiOpInstr::PrintTo(BufferFormatter* f) const {
   Definition::PrintTo(f);
   f->Print(" %co", overflow_ ? '+' : '-');
@@ -793,7 +786,7 @@
 void CheckClassInstr::PrintOperandsTo(BufferFormatter* f) const {
   value()->PrintTo(f);
   PrintICData(f, unary_checks());
-  if (null_check()) {
+  if (IsNullCheck()) {
     f->Print(" nullcheck");
   }
 }
@@ -821,7 +814,12 @@
 
 
 void JoinEntryInstr::PrintTo(BufferFormatter* f) const {
-  f->Print("B%"Pd"[join]:%"Pd" pred(", block_id(), GetDeoptId());
+  if (try_index() != CatchClauseNode::kInvalidTryIndex) {
+    f->Print("B%"Pd"[join try_idx %"Pd"]:%"Pd" pred(",
+             block_id(), try_index(), GetDeoptId());
+  } else {
+    f->Print("B%"Pd"[join]:%"Pd" pred(", block_id(), GetDeoptId());
+  }
   for (intptr_t i = 0; i < predecessors_.length(); ++i) {
     if (i > 0) f->Print(", ");
     f->Print("B%"Pd, predecessors_[i]->block_id());
@@ -877,7 +875,12 @@
 
 
 void TargetEntryInstr::PrintTo(BufferFormatter* f) const {
-  f->Print("B%"Pd"[target]:%"Pd, block_id(), GetDeoptId());
+  if (try_index() != CatchClauseNode::kInvalidTryIndex) {
+    f->Print("B%"Pd"[target try_idx %"Pd"]:%"Pd,
+             block_id(), try_index(), GetDeoptId());
+  } else {
+    f->Print("B%"Pd"[target]:%"Pd, block_id(), GetDeoptId());
+  }
   if (HasParallelMove()) {
     f->Print(" ");
     parallel_move()->PrintTo(f);
@@ -886,9 +889,10 @@
 
 
 void CatchBlockEntryInstr::PrintTo(BufferFormatter* f) const {
-  f->Print("B%"Pd"[target catch %"Pd"]", block_id(), catch_try_index());
+  f->Print("B%"Pd"[target catch try_idx %"Pd" catch_try_idx %"Pd"]",
+           block_id(), try_index(), catch_try_index());
   if (HasParallelMove()) {
-    f->Print(" ");
+    f->Print("\n");
     parallel_move()->PrintTo(f);
   }
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 7db5a64..2fdb792 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -86,8 +86,7 @@
 CheckClassInstr::CheckClassInstr(Value* value,
                                  intptr_t deopt_id,
                                  const ICData& unary_checks)
-    : unary_checks_(unary_checks),
-      null_check_(false) {
+    : unary_checks_(unary_checks) {
   ASSERT(unary_checks.IsZoneHandle());
   // Expected useful check data.
   ASSERT(!unary_checks_.IsNull());
@@ -128,6 +127,18 @@
 }
 
 
+bool CheckClassInstr::IsNullCheck() const {
+  if (unary_checks().NumberOfChecks() != 1) {
+    return false;
+  }
+  CompileType* in_type = value()->Type();
+  const intptr_t cid = unary_checks().GetCidAt(0);
+  // Performance check: use CheckSmiInstr instead.
+  ASSERT(cid != kSmiCid);
+  return in_type->is_nullable() && (in_type->ToNullableCid() == cid);
+}
+
+
 bool GuardFieldInstr::AttributesEqual(Instruction* other) const {
   return field().raw() == other->AsGuardField()->field().raw();
 }
@@ -1592,24 +1603,6 @@
 }
 
 
-LocationSummary* CatchBlockEntryInstr::MakeLocationSummary() const {
-  UNREACHABLE();
-  return NULL;
-}
-
-
-void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ Bind(compiler->GetJumpLabel(this));
-  compiler->AddExceptionHandler(catch_try_index(),
-                                try_index(),
-                                compiler->assembler()->CodeSize(),
-                                catch_handler_types_);
-  if (HasParallelMove()) {
-    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
-  }
-}
-
-
 LocationSummary* PhiInstr::MakeLocationSummary() const {
   UNREACHABLE();
   return NULL;
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index df369bf..b2325aff 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -80,6 +80,8 @@
   V(_Double, pow, DoublePow, 102305574)                                        \
   V(_Double, _modulo, DoubleMod, 663439671)                                    \
   V(::, sqrt, MathSqrt, 1662640002)                                            \
+  V(::, sin, MathSin, 1273932041)                                              \
+  V(::, cos, MathCos, 1749547468)                                              \
   V(::, min, MathMin, 269896129)                                               \
   V(::, max, MathMax, 1286442186)                                              \
   V(Float32x4, Float32x4., Float32x4Constructor, 1492157358)                   \
@@ -575,7 +577,6 @@
   M(ExtractConstructorInstantiator)                                            \
   M(AllocateContext)                                                           \
   M(CloneContext)                                                              \
-  M(CatchEntry)                                                                \
   M(BinarySmiOp)                                                               \
   M(UnarySmiOp)                                                                \
   M(CheckStackOverflow)                                                        \
@@ -588,7 +589,7 @@
   M(Constant)                                                                  \
   M(CheckEitherNonSmi)                                                         \
   M(BinaryDoubleOp)                                                            \
-  M(MathSqrt)                                                                  \
+  M(MathUnary)                                                                 \
   M(MathMinMax)                                                                \
   M(UnboxDouble)                                                               \
   M(BoxDouble)                                                                 \
@@ -919,7 +920,7 @@
   friend class UnarySmiOpInstr;
   friend class ShiftMintOpInstr;
   friend class UnaryMintOpInstr;
-  friend class MathSqrtInstr;
+  friend class MathUnaryInstr;
   friend class MathMinMaxInstr;
   friend class CheckClassInstr;
   friend class GuardFieldInstr;
@@ -1487,11 +1488,15 @@
   CatchBlockEntryInstr(intptr_t block_id,
                        intptr_t try_index,
                        const Array& handler_types,
-                       intptr_t catch_try_index)
+                       intptr_t catch_try_index,
+                       const LocalVariable& exception_var,
+                       const LocalVariable& stacktrace_var)
       : BlockEntryInstr(block_id, try_index),
         predecessor_(NULL),
         catch_handler_types_(Array::ZoneHandle(handler_types.raw())),
-        catch_try_index_(catch_try_index) { }
+        catch_try_index_(catch_try_index),
+        exception_var_(exception_var),
+        stacktrace_var_(stacktrace_var) { }
 
   DECLARE_INSTRUCTION(CatchBlockEntry)
 
@@ -1503,6 +1508,9 @@
     return predecessor_;
   }
 
+  const LocalVariable& exception_var() const { return exception_var_; }
+  const LocalVariable& stacktrace_var() const { return stacktrace_var_; }
+
   // Returns try index for the try block to which this catch handler
   // corresponds.
   intptr_t catch_try_index() const {
@@ -1527,6 +1535,8 @@
   const Array& catch_handler_types_;
   const intptr_t catch_try_index_;
   GrowableArray<Definition*> initial_definitions_;
+  const LocalVariable& exception_var_;
+  const LocalVariable& stacktrace_var_;
 
   DISALLOW_COPY_AND_ASSIGN(CatchBlockEntryInstr);
 };
@@ -3278,6 +3288,10 @@
     return ast_node_.native_c_function();
   }
 
+  bool is_bootstrap_native() const {
+    return ast_node_.is_bootstrap_native();
+  }
+
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
   virtual bool CanDeoptimize() const { return false; }
@@ -4289,35 +4303,6 @@
 };
 
 
-class CatchEntryInstr : public TemplateInstruction<0> {
- public:
-  CatchEntryInstr(const LocalVariable& exception_var,
-                  const LocalVariable& stacktrace_var)
-      : exception_var_(exception_var), stacktrace_var_(stacktrace_var) {}
-
-  const LocalVariable& exception_var() const { return exception_var_; }
-  const LocalVariable& stacktrace_var() const { return stacktrace_var_; }
-
-  DECLARE_INSTRUCTION(CatchEntry)
-
-  virtual intptr_t ArgumentCount() const { return 0; }
-
-  virtual void PrintOperandsTo(BufferFormatter* f) const;
-
-  virtual bool CanDeoptimize() const { return false; }
-
-  virtual EffectSet Effects() const { return EffectSet::All(); }
-
-  virtual bool MayThrow() const { return false; }
-
- private:
-  const LocalVariable& exception_var_;
-  const LocalVariable& stacktrace_var_;
-
-  DISALLOW_COPY_AND_ASSIGN(CatchEntryInstr);
-};
-
-
 class CheckEitherNonSmiInstr : public TemplateInstruction<2> {
  public:
   CheckEitherNonSmiInstr(Value* left,
@@ -4607,15 +4592,18 @@
 };
 
 
-class MathSqrtInstr : public TemplateDefinition<1> {
+class MathUnaryInstr : public TemplateDefinition<1> {
  public:
-  MathSqrtInstr(Value* value, intptr_t deopt_id) {
+  MathUnaryInstr(MethodRecognizer::Kind kind, Value* value, intptr_t deopt_id)
+      : kind_(kind) {
     SetInputAt(0, value);
     deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
 
+  MethodRecognizer::Kind kind() const { return kind_; }
+
   virtual bool CanDeoptimize() const { return false; }
 
   virtual Representation representation() const {
@@ -4633,7 +4621,7 @@
     return deopt_id_;
   }
 
-  DECLARE_INSTRUCTION(MathSqrt)
+  DECLARE_INSTRUCTION(MathUnary)
   virtual CompileType ComputeType() const;
 
   virtual bool AllowsCSE() const { return true; }
@@ -4644,7 +4632,9 @@
   virtual bool MayThrow() const { return false; }
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(MathSqrtInstr);
+  const MethodRecognizer::Kind kind_;
+
+  DISALLOW_COPY_AND_ASSIGN(MathUnaryInstr);
 };
 
 
@@ -6319,9 +6309,7 @@
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
-  void set_null_check(bool flag) { null_check_ = flag; }
-
-  bool null_check() const { return null_check_; }
+  bool IsNullCheck() const;
 
   virtual bool AllowsCSE() const { return true; }
   virtual EffectSet Effects() const { return EffectSet::None(); }
@@ -6333,8 +6321,6 @@
  private:
   const ICData& unary_checks_;
 
-  bool null_check_;
-
   DISALLOW_COPY_AND_ASSIGN(CheckClassInstr);
 };
 
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index dd22a39..ffa5755 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -7,7 +7,6 @@
 
 #include "vm/intermediate_language.h"
 
-#include "lib/error.h"
 #include "vm/dart_entry.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
@@ -1000,15 +999,23 @@
   // this is a redirection address that forces the simulator to call
   // into the runtime system.
   uword entry = reinterpret_cast<uword>(native_c_function());
+  const ExternalLabel* stub_entry;
+  if (is_bootstrap_native()) {
+    stub_entry = &StubCode::CallBootstrapCFunctionLabel();
 #if defined(USING_SIMULATOR)
-  entry = Simulator::RedirectExternalReference(entry,
-                                               Simulator::kNativeCall,
-                                               function().NumParameters());
+    entry = Simulator::RedirectExternalReference(
+        entry, Simulator::kBootstrapNativeCall, function().NumParameters());
 #endif
+  } else {
+    // In the case of non bootstrap native methods the CallNativeCFunction
+    // stub generates the redirection address when running under the simulator
+    // and hence we do not change 'entry' here.
+    stub_entry = &StubCode::CallNativeCFunctionLabel();
+  }
   __ LoadImmediate(R5, entry);
   __ LoadImmediate(R1, NativeArguments::ComputeArgcTag(function()));
   compiler->GenerateCall(token_pos(),
-                         &StubCode::CallNativeCFunctionLabel(),
+                         stub_entry,
                          PcDescriptors::kOther,
                          locs());
   __ Pop(result);
@@ -2036,16 +2043,26 @@
 }
 
 
-LocationSummary* CatchEntryInstr::MakeLocationSummary() const {
-  return LocationSummary::Make(0,
-                               Location::NoLocation(),
-                               LocationSummary::kNoCall);
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary() const {
+  UNREACHABLE();
+  return NULL;
 }
 
 
-// Restore stack and initialize the two exception variables:
-// exception and stack trace variables.
-void CatchEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  __ Bind(compiler->GetJumpLabel(this));
+  compiler->AddExceptionHandler(catch_try_index(),
+                                try_index(),
+                                compiler->assembler()->CodeSize(),
+                                catch_handler_types_);
+
+  // Restore the pool pointer.
+  __ LoadPoolPointer();
+
+  if (HasParallelMove()) {
+    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
+  }
+
   // Restore SP from FP as we are coming from a throw and the code for
   // popping arguments has not been run.
   const intptr_t fp_sp_dist =
@@ -2053,15 +2070,12 @@
   ASSERT(fp_sp_dist <= 0);
   __ AddImmediate(SP, FP, fp_sp_dist);
 
-  ASSERT(!exception_var().is_captured());
-  ASSERT(!stacktrace_var().is_captured());
+  // Restore stack and initialize the two exception variables:
+  // exception and stack trace variables.
   __ StoreToOffset(kWord, kExceptionObjectReg,
                    FP, exception_var().index() * kWordSize);
   __ StoreToOffset(kWord, kStackTraceObjectReg,
                    FP, stacktrace_var().index() * kWordSize);
-
-  // Restore the pool pointer.
-  __ LoadPoolPointer();
 }
 
 
@@ -3623,7 +3637,7 @@
 }
 
 
-LocationSummary* MathSqrtInstr::MakeLocationSummary() const {
+LocationSummary* MathUnaryInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary =
@@ -3634,10 +3648,14 @@
 }
 
 
-void MathSqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  DRegister val = EvenDRegisterOf(locs()->in(0).fpu_reg());
-  DRegister result = EvenDRegisterOf(locs()->out().fpu_reg());
-  __ vsqrtd(result, val);
+void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (kind() == MethodRecognizer::kMathSqrt) {
+    DRegister val = EvenDRegisterOf(locs()->in(0).fpu_reg());
+    DRegister result = EvenDRegisterOf(locs()->out().fpu_reg());
+    __ vsqrtd(result, val);
+  } else {
+    UNIMPLEMENTED();
+  }
 }
 
 
@@ -3997,7 +4015,7 @@
   LocationSummary* summary =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  if (!null_check()) {
+  if (!IsNullCheck()) {
     summary->AddTemp(Location::RequiresRegister());
   }
   return summary;
@@ -4005,7 +4023,7 @@
 
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if (null_check()) {
+  if (IsNullCheck()) {
     Label* deopt = compiler->AddDeoptStub(deopt_id(),
                                           kDeoptCheckClass);
     __ CompareImmediate(locs()->in(0).reg(),
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index c196ff5..6a90823 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -7,7 +7,6 @@
 
 #include "vm/intermediate_language.h"
 
-#include "lib/error.h"
 #include "vm/dart_entry.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
@@ -1071,8 +1070,11 @@
   }
   __ movl(ECX, Immediate(reinterpret_cast<uword>(native_c_function())));
   __ movl(EDX, Immediate(NativeArguments::ComputeArgcTag(function())));
+  const ExternalLabel* stub_entry =
+      (is_bootstrap_native()) ? &StubCode::CallBootstrapCFunctionLabel() :
+                                &StubCode::CallNativeCFunctionLabel();
   compiler->GenerateCall(token_pos(),
-                         &StubCode::CallNativeCFunctionLabel(),
+                         stub_entry,
                          PcDescriptors::kOther,
                          locs());
   __ popl(result);
@@ -2100,16 +2102,22 @@
 }
 
 
-LocationSummary* CatchEntryInstr::MakeLocationSummary() const {
-  return LocationSummary::Make(0,
-                               Location::NoLocation(),
-                               LocationSummary::kNoCall);
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary() const {
+  UNREACHABLE();
+  return NULL;
 }
 
 
-// Restore stack and initialize the two exception variables:
-// exception and stack trace variables.
-void CatchEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  __ Bind(compiler->GetJumpLabel(this));
+  compiler->AddExceptionHandler(catch_try_index(),
+                                try_index(),
+                                compiler->assembler()->CodeSize(),
+                                catch_handler_types_);
+  if (HasParallelMove()) {
+    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
+  }
+
   // Restore ESP from EBP as we are coming from a throw and the code for
   // popping arguments has not been run.
   const intptr_t fp_sp_dist =
@@ -2117,8 +2125,8 @@
   ASSERT(fp_sp_dist <= 0);
   __ leal(ESP, Address(EBP, fp_sp_dist));
 
-  ASSERT(!exception_var().is_captured());
-  ASSERT(!stacktrace_var().is_captured());
+  // Restore stack and initialize the two exception variables:
+  // exception and stack trace variables.
   __ movl(Address(EBP, exception_var().index() * kWordSize),
           kExceptionObjectReg);
   __ movl(Address(EBP, stacktrace_var().index() * kWordSize),
@@ -3684,7 +3692,7 @@
 }
 
 
-LocationSummary* MathSqrtInstr::MakeLocationSummary() const {
+LocationSummary* MathUnaryInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary =
@@ -3695,8 +3703,27 @@
 }
 
 
-void MathSqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ sqrtsd(locs()->out().fpu_reg(), locs()->in(0).fpu_reg());
+void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (kind() == MethodRecognizer::kMathSqrt) {
+    __ sqrtsd(locs()->out().fpu_reg(), locs()->in(0).fpu_reg());
+  } else if ((kind() == MethodRecognizer::kMathCos) ||
+             (kind() == MethodRecognizer::kMathSin)) {
+    __ pushl(EAX);
+    __ pushl(EAX);
+    __ movsd(Address(ESP, 0), locs()->in(0).fpu_reg());
+    __ fldl(Address(ESP, 0));
+    if (kind() == MethodRecognizer::kMathSin) {
+      __ fsin();
+    } else {
+      ASSERT(kind() == MethodRecognizer::kMathCos);
+      __ fcos();
+    }
+    __ fstpl(Address(ESP, 0));
+    __ movsd(locs()->out().fpu_reg(), Address(ESP, 0));
+    __ addl(ESP, Immediate(2 * kWordSize));
+  } else {
+    UNREACHABLE();
+  }
 }
 
 
@@ -4032,7 +4059,7 @@
   LocationSummary* summary =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  if (!null_check()) {
+  if (!IsNullCheck()) {
     summary->AddTemp(Location::RequiresRegister());
   }
   return summary;
@@ -4040,7 +4067,7 @@
 
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if (null_check()) {
+  if (IsNullCheck()) {
     Label* deopt = compiler->AddDeoptStub(deopt_id(),
                                           kDeoptCheckClass);
     const Immediate& raw_null =
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 7051056..6740dbb 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -7,7 +7,6 @@
 
 #include "vm/intermediate_language.h"
 
-#include "lib/error.h"
 #include "vm/dart_entry.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
@@ -1056,15 +1055,23 @@
   // this is a redirection address that forces the simulator to call
   // into the runtime system.
   uword entry = reinterpret_cast<uword>(native_c_function());
+  const ExternalLabel* stub_entry;
+  if (is_bootstrap_native()) {
+    stub_entry = &StubCode::CallBootstrapCFunctionLabel();
 #if defined(USING_SIMULATOR)
-  entry = Simulator::RedirectExternalReference(entry,
-                                               Simulator::kNativeCall,
-                                               function().NumParameters());
+    entry = Simulator::RedirectExternalReference(
+        entry, Simulator::kBootstrapNativeCall, function().NumParameters());
 #endif
+  } else {
+    // In the case of non bootstrap native methods the CallNativeCFunction
+    // stub generates the redirection address when running under the simulator
+    // and hence we do not change 'entry' here.
+    stub_entry = &StubCode::CallNativeCFunctionLabel();
+  }
   __ LoadImmediate(T5, entry);
   __ LoadImmediate(A1, NativeArguments::ComputeArgcTag(function()));
   compiler->GenerateCall(token_pos(),
-                         &StubCode::CallNativeCFunctionLabel(),
+                         stub_entry,
                          PcDescriptors::kOther,
                          locs());
   __ Pop(result);
@@ -2119,16 +2126,29 @@
 }
 
 
-LocationSummary* CatchEntryInstr::MakeLocationSummary() const {
-  return LocationSummary::Make(0,
-                               Location::NoLocation(),
-                               LocationSummary::kNoCall);
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary() const {
+  UNREACHABLE();
+  return NULL;
 }
 
 
-// Restore stack and initialize the two exception variables:
-// exception and stack trace variables.
-void CatchEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  __ Bind(compiler->GetJumpLabel(this));
+  compiler->AddExceptionHandler(catch_try_index(),
+                                try_index(),
+                                compiler->assembler()->CodeSize(),
+                                catch_handler_types_);
+  // Restore pool pointer.
+  __ GetNextPC(CMPRES, TMP);
+  const intptr_t object_pool_pc_dist =
+     Instructions::HeaderSize() - Instructions::object_pool_offset() +
+     compiler->assembler()->CodeSize() - 1 * Instr::kInstrSize;
+  __ LoadFromOffset(PP, CMPRES, -object_pool_pc_dist);
+
+  if (HasParallelMove()) {
+    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
+  }
+
   // Restore SP from FP as we are coming from a throw and the code for
   // popping arguments has not been run.
   const intptr_t fp_sp_dist =
@@ -2136,22 +2156,12 @@
   ASSERT(fp_sp_dist <= 0);
   __ AddImmediate(SP, FP, fp_sp_dist);
 
-  ASSERT(!exception_var().is_captured());
-  ASSERT(!stacktrace_var().is_captured());
-
+  // Restore stack and initialize the two exception variables:
+  // exception and stack trace variables.
   __ sw(kExceptionObjectReg,
         Address(FP, exception_var().index() * kWordSize));
   __ sw(kStackTraceObjectReg,
         Address(FP, stacktrace_var().index() * kWordSize));
-
-  __ GetNextPC(CMPRES, TMP);
-
-  // Calculate offset of pool pointer from the PC.
-  const intptr_t object_pool_pc_dist =
-     Instructions::HeaderSize() - Instructions::object_pool_offset() +
-     compiler->assembler()->CodeSize() - 1 * Instr::kInstrSize;
-
-  __ LoadFromOffset(PP, CMPRES, -object_pool_pc_dist);
 }
 
 
@@ -3075,7 +3085,7 @@
 }
 
 
-LocationSummary* MathSqrtInstr::MakeLocationSummary() const {
+LocationSummary* MathUnaryInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary =
@@ -3086,8 +3096,12 @@
 }
 
 
-void MathSqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ sqrtd(locs()->out().fpu_reg(), locs()->in(0).fpu_reg());
+void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (kind() == MethodRecognizer::kMathSqrt) {
+    __ sqrtd(locs()->out().fpu_reg(), locs()->in(0).fpu_reg());
+  } else {
+    UNIMPLEMENTED();
+  }
 }
 
 
@@ -3412,7 +3426,7 @@
   LocationSummary* summary =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  if (!null_check()) {
+  if (!IsNullCheck()) {
     summary->AddTemp(Location::RequiresRegister());
   }
   return summary;
@@ -3420,7 +3434,7 @@
 
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if (null_check()) {
+  if (IsNullCheck()) {
     Label* deopt = compiler->AddDeoptStub(deopt_id(),
                                           kDeoptCheckClass);
     __ BranchEqual(locs()->in(0).reg(),
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index f839f76..a7303de 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -7,7 +7,6 @@
 
 #include "vm/intermediate_language.h"
 
-#include "lib/error.h"
 #include "vm/dart_entry.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
@@ -1069,8 +1068,11 @@
   }
   __ movq(RBX, Immediate(reinterpret_cast<uword>(native_c_function())));
   __ movq(R10, Immediate(NativeArguments::ComputeArgcTag(function())));
+  const ExternalLabel* stub_entry =
+      (is_bootstrap_native()) ? &StubCode::CallBootstrapCFunctionLabel() :
+                                &StubCode::CallNativeCFunctionLabel();
   compiler->GenerateCall(token_pos(),
-                         &StubCode::CallNativeCFunctionLabel(),
+                         stub_entry,
                          PcDescriptors::kOther,
                          locs());
   __ popq(result);
@@ -2055,16 +2057,22 @@
 }
 
 
-LocationSummary* CatchEntryInstr::MakeLocationSummary() const {
-  return LocationSummary::Make(0,
-                               Location::NoLocation(),
-                               LocationSummary::kNoCall);
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary() const {
+  UNREACHABLE();
+  return NULL;
 }
 
 
-// Restore stack and initialize the two exception variables:
-// exception and stack trace variables.
-void CatchEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  __ Bind(compiler->GetJumpLabel(this));
+  compiler->AddExceptionHandler(catch_try_index(),
+                                try_index(),
+                                compiler->assembler()->CodeSize(),
+                                catch_handler_types_);
+  if (HasParallelMove()) {
+    compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
+  }
+
   // Restore RSP from RBP as we are coming from a throw and the code for
   // popping arguments has not been run.
   const intptr_t fp_sp_dist =
@@ -2072,8 +2080,8 @@
   ASSERT(fp_sp_dist <= 0);
   __ leaq(RSP, Address(RBP, fp_sp_dist));
 
-  ASSERT(!exception_var().is_captured());
-  ASSERT(!stacktrace_var().is_captured());
+  // Restore stack and initialize the two exception variables:
+  // exception and stack trace variables.
   __ movq(Address(RBP, exception_var().index() * kWordSize),
           kExceptionObjectReg);
   __ movq(Address(RBP, stacktrace_var().index() * kWordSize),
@@ -3725,7 +3733,7 @@
 }
 
 
-LocationSummary* MathSqrtInstr::MakeLocationSummary() const {
+LocationSummary* MathUnaryInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary =
@@ -3736,8 +3744,27 @@
 }
 
 
-void MathSqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ sqrtsd(locs()->out().fpu_reg(), locs()->in(0).fpu_reg());
+void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (kind() == MethodRecognizer::kMathSqrt) {
+    __ sqrtsd(locs()->out().fpu_reg(), locs()->in(0).fpu_reg());
+  } else if ((kind() == MethodRecognizer::kMathCos) ||
+             (kind() == MethodRecognizer::kMathSin)) {
+    __ pushq(RAX);
+    __ movsd(Address(RSP, 0), locs()->in(0).fpu_reg());
+    __ fldl(Address(RSP, 0));
+    if (kind() == MethodRecognizer::kMathSin) {
+      __ fsin();
+    } else {
+      ASSERT(kind() == MethodRecognizer::kMathCos);
+      __ fcos();
+    }
+    __ fstpl(Address(RSP, 0));
+    __ movsd(locs()->out().fpu_reg(), Address(RSP, 0));
+    __ addq(RSP, Immediate(kWordSize));
+    return;
+  } else {
+    UNREACHABLE();
+  }
 }
 
 
@@ -4098,7 +4125,7 @@
   LocationSummary* summary =
       new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  if (!null_check()) {
+  if (!IsNullCheck()) {
     summary->AddTemp(Location::RequiresRegister());
   }
   return summary;
@@ -4106,7 +4133,7 @@
 
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if (null_check()) {
+  if (IsNullCheck()) {
     Label* deopt = compiler->AddDeoptStub(deopt_id(),
                                           kDeoptCheckClass);
     const Immediate& raw_null =
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index c2b4bfe..337b377 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -124,8 +124,8 @@
   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) {
+  // when Smi > 32 bits if we are looking for javascript integer overflow.
+  if (!FLAG_throw_on_javascript_int_overflow || (Smi::kBits < 32)) {
     CORE_INTEGER_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
   }
 
@@ -159,7 +159,7 @@
 
   if (lib.raw() == Library::CoreLibrary()) {
     CORE_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
-    if (!FLAG_throw_on_javascript_int_overflow) {
+    if (!FLAG_throw_on_javascript_int_overflow || (Smi::kBits < 32)) {
       CORE_INTEGER_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
     }
   } else if (lib.raw() == Library::TypedDataLibrary()) {
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index 9682004..fd16073 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -98,7 +98,7 @@
   V(::, sqrt, Math_sqrt, 1662640002)                                           \
   V(::, sin, Math_sin, 1273932041)                                             \
   V(::, cos, Math_cos, 1749547468)                                             \
-  V(_Random, _nextState, Random_nextState, 287494804)                          \
+  V(_Random, _nextState, Random_nextState, 776416255)                          \
 
 
 #define TYPED_DATA_LIB_INTRINSIC_LIST(V)                                       \
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index e7b375d..e79e89e 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -403,7 +403,6 @@
       message_handler_(NULL),
       spawn_data_(0),
       is_runnable_(false),
-      running_state_(kIsolateWaiting),
       gc_prologue_callbacks_(),
       gc_epilogue_callbacks_(),
       defer_finalization_count_(0),
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index b8eb6c2..2fc17d1 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -379,11 +379,6 @@
         kVmStatusInterrupt,
   };
 
-  enum IsolateRunState {
-    kIsolateWaiting = 0,      // The isolate is waiting for code to execute.
-    kIsolateRunning,          // The isolate is executing code.
-  };
-
   void ScheduleInterrupts(uword interrupt_bits);
   uword GetAndClearInterrupts();
 
@@ -396,9 +391,6 @@
   bool is_runnable() const { return is_runnable_; }
   void set_is_runnable(bool value) { is_runnable_ = value; }
 
-  IsolateRunState running_state() const { return running_state_; }
-  void set_running_state(IsolateRunState value) { running_state_ = value; }
-
   uword spawn_data() const { return spawn_data_; }
   void set_spawn_data(uword value) { spawn_data_ = value; }
 
@@ -673,7 +665,6 @@
   MessageHandler* message_handler_;
   uword spawn_data_;
   bool is_runnable_;
-  IsolateRunState running_state_;
   GcPrologueCallbacks gc_prologue_callbacks_;
   GcEpilogueCallbacks gc_epilogue_callbacks_;
   intptr_t defer_finalization_count_;
@@ -883,29 +874,6 @@
   char* exception_callback_name_;
 };
 
-
-class IsolateRunStateManager : public StackResource {
- public:
-  explicit IsolateRunStateManager()
-      : StackResource(Isolate::Current()),
-        saved_state_(Isolate::kIsolateWaiting) {
-    saved_state_ = reinterpret_cast<Isolate*>(isolate())->running_state();
-  }
-
-  virtual ~IsolateRunStateManager() {
-    reinterpret_cast<Isolate*>(isolate())->set_running_state(saved_state_);
-  }
-
-  void SetRunState(Isolate::IsolateRunState run_state) {
-    reinterpret_cast<Isolate*>(isolate())->set_running_state(run_state);
-  }
-
- private:
-  Isolate::IsolateRunState saved_state_;
-
-  DISALLOW_COPY_AND_ASSIGN(IsolateRunStateManager);
-};
-
 }  // namespace dart
 
 #endif  // VM_ISOLATE_H_
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index 045fced..1aec0bc 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -13,6 +13,11 @@
   ASSERT(buffer != NULL);
   buffer_ = buffer;
   open_objects_ = 0;
+  arguments_ = NULL;
+  num_arguments_ = 0;
+  option_keys_ = NULL;
+  option_values_ = NULL;
+  num_options_ = 0;
 }
 
 
@@ -80,7 +85,9 @@
 
 void JSONStream::PrintValue(const char* s) {
   PrintCommaIfNeeded();
-  buffer_->Printf("\"%s\"", s);
+  buffer_->AddChar('"');
+  buffer_->AddEscapedString(s);
+  buffer_->AddChar('"');
 }
 
 
@@ -96,7 +103,9 @@
   intptr_t len2 = OS::VSNPrint(p, len+1, format, args);
   va_end(args);
   ASSERT(len == len2);
-  buffer_->Printf("\"%s\"", p);
+  buffer_->AddChar('"');
+  buffer_->AddEscapedString(p);
+  buffer_->AddChar('"');
   free(p);
 }
 
@@ -142,11 +151,28 @@
   intptr_t len2 = OS::VSNPrint(p, len+1, format, args);
   va_end(args);
   ASSERT(len == len2);
-  buffer_->Printf("\"%s\"", p);
+  buffer_->AddChar('"');
+  buffer_->AddEscapedString(p);
+  buffer_->AddChar('"');
   free(p);
 }
 
 
+void JSONStream::SetArguments(const char** arguments, intptr_t num_arguments) {
+  arguments_ = arguments;
+  num_arguments_ = num_arguments;
+}
+
+
+void JSONStream::SetOptions(const char** option_keys,
+                            const char** option_values,
+                            intptr_t num_options) {
+  option_keys_ = option_keys;
+  option_values_ = option_values;
+  num_options_ = num_options;
+}
+
+
 void JSONStream::PrintProperty(const char* name, const Object& o, bool ref) {
   PrintPropertyName(name);
   PrintValue(o, ref);
@@ -156,7 +182,10 @@
 void JSONStream::PrintPropertyName(const char* name) {
   ASSERT(name != NULL);
   PrintCommaIfNeeded();
-  buffer_->Printf("\"%s\":", name);
+  buffer_->AddChar('"');
+  buffer_->AddEscapedString(name);
+  buffer_->AddChar('"');
+  buffer_->AddChar(':');
 }
 
 
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index 8afea7a..79b1c69 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -39,12 +39,33 @@
       PRINTF_ATTRIBUTE(3, 4);
   void PrintProperty(const char* name, const Object& o, bool ref = true);
 
+  void SetArguments(const char** arguments, intptr_t num_arguments);
+  void SetOptions(const char** option_keys, const char** option_values,
+                  intptr_t num_options);
+
+  intptr_t num_arguments() const { return num_arguments_; }
+  const char* GetArgument(intptr_t i) const {
+    return arguments_[i];
+  }
+  intptr_t num_options() const { return num_options_; }
+  const char* GetOptionKey(intptr_t i) const {
+    return option_keys_[i];
+  }
+  const char* GetOptionValue(intptr_t i) const {
+    return option_values_[i];
+  }
+
  private:
   void PrintPropertyName(const char* name);
   void PrintCommaIfNeeded();
   bool NeedComma();
   intptr_t open_objects_;
   TextBuffer* buffer_;
+  const char** arguments_;
+  intptr_t num_arguments_;
+  const char** option_keys_;
+  const char** option_values_;
+  intptr_t num_options_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/json_test.cc b/runtime/vm/json_test.cc
index 39a8eee..bdbfc26 100644
--- a/runtime/vm/json_test.cc
+++ b/runtime/vm/json_test.cc
@@ -251,5 +251,12 @@
                tb.buf());
 }
 
+TEST_CASE(JSON_JSONStream_EscapedString) {
+  TextBuffer tb(256);
+  JSONStream js(&tb);
+  js.PrintValue("Hel\"\"lo\r\n\t");
+  EXPECT_STREQ("\"Hel\\\"\\\"lo\\r\\n\\t\"", tb.buf());
+}
+
 
 }  // namespace dart
diff --git a/runtime/vm/mirrors_api_impl.cc b/runtime/vm/mirrors_api_impl.cc
index 21c690f..e463b20 100644
--- a/runtime/vm/mirrors_api_impl.cc
+++ b/runtime/vm/mirrors_api_impl.cc
@@ -19,32 +19,6 @@
 
 namespace dart {
 
-// When we want to return a handle to a type to the user, we handle
-// class-types differently than some other types.
-static Dart_Handle TypeToHandle(Isolate* isolate,
-                                const char* function_name,
-                                const AbstractType& type) {
-  if (type.IsMalformed()) {
-    const Error& error = Error::Handle(type.malformed_error());
-    return Api::NewError("%s: malformed type encountered: %s.",
-        function_name, error.ToErrorCString());
-  } else if (type.HasResolvedTypeClass()) {
-    const Class& cls = Class::Handle(isolate, type.type_class());
-#if defined(DEBUG)
-    const Library& lib = Library::Handle(cls.library());
-    if (lib.IsNull()) {
-      ASSERT(cls.IsDynamicClass() || cls.IsVoidClass());
-    }
-#endif
-    return Api::NewHandle(isolate, cls.raw());
-  } else if (type.IsTypeParameter()) {
-    return Api::NewHandle(isolate, type.raw());
-  } else {
-    return Api::NewError("%s: unexpected type '%s' encountered.",
-                         function_name, type.ToCString());
-  }
-}
-
 
 // --- Classes and Interfaces Reflection ---
 
@@ -61,159 +35,6 @@
   }
 }
 
-
-DART_EXPORT Dart_Handle Dart_ClassGetLibrary(Dart_Handle object) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
-  if (!obj.IsType() && !obj.IsClass()) {
-    RETURN_TYPE_ERROR(isolate, object, Class/Type);
-  }
-  const Class& cls = (obj.IsType()) ?
-      Class::Handle(Type::Cast(obj).type_class()) : Class::Cast(obj);
-
-#if defined(DEBUG)
-  const Library& lib = Library::Handle(cls.library());
-  if (lib.IsNull()) {
-    // ASSERT(cls.IsDynamicClass() || cls.IsVoidClass());
-    if (!cls.IsDynamicClass() && !cls.IsVoidClass()) {
-      fprintf(stderr, "NO LIBRARY: %s\n", cls.ToCString());
-    }
-  }
-#endif
-
-  return Api::NewHandle(isolate, cls.library());
-}
-
-
-DART_EXPORT Dart_Handle Dart_ClassGetInterfaceCount(Dart_Handle object,
-                                                    intptr_t* count) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
-  if (!obj.IsType() && !obj.IsClass()) {
-    RETURN_TYPE_ERROR(isolate, object, Class/Type);
-  }
-  const Class& cls = (obj.IsType()) ?
-      Class::Handle(Type::Cast(obj).type_class()) : Class::Cast(obj);
-  const Array& interface_types = Array::Handle(isolate, cls.interfaces());
-  if (interface_types.IsNull()) {
-    *count = 0;
-  } else {
-    *count = interface_types.Length();
-  }
-  return Api::Success();
-}
-
-
-DART_EXPORT Dart_Handle Dart_ClassGetInterfaceAt(Dart_Handle object,
-                                                 intptr_t index) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
-  if (!obj.IsType() && !obj.IsClass()) {
-    RETURN_TYPE_ERROR(isolate, object, Class/Type);
-  }
-  const Class& cls = (obj.IsType()) ?
-      Class::Handle(Type::Cast(obj).type_class()) : Class::Cast(obj);
-
-  // Finalize all classes.
-  Dart_Handle state = Api::CheckIsolateState(isolate);
-  if (::Dart_IsError(state)) {
-    return state;
-  }
-
-  const Array& interface_types = Array::Handle(isolate, cls.interfaces());
-  if (index < 0 || index >= interface_types.Length()) {
-    return Api::NewError("%s: argument 'index' out of bounds.", CURRENT_FUNC);
-  }
-  Type& interface_type = Type::Handle(isolate);
-  interface_type ^= interface_types.At(index);
-  if (interface_type.HasResolvedTypeClass()) {
-    return Api::NewHandle(isolate, interface_type.type_class());
-  }
-  const String& type_name =
-      String::Handle(isolate, interface_type.TypeClassName());
-  return Api::NewError("%s: internal error: found unresolved type class '%s'.",
-                       CURRENT_FUNC, type_name.ToCString());
-}
-
-
-DART_EXPORT bool Dart_ClassIsTypedef(Dart_Handle object) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
-  if (!obj.IsType() && !obj.IsClass()) {
-    RETURN_TYPE_ERROR(isolate, object, Class/Type);
-  }
-  const Class& cls = (obj.IsType()) ?
-      Class::Handle(Type::Cast(obj).type_class()) : Class::Cast(obj);
-  // For now we represent typedefs as non-canonical signature classes.
-  // I anticipate this may change if we make typedefs more general.
-  return cls.IsSignatureClass() && !cls.IsCanonicalSignatureClass();
-}
-
-
-DART_EXPORT Dart_Handle Dart_ClassGetTypedefReferent(Dart_Handle object) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
-  if (!obj.IsType() && !obj.IsClass()) {
-    RETURN_TYPE_ERROR(isolate, object, Class/Type);
-  }
-  const Class& cls = (obj.IsType()) ?
-      Class::Handle(Type::Cast(obj).type_class()) : Class::Cast(obj);
-  if (!cls.IsSignatureClass() && !cls.IsCanonicalSignatureClass()) {
-    const String& cls_name = String::Handle(cls.UserVisibleName());
-    return Api::NewError("%s: class '%s' is not a typedef class. "
-                         "See Dart_ClassIsTypedef.",
-                         CURRENT_FUNC, cls_name.ToCString());
-  }
-
-  const Function& func = Function::Handle(isolate, cls.signature_function());
-  return Api::NewHandle(isolate, func.signature_class());
-}
-
-
-DART_EXPORT bool Dart_ClassIsFunctionType(Dart_Handle object) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
-  if (!obj.IsType() && !obj.IsClass()) {
-    RETURN_TYPE_ERROR(isolate, object, Class/Type);
-  }
-  // Ensure all classes are finalized.
-  Dart_Handle state = Api::CheckIsolateState(isolate);
-  if (::Dart_IsError(state)) {
-    return state;
-  }
-  const Class& cls = (obj.IsType()) ?
-      Class::Handle(Type::Cast(obj).type_class()) : Class::Cast(obj);
-  // A class represents a function type when it is a canonical
-  // signature class.
-  return cls.IsCanonicalSignatureClass();
-}
-
-
-DART_EXPORT Dart_Handle Dart_ClassGetFunctionTypeSignature(Dart_Handle object) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
-  if (!obj.IsType() && !obj.IsClass()) {
-    RETURN_TYPE_ERROR(isolate, object, Class/Type);
-  }
-  const Class& cls = (obj.IsType()) ?
-      Class::Handle(Type::Cast(obj).type_class()) : Class::Cast(obj);
-  if (!cls.IsCanonicalSignatureClass()) {
-    const String& cls_name = String::Handle(cls.UserVisibleName());
-    return Api::NewError("%s: class '%s' is not a function-type class. "
-                         "See Dart_ClassIsFunctionType.",
-                         CURRENT_FUNC, cls_name.ToCString());
-  }
-  return Api::NewHandle(isolate, cls.signature_function());
-}
-
-
 // --- Function and Variable Reflection ---
 
 // Outside of the vm, we expose setter names with a trailing '='.
@@ -423,22 +244,6 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_FunctionIsAbstract(Dart_Handle function,
-                                                bool* is_abstract) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  if (is_abstract == NULL) {
-    RETURN_NULL_ERROR(is_abstract);
-  }
-  const Function& func = Api::UnwrapFunctionHandle(isolate, function);
-  if (func.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, function, Function);
-  }
-  *is_abstract = func.is_abstract();
-  return Api::Success();
-}
-
-
 DART_EXPORT Dart_Handle Dart_FunctionIsStatic(Dart_Handle function,
                                               bool* is_static) {
   Isolate* isolate = Isolate::Current();
@@ -503,352 +308,6 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_FunctionReturnType(Dart_Handle function) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Function& func = Api::UnwrapFunctionHandle(isolate, function);
-  if (func.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, function, Function);
-  }
-  // Ensure all classes are finalized.
-  Dart_Handle state = Api::CheckIsolateState(isolate);
-  if (::Dart_IsError(state)) {
-    return state;
-  }
-  if (func.kind() == RawFunction::kConstructor) {
-    // Special case the return type for constructors.  Inside the vm
-    // we mark them as returning dynamic, but for the purposes of
-    // reflection, they return the type of the class being
-    // constructed.
-    return Api::NewHandle(isolate, func.Owner());
-  } else {
-    const AbstractType& return_type =
-        AbstractType::Handle(isolate, func.result_type());
-    return TypeToHandle(isolate, "Dart_FunctionReturnType", return_type);
-  }
-}
-
-
-DART_EXPORT Dart_Handle Dart_FunctionParameterCounts(
-    Dart_Handle function,
-    int64_t* fixed_param_count,
-    int64_t* opt_param_count) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  if (fixed_param_count == NULL) {
-    RETURN_NULL_ERROR(fixed_param_count);
-  }
-  if (opt_param_count == NULL) {
-    RETURN_NULL_ERROR(opt_param_count);
-  }
-  const Function& func = Api::UnwrapFunctionHandle(isolate, function);
-  if (func.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, function, Function);
-  }
-
-  // We hide implicit parameters, such as a method's receiver. This is
-  // consistent with Invoke or New, which don't expect their callers to
-  // provide them in the argument lists they are handed.
-  *fixed_param_count = func.num_fixed_parameters() -
-                       func.NumImplicitParameters();
-  // TODO(regis): Separately report named and positional optional param counts.
-  *opt_param_count = func.NumOptionalParameters();
-
-  ASSERT(*fixed_param_count >= 0);
-  ASSERT(*opt_param_count >= 0);
-
-  return Api::Success();
-}
-
-
-DART_EXPORT Dart_Handle Dart_FunctionParameterType(Dart_Handle function,
-                                                   int parameter_index) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Function& func = Api::UnwrapFunctionHandle(isolate, function);
-  if (func.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, function, Function);
-  }
-  // Ensure all classes are finalized.
-  Dart_Handle state = Api::CheckIsolateState(isolate);
-  if (::Dart_IsError(state)) {
-    return state;
-  }
-  const intptr_t num_implicit_params = func.NumImplicitParameters();
-  const intptr_t num_params = func.NumParameters() - num_implicit_params;
-  if (parameter_index < 0 || parameter_index >= num_params) {
-    return Api::NewError(
-        "%s: argument 'parameter_index' out of range. "
-        "Expected 0..%"Pd" but saw %d.",
-        CURRENT_FUNC, num_params, parameter_index);
-  }
-  const AbstractType& param_type =
-      AbstractType::Handle(isolate, func.ParameterTypeAt(
-          num_implicit_params + parameter_index));
-  return TypeToHandle(isolate, "Dart_FunctionParameterType", param_type);
-}
-
-
-DART_EXPORT Dart_Handle Dart_GetVariableNames(Dart_Handle target) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(target));
-  if (obj.IsError()) {
-    return target;
-  }
-
-  const GrowableObjectArray& names =
-      GrowableObjectArray::Handle(isolate, GrowableObjectArray::New());
-  Field& field = Field::Handle(isolate);
-  String& name = String::Handle(isolate);
-
-  if (obj.IsType() || obj.IsClass()) {
-    // For backwards compatibility we allow class objects to be passed in
-    // for now. This needs to be removed once all code that uses class
-    // objects to invoke Dart_Invoke is removed.
-    const Class& cls = (obj.IsType()) ?
-        Class::Handle(Type::Cast(obj).type_class()) : Class::Cast(obj);
-    const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate));
-    if (!error.IsNull()) {
-      return Api::NewHandle(isolate, error.raw());
-    }
-    const Array& field_array = Array::Handle(cls.fields());
-
-    // Some special types like 'dynamic' have a null fields list.
-    //
-    // TODO(turnidge): Fix 'dynamic' so that it does not have a null
-    // fields list.  This will have to wait until the empty array is
-    // allocated in the vm isolate.
-    if (!field_array.IsNull()) {
-      for (intptr_t i = 0; i < field_array.Length(); ++i) {
-        field ^= field_array.At(i);
-        name = field.UserVisibleName();
-        names.Add(name);
-      }
-    }
-  } else if (obj.IsLibrary()) {
-    const Library& lib = Library::Cast(obj);
-    DictionaryIterator it(lib);
-    Object& obj = Object::Handle(isolate);
-    while (it.HasNext()) {
-      obj = it.GetNext();
-      if (obj.IsField()) {
-        field ^= obj.raw();
-        name = field.UserVisibleName();
-        names.Add(name);
-      }
-    }
-  } else {
-    return Api::NewError(
-        "%s expects argument 'target' to be a class or library.",
-        CURRENT_FUNC);
-  }
-  return Api::NewHandle(isolate, Array::MakeArray(names));
-}
-
-
-DART_EXPORT Dart_Handle Dart_LookupVariable(Dart_Handle target,
-                                            Dart_Handle variable_name) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(target));
-  if (obj.IsError()) {
-    return target;
-  }
-  const String& var_name = Api::UnwrapStringHandle(isolate, variable_name);
-  if (var_name.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, variable_name, String);
-  }
-  if (obj.IsType() || obj.IsClass()) {
-    // For backwards compatibility we allow class objects to be passed in
-    // for now. This needs to be removed once all code that uses class
-    // objects to invoke Dart_Invoke is removed.
-    const Class& cls = (obj.IsType()) ?
-        Class::Handle(Type::Cast(obj).type_class()) : Class::Cast(obj);
-    return Api::NewHandle(isolate, cls.LookupField(var_name));
-  }
-  if (obj.IsLibrary()) {
-    const Library& lib = Library::Cast(obj);
-    String& ambiguity_error_msg = String::Handle(isolate);
-    const Field& variable = Field::Handle(
-        lib.LookupFieldAllowPrivate(var_name, &ambiguity_error_msg));
-    if (!ambiguity_error_msg.IsNull()) {
-      return Api::NewError("%s.", ambiguity_error_msg.ToCString());
-    }
-    return Api::NewHandle(isolate, variable.raw());
-  }
-  return Api::NewError(
-      "%s expects argument 'target' to be a class or library.",
-      CURRENT_FUNC);
-}
-
-
-DART_EXPORT Dart_Handle Dart_VariableName(Dart_Handle variable) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Field& var = Api::UnwrapFieldHandle(isolate, variable);
-  if (var.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, variable, Field);
-  }
-  return Api::NewHandle(isolate, var.UserVisibleName());
-}
-
-
-DART_EXPORT Dart_Handle Dart_VariableIsStatic(Dart_Handle variable,
-                                              bool* is_static) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  if (is_static == NULL) {
-    RETURN_NULL_ERROR(is_static);
-  }
-  const Field& var = Api::UnwrapFieldHandle(isolate, variable);
-  if (var.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, variable, Field);
-  }
-  *is_static = var.is_static();
-  return Api::Success();
-}
-
-
-DART_EXPORT Dart_Handle Dart_VariableIsFinal(Dart_Handle variable,
-                                             bool* is_final) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  if (is_final == NULL) {
-    RETURN_NULL_ERROR(is_final);
-  }
-  const Field& var = Api::UnwrapFieldHandle(isolate, variable);
-  if (var.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, variable, Field);
-  }
-  *is_final = var.is_final();
-  return Api::Success();
-}
-
-
-DART_EXPORT Dart_Handle Dart_VariableType(Dart_Handle variable) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Field& var = Api::UnwrapFieldHandle(isolate, variable);
-  if (var.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, variable, Field);
-  }
-  // Ensure all classes are finalized.
-  Dart_Handle state = Api::CheckIsolateState(isolate);
-  if (::Dart_IsError(state)) {
-    return state;
-  }
-  const AbstractType& type = AbstractType::Handle(isolate, var.type());
-  return TypeToHandle(isolate, "Dart_VariableType", type);
-}
-
-
-DART_EXPORT Dart_Handle Dart_GetTypeVariableNames(Dart_Handle object) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
-  if (!obj.IsType() && !obj.IsClass()) {
-    RETURN_TYPE_ERROR(isolate, object, Class/Type);
-  }
-  // Ensure all classes are finalized.
-  Dart_Handle state = Api::CheckIsolateState(isolate);
-  if (::Dart_IsError(state)) {
-    return state;
-  }
-  const Class& cls = (obj.IsType()) ?
-      Class::Handle(Type::Cast(obj).type_class()) : Class::Cast(obj);
-  const intptr_t num_type_params = cls.NumTypeParameters();
-  const TypeArguments& type_params =
-      TypeArguments::Handle(cls.type_parameters());
-
-  const GrowableObjectArray& names =
-      GrowableObjectArray::Handle(isolate, GrowableObjectArray::New());
-  TypeParameter& type_param = TypeParameter::Handle(isolate);
-  String& name = String::Handle(isolate);
-  for (intptr_t i = 0; i < num_type_params; i++) {
-    type_param ^= type_params.TypeAt(i);
-    name = type_param.name();
-    names.Add(name);
-  }
-  return Api::NewHandle(isolate, Array::MakeArray(names));
-}
-
-
-DART_EXPORT Dart_Handle Dart_LookupTypeVariable(
-    Dart_Handle object,
-    Dart_Handle type_variable_name) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
-  if (!obj.IsType() && !obj.IsClass()) {
-    RETURN_TYPE_ERROR(isolate, object, Class/Type);
-  }
-  const Class& cls = (obj.IsType()) ?
-      Class::Handle(Type::Cast(obj).type_class()) : Class::Cast(obj);
-  const String& var_name = Api::UnwrapStringHandle(isolate, type_variable_name);
-  if (var_name.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, type_variable_name, String);
-  }
-
-  const intptr_t num_type_params = cls.NumTypeParameters();
-  const TypeArguments& type_params =
-      TypeArguments::Handle(cls.type_parameters());
-
-  TypeParameter& type_param = TypeParameter::Handle(isolate);
-  String& name = String::Handle(isolate);
-  for (intptr_t i = 0; i < num_type_params; i++) {
-    type_param ^= type_params.TypeAt(i);
-    name = type_param.name();
-    if (name.Equals(var_name)) {
-      return Api::NewHandle(isolate, type_param.raw());
-    }
-  }
-  const String& cls_name = String::Handle(cls.UserVisibleName());
-  return Api::NewError(
-      "%s: Could not find type variable named '%s' for class %s.\n",
-      CURRENT_FUNC, var_name.ToCString(), cls_name.ToCString());
-}
-
-
-DART_EXPORT Dart_Handle Dart_TypeVariableName(Dart_Handle type_variable) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const TypeParameter& type_var =
-      Api::UnwrapTypeParameterHandle(isolate, type_variable);
-  if (type_var.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, type_variable, TypeParameter);
-  }
-  return Api::NewHandle(isolate, type_var.name());
-}
-
-
-DART_EXPORT Dart_Handle Dart_TypeVariableOwner(Dart_Handle type_variable) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const TypeParameter& type_var =
-      Api::UnwrapTypeParameterHandle(isolate, type_variable);
-  if (type_var.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, type_variable, TypeParameter);
-  }
-  const Class& owner = Class::Handle(type_var.parameterized_class());
-  ASSERT(!owner.IsNull() && owner.IsClass());
-  return Api::NewHandle(isolate, owner.raw());
-}
-
-
-DART_EXPORT Dart_Handle Dart_TypeVariableUpperBound(Dart_Handle type_variable) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  const TypeParameter& type_var =
-      Api::UnwrapTypeParameterHandle(isolate, type_variable);
-  if (type_var.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, type_variable, TypeParameter);
-  }
-  const AbstractType& bound = AbstractType::Handle(type_var.bound());
-  return TypeToHandle(isolate, "Dart_TypeVariableUpperBound", bound);
-}
-
-
 // --- Libraries Reflection ---
 
 DART_EXPORT Dart_Handle Dart_LibraryName(Dart_Handle library) {
@@ -912,26 +371,4 @@
   return Api::NewHandle(isolate, rf);
 }
 
-
-// --- Metadata Reflection ----
-
-DART_EXPORT Dart_Handle Dart_GetMetadata(Dart_Handle object) {
-  Isolate* isolate = Isolate::Current();
-  CHECK_ISOLATE(isolate);
-  DARTSCOPE(isolate);
-  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(object));
-  Class& cls = Class::Handle(isolate);
-  if (obj.IsClass()) {
-    cls ^= obj.raw();
-  } else if (obj.IsFunction()) {
-    cls = Function::Cast(obj).origin();
-  } else if (obj.IsField()) {
-    cls = Field::Cast(obj).origin();
-  } else {
-    return Api::NewHandle(isolate, Object::empty_array().raw());
-  }
-  const Library& lib = Library::Handle(cls.library());
-  return Api::NewHandle(isolate, lib.GetMetadata(obj));
-}
-
 }  // namespace dart
diff --git a/runtime/vm/native_arguments.cc b/runtime/vm/native_arguments.cc
deleted file mode 100644
index 1175064..0000000
--- a/runtime/vm/native_arguments.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "vm/native_arguments.h"
-
-#include "platform/assert.h"
-#include "vm/object.h"
-
-namespace dart {
-
-void NativeArguments::SetReturn(const Object& value) const {
-  *retval_ = value.raw();
-}
-
-void NativeArguments::SetReturnUnsafe(RawObject* value) const {
-  *retval_ = value;
-}
-
-}  // namespace dart
diff --git a/runtime/vm/native_arguments.h b/runtime/vm/native_arguments.h
index 9be5e0e..281e224 100644
--- a/runtime/vm/native_arguments.h
+++ b/runtime/vm/native_arguments.h
@@ -7,11 +7,16 @@
 
 #include "platform/assert.h"
 #include "vm/globals.h"
+#include "vm/handles_impl.h"
 #include "vm/simulator.h"
 #include "vm/stub_code.h"
 
 namespace dart {
 
+DECLARE_FLAG(bool, deoptimize_alot);
+DECLARE_FLAG(bool, trace_natives);
+DECLARE_FLAG(bool, verify_on_transition);
+
 // Forward declarations.
 class BootstrapNatives;
 class Isolate;
@@ -19,7 +24,6 @@
 class RawObject;
 class Simulator;
 
-
 #if defined(TESTING) || defined(DEBUG)
 
 #if defined(USING_SIMULATOR)
@@ -41,9 +45,26 @@
 }
 #endif
 
+#define VERIFY_ON_TRANSITION                                                   \
+  if (FLAG_verify_on_transition) {                                             \
+    VerifyPointersVisitor::VerifyPointers();                                   \
+    Isolate::Current()->heap()->Verify();                                      \
+  }
+#define TRACE_NATIVES(name)                                                    \
+  if (FLAG_trace_natives) {                                                    \
+    OS::Print("Calling native: %s\n", name);                                   \
+  }
+#define DEOPTIMIZE_ALOT                                                        \
+  if (FLAG_deoptimize_alot) {                                                  \
+    DeoptimizeAll();                                                           \
+  }
+
 #else
 
 #define CHECK_STACK_ALIGNMENT { }
+#define VERIFY_ON_TRANSITION { }
+#define TRACE_NATIVES(name) { }
+#define DEOPTIMIZE_ALOT { }
 
 #endif
 
@@ -110,7 +131,9 @@
     }
   }
 
-  void SetReturn(const Object& value) const;
+  void SetReturn(const Object& value) const {
+    *retval_ = value.raw();
+  }
 
   static intptr_t isolate_offset() {
     return OFFSET_OF(NativeArguments, isolate_);
@@ -164,7 +187,9 @@
   // exceedingly careful when we use it.  If there are any other side
   // effects in the statement that may cause GC, it could lead to
   // bugs.
-  void SetReturnUnsafe(RawObject* value) const;
+  void SetReturnUnsafe(RawObject* value) const {
+    *retval_ = value;
+  }
 
   Isolate* isolate_;  // Current isolate pointer.
   int argc_tag_;  // Encodes argument count and invoked native call type.
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index f53bad6..25b0697 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -7,16 +7,22 @@
 #include "include/dart_api.h"
 
 #include "vm/dart_api_impl.h"
+#include "vm/dart_api_state.h"
 
 namespace dart {
 
 DEFINE_FLAG(bool, trace_natives, false, "Trace invocation of natives");
 
-NativeFunction NativeEntry::ResolveNative(const Class& cls,
+
+static ExternalLabel native_call_label(
+    "native_function_call",
+    reinterpret_cast<uword>(&NativeEntry::NativeCallWrapper));
+
+
+NativeFunction NativeEntry::ResolveNative(const Library& library,
                                           const String& function_name,
                                           int number_of_arguments) {
   // Now resolve the native function to the corresponding native entrypoint.
-  const Library& library = Library::Handle(cls.library());
   if (library.native_entry_resolver() == 0) {
     // Native methods are not allowed in the library to which this
     // class belongs in.
@@ -31,4 +37,47 @@
   return reinterpret_cast<NativeFunction>(native_function);
 }
 
+
+const ExternalLabel& NativeEntry::NativeCallWrapperLabel() {
+  return native_call_label;
+}
+
+
+void NativeEntry::NativeCallWrapper(Dart_NativeArguments args,
+                                    Dart_NativeFunction func) {
+  CHECK_STACK_ALIGNMENT;
+  VERIFY_ON_TRANSITION;
+  NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+  Isolate* isolate = arguments->isolate();
+  ApiState* state = isolate->api_state();
+  ASSERT(state != NULL);
+  ApiLocalScope* current_top_scope = state->top_scope();
+  ApiLocalScope* scope = state->reusable_scope();
+  if (scope == NULL) {
+    scope = new ApiLocalScope(current_top_scope,
+                              isolate->top_exit_frame_info());
+    ASSERT(scope != NULL);
+  } else {
+    scope->Reinit(isolate,
+                  current_top_scope,
+                  isolate->top_exit_frame_info());
+    state->set_reusable_scope(NULL);
+  }
+  state->set_top_scope(scope);  // New scope is now the top scope.
+
+  func(args);
+
+  ASSERT(current_top_scope == scope->previous());
+  state->set_top_scope(current_top_scope);  // Reset top scope to previous.
+  if (state->reusable_scope() == NULL) {
+    scope->Reset(isolate);  // Reset the old scope which we just exited.
+    state->set_reusable_scope(scope);
+  } else {
+    ASSERT(state->reusable_scope() != scope);
+    delete scope;
+  }
+  DEOPTIMIZE_ALOT;
+  VERIFY_ON_TRANSITION;
+}
+
 }  // namespace dart
diff --git a/runtime/vm/native_entry.h b/runtime/vm/native_entry.h
index 09b5f7f..e6d6c8c 100644
--- a/runtime/vm/native_entry.h
+++ b/runtime/vm/native_entry.h
@@ -16,9 +16,6 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, deoptimize_alot);
-DECLARE_FLAG(bool, trace_natives);
-
 // Forward declarations.
 class Class;
 class String;
@@ -46,13 +43,12 @@
     VERIFY_ON_TRANSITION;                                                      \
     NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);     \
     ASSERT(arguments->NativeArgCount() == argument_count);                     \
-    if (FLAG_trace_natives) OS::Print("Calling native: %s\n", ""#name);        \
+    TRACE_NATIVES(""#name);                                                    \
     {                                                                          \
       StackZone zone(arguments->isolate());                                    \
-      HANDLESCOPE(arguments->isolate());                                       \
       SET_NATIVE_RETVAL(arguments,                                             \
                         DN_Helper##name(arguments->isolate(), arguments));     \
-      if (FLAG_deoptimize_alot) DeoptimizeAll();                               \
+      DEOPTIMIZE_ALOT;                                                         \
     }                                                                          \
     VERIFY_ON_TRANSITION;                                                      \
   }                                                                            \
@@ -92,10 +88,15 @@
 // Helper class for resolving and handling native functions.
 class NativeEntry : public AllStatic {
  public:
+  static const intptr_t kNumCallWrapperArguments = 2;
+
   // Resolve specified dart native function to the actual native entrypoint.
-  static NativeFunction ResolveNative(const Class& cls,
+  static NativeFunction ResolveNative(const Library& library,
                                       const String& function_name,
                                       int number_of_arguments);
+  static void NativeCallWrapper(Dart_NativeArguments args,
+                                Dart_NativeFunction func);
+  static const ExternalLabel& NativeCallWrapperLabel();
 };
 
 }  // namespace dart
diff --git a/runtime/vm/native_entry_test.cc b/runtime/vm/native_entry_test.cc
index c8276f1..875bb30 100644
--- a/runtime/vm/native_entry_test.cc
+++ b/runtime/vm/native_entry_test.cc
@@ -21,7 +21,6 @@
 // Arg1: a smi.
 // Result: a smi representing arg0 - arg1.
 void TestSmiSub(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle left = Dart_GetNativeArgument(args, 0);
   Dart_Handle right = Dart_GetNativeArgument(args, 1);
   int64_t left_value = -1;
@@ -32,7 +31,6 @@
   // Ignoring overflow in the calculation below.
   int64_t result = left_value - right_value;
   Dart_SetReturnValue(args, Dart_NewInteger(result));
-  Dart_ExitScope();
 }
 
 
@@ -40,7 +38,6 @@
 // Arg0-4: 5 smis.
 // Result: a smi representing the sum of all arguments.
 void TestSmiSum(Dart_NativeArguments args) {
-  Dart_EnterScope();
   int64_t result = 0;
   int arg_count = Dart_GetNativeArgumentCount(args);
   for (int i = 0; i < arg_count; i++) {
@@ -52,7 +49,6 @@
     result += arg_value;
   }
   Dart_SetReturnValue(args, Dart_NewInteger(result));
-  Dart_ExitScope();
 }
 
 
@@ -60,7 +56,6 @@
 // Arg0-4: 5 smis or null.
 // Result: a smi representing the sum of all non-null arguments.
 void TestNonNullSmiSum(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Isolate* isolate = Isolate::Current();
   int64_t result = 0;
   int arg_count = Dart_GetNativeArgumentCount(args);
@@ -84,7 +79,6 @@
     }
   }
   Dart_SetReturnValue(args, Dart_NewInteger(result));
-  Dart_ExitScope();
 }
 
 }  // namespace dart
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 0223cb1..29c3262 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -146,10 +146,10 @@
   V(CoreLibrary, Object, _as)                                                  \
   V(CoreLibrary, Object, _instanceOf)                                          \
   V(CoreLibrary, _ObjectArray, _ObjectArray.)                                  \
-  V(CoreLibrary, _AssertionErrorImplementation, _throwNew)                     \
-  V(CoreLibrary, _TypeErrorImplementation, _throwNew)                          \
-  V(CoreLibrary, _FallThroughErrorImplementation, _throwNew)                   \
-  V(CoreLibrary, _AbstractClassInstantiationErrorImplementation, _throwNew)    \
+  V(CoreLibrary, AssertionError, _throwNew)                                    \
+  V(CoreLibrary, TypeError, _throwNew)                                         \
+  V(CoreLibrary, FallThroughError, _throwNew)                                  \
+  V(CoreLibrary, AbstractClassInstantiationError, _throwNew)                   \
   V(CoreLibrary, NoSuchMethodError, _throwNew)                                 \
   V(CoreLibrary, int, _throwFormatException)                                   \
   V(CoreLibrary, int, _parse)                                                  \
@@ -1925,6 +1925,15 @@
   // new private methods.
   Function& func = Function::Handle();
   Function& orig_func = Function::Handle();
+  // Lookup the original implicit constructor, if any.
+  member_name = Name();
+  member_name = String::Concat(member_name, Symbols::Dot());
+  Function& orig_implicit_ctor = Function::Handle(LookupFunction(member_name));
+  if (!orig_implicit_ctor.IsNull() &&
+      !orig_implicit_ctor.IsImplicitConstructor()) {
+    // Not an implicit constructor, but a user declared one.
+    orig_implicit_ctor = Function::null();
+  }
   const GrowableObjectArray& new_functions = GrowableObjectArray::Handle(
       GrowableObjectArray::New(orig_len));
   for (intptr_t i = 0; i < orig_len; i++) {
@@ -1934,7 +1943,11 @@
     if (func.IsNull()) {
       // Non-patched function is preserved, all patched functions are added in
       // the loop below.
-      new_functions.Add(orig_func);
+      // However, an implicitly created constructor should not be preserved if
+      // the patch provides a constructor or a factory. Wait for now.
+      if (orig_func.raw() != orig_implicit_ctor.raw()) {
+        new_functions.Add(orig_func);
+      }
     } else if (!func.HasCompatibleParametersWith(orig_func) &&
                !(func.IsFactory() && orig_func.IsConstructor() &&
                  (func.num_fixed_parameters() + 1 ==
@@ -1944,9 +1957,17 @@
   }
   for (intptr_t i = 0; i < patch_len; i++) {
     func ^= patch_list.At(i);
+    if (func.IsConstructor() || func.IsFactory()) {
+      // Do not preserve the original implicit constructor, if any.
+      orig_implicit_ctor = Function::null();
+    }
     func.set_owner(patch_class);
     new_functions.Add(func);
   }
+  if (!orig_implicit_ctor.IsNull()) {
+    // Preserve the original implicit constructor.
+    new_functions.Add(orig_implicit_ctor);
+  }
   Array& new_list = Array::Handle(Array::MakeArray(new_functions));
   SetFunctions(new_list);
 
@@ -9231,12 +9252,20 @@
   ASSERT(target != NULL);
   ASSERT(num_args_tested() == 1);
   const Array& data = Array::Handle(ic_data());
-  intptr_t data_pos = index * TestEntryLength();
+  const intptr_t data_pos = index * TestEntryLength();
   *class_id = Smi::Value(Smi::RawCast(data.At(data_pos)));
   *target ^= data.At(data_pos + 1);
 }
 
 
+intptr_t ICData::GetCidAt(intptr_t index) const {
+  ASSERT(num_args_tested() == 1);
+  const Array& data = Array::Handle(ic_data());
+  const intptr_t data_pos = index * TestEntryLength();
+  return Smi::Value(Smi::RawCast(data.At(data_pos)));
+}
+
+
 intptr_t ICData::GetClassIdAt(intptr_t index, intptr_t arg_nr) const {
   GrowableArray<intptr_t> class_ids;
   Function& target = Function::Handle();
@@ -14490,6 +14519,11 @@
   stream->CloseObject();
 }
 
+RawAbstractType* MirrorReference::GetAbstractTypeReferent() const {
+  ASSERT(Object::Handle(referent()).IsAbstractType());
+  return AbstractType::Cast(Object::Handle(referent())).raw();
+}
+
 
 RawClass* MirrorReference::GetClassReferent() const {
   ASSERT(Object::Handle(referent()).IsClass());
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 39142ab..a1455845 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1962,6 +1962,7 @@
   // to have or kDynamicCid if such class id is not known.
   // Stores to this field must update this information hence the name.
   intptr_t guarded_cid() const { return raw_ptr()->guarded_cid_; }
+
   void set_guarded_cid(intptr_t cid) const {
     raw_ptr()->guarded_cid_ = cid;
   }
@@ -1969,6 +1970,10 @@
     return OFFSET_OF(RawField, guarded_cid_);
   }
 
+  static bool IsExternalizableCid(intptr_t cid) {
+    return (cid == kOneByteStringCid) || (cid == kTwoByteStringCid);
+  }
+
   // Returns false if any value read from this field is guaranteed to be
   // not null.
   // Internally we is_nullable_ field contains either kNullCid (nullable) or
@@ -3327,6 +3332,9 @@
   void GetOneClassCheckAt(intptr_t index,
                           intptr_t* class_id,
                           Function* target) const;
+  // Only for 'num_args_checked == 1'.
+  intptr_t GetCidAt(intptr_t index) const;
+
   intptr_t GetReceiverClassIdAt(intptr_t index) const;
   intptr_t GetClassIdAt(intptr_t index, intptr_t arg_nr) const;
 
@@ -5349,7 +5357,7 @@
   }
 
 
-  TypeDataElementType ElementType() const {
+  TypedDataElementType ElementType() const {
     intptr_t cid = raw()->GetClassId();
     return ElementType(cid);
   }
@@ -5383,6 +5391,8 @@
   TYPED_GETTER_SETTER(Float64, double)
   TYPED_GETTER_SETTER(Float32x4, simd128_value_t)
 
+#undef TYPED_GETTER_SETTER
+
   static intptr_t length_offset() {
     return OFFSET_OF(RawTypedData, length_);
   }
@@ -5406,9 +5416,9 @@
     return element_size[ElementType(class_id)];
   }
 
-  static TypeDataElementType ElementType(intptr_t class_id) {
+  static TypedDataElementType ElementType(intptr_t class_id) {
     ASSERT(RawObject::IsTypedDataClassId(class_id));
-    return static_cast<TypeDataElementType>(
+    return static_cast<TypedDataElementType>(
         class_id - kTypedDataInt8ArrayCid);
   }
 
@@ -5475,7 +5485,7 @@
     return ElementSizeInBytes(cid);
   }
 
-  TypeDataElementType ElementType() const {
+  TypedDataElementType ElementType() const {
     intptr_t cid = raw()->GetClassId();
     return ElementType(cid);
   }
@@ -5513,6 +5523,8 @@
   TYPED_GETTER_SETTER(Float64, double)
   TYPED_GETTER_SETTER(Float32x4, simd128_value_t);
 
+#undef TYPED_GETTER_SETTER
+
   FinalizablePersistentHandle* AddFinalizer(
       void* peer, Dart_WeakPersistentHandleFinalizer callback) const;
 
@@ -5533,9 +5545,9 @@
     return TypedData::element_size[ElementType(class_id)];
   }
 
-  static TypeDataElementType ElementType(intptr_t class_id) {
+  static TypedDataElementType ElementType(intptr_t class_id) {
     ASSERT(RawObject::IsExternalTypedDataClassId(class_id));
-    return static_cast<TypeDataElementType>(
+    return static_cast<TypedDataElementType>(
         class_id - kExternalTypedDataInt8ArrayCid);
   }
 
@@ -5893,6 +5905,8 @@
     StorePointer(&raw_ptr()->referent_, referent.raw());
   }
 
+  RawAbstractType* GetAbstractTypeReferent() const;
+
   RawClass* GetClassReferent() const;
 
   RawField* GetFieldReferent() const;
@@ -5984,9 +5998,7 @@
   if (native_fields == TypedData::null()) {
     return 0;
   }
-  intptr_t byte_offset = index * sizeof(intptr_t);
-  return *reinterpret_cast<intptr_t*>(native_fields->ptr()->data_ +
-                                      byte_offset);
+  return reinterpret_cast<intptr_t*>(native_fields->ptr()->data_)[index];
 }
 
 
diff --git a/runtime/vm/object_id_ring.cc b/runtime/vm/object_id_ring.cc
index f7199bd..434463b 100644
--- a/runtime/vm/object_id_ring.cc
+++ b/runtime/vm/object_id_ring.cc
@@ -129,6 +129,9 @@
   if (id == kInvalidId) {
     return false;
   }
+  if (id < 0) {
+    return false;
+  }
   if (id >= max_serial_) {
     return false;
   }
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index fd433b9..25e7fcb 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -1613,7 +1613,7 @@
   uint16_t monkey_utf16[] = { 0xd83d, 0xdc35 };  // Unicode Monkey Face.
   String& monkey = String::Handle(Symbols::FromUTF16(monkey_utf16, 2));
   EXPECT(monkey.IsSymbol());
-  const char monkey_utf8[] = {0xf0, 0x9f, 0x90, 0xb5, 0};
+  const char monkey_utf8[] = {'\xf0', '\x9f', '\x90', '\xb5', 0};
   EXPECT_EQ(monkey.raw(), Symbols::New(monkey_utf8));
 
   int32_t kMonkeyFace = 0x1f435;
@@ -2514,6 +2514,7 @@
   o1.GetOneClassCheckAt(0, &test_class_id, &test_target);
   EXPECT_EQ(kSmiCid, test_class_id);
   EXPECT_EQ(target1.raw(), test_target.raw());
+  EXPECT_EQ(kSmiCid, o1.GetCidAt(0));
   GrowableArray<intptr_t> test_class_ids;
   o1.GetCheckAt(0, &test_class_ids, &test_target);
   EXPECT_EQ(1, test_class_ids.length());
@@ -2526,6 +2527,7 @@
   o1.GetOneClassCheckAt(1, &test_class_id, &test_target);
   EXPECT_EQ(kDoubleCid, test_class_id);
   EXPECT_EQ(target2.raw(), test_target.raw());
+  EXPECT_EQ(kDoubleCid, o1.GetCidAt(1));
 
   ICData& o2 = ICData::Handle();
   o2 = ICData::New(function, target_name, args_descriptor, 57, 2);
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index d5a8dde..1060121 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -6,6 +6,7 @@
 
 #include "lib/invocation_mirror.h"
 #include "vm/bigint_operations.h"
+#include "vm/bootstrap.h"
 #include "vm/class_finalizer.h"
 #include "vm/compiler.h"
 #include "vm/compiler_stats.h"
@@ -204,13 +205,15 @@
 // block using 'return', 'break' or 'continue'.
 class Parser::TryBlocks : public ZoneAllocated {
  public:
-  TryBlocks(Block* try_block, TryBlocks* outer_try_block)
+  TryBlocks(Block* try_block, TryBlocks* outer_try_block, intptr_t try_index)
       : try_block_(try_block),
         inlined_finally_nodes_(),
-        outer_try_block_(outer_try_block) { }
+        outer_try_block_(outer_try_block),
+        try_index_(try_index) { }
 
   TryBlocks* outer_try_block() const { return outer_try_block_; }
   Block* try_block() const { return try_block_; }
+  intptr_t try_index() const { return try_index_; }
 
   void AddNodeForFinallyInlining(AstNode* node);
   AstNode* GetNodeToInlineFinally(int index) {
@@ -224,6 +227,7 @@
   Block* try_block_;
   GrowableArray<AstNode*> inlined_finally_nodes_;
   TryBlocks* outer_try_block_;
+  const intptr_t try_index_;
 
   DISALLOW_COPY_AND_ASSIGN(TryBlocks);
 };
@@ -250,7 +254,8 @@
       literal_token_(LiteralToken::Handle(isolate_)),
       current_class_(Class::Handle(isolate_)),
       library_(Library::Handle(isolate_, library.raw())),
-      try_blocks_list_(NULL) {
+      try_blocks_list_(NULL),
+      last_used_try_index_(CatchClauseNode::kInvalidTryIndex) {
   ASSERT(tokens_iterator_.IsValid());
   ASSERT(!library.IsNull());
 }
@@ -278,7 +283,8 @@
       library_(Library::Handle(Class::Handle(
           isolate_,
           parsed_function->function().origin()).library())),
-      try_blocks_list_(NULL) {
+      try_blocks_list_(NULL),
+      last_used_try_index_(CatchClauseNode::kInvalidTryIndex) {
   ASSERT(tokens_iterator_.IsValid());
   ASSERT(!current_function().IsNull());
   if (FLAG_enable_type_checks) {
@@ -4737,8 +4743,8 @@
   // declaration that follows the library definitions. Therefore, we
   // need to remember the position of the last token that was
   // successfully consumed.
-  intptr_t metadata_pos = TokenPos();
-  SkipMetadata();
+  intptr_t rewind_pos = TokenPos();
+  intptr_t metadata_pos = SkipMetadata();
   if (CurrentToken() == Token::kLIBRARY) {
     if (is_patch_source()) {
       ErrorMsg("patch cannot override library name");
@@ -4747,14 +4753,14 @@
     if (metadata_pos >= 0) {
       library_.AddLibraryMetadata(current_class(), metadata_pos);
     }
-    metadata_pos = TokenPos();
-    SkipMetadata();
+    rewind_pos = TokenPos();
+    metadata_pos = SkipMetadata();
   }
   while ((CurrentToken() == Token::kIMPORT) ||
       (CurrentToken() == Token::kEXPORT)) {
     ParseLibraryImportExport();
-    metadata_pos = TokenPos();
-    SkipMetadata();
+    rewind_pos = TokenPos();
+    metadata_pos = SkipMetadata();
   }
   // Core lib has not been explicitly imported, so we implicitly
   // import it here.
@@ -4767,10 +4773,10 @@
   }
   while (CurrentToken() == Token::kPART) {
     ParseLibraryPart();
-    metadata_pos = TokenPos();
-    SkipMetadata();
+    rewind_pos = TokenPos();
+    metadata_pos = SkipMetadata();
   }
-  SetPosition(metadata_pos);
+  SetPosition(rewind_pos);
 }
 
 
@@ -5004,6 +5010,7 @@
   func.set_is_native(true);
   TRACE_PARSER("ParseNativeFunctionBlock");
   const Class& cls = Class::Handle(func.Owner());
+  const Library& library = Library::Handle(cls.library());
   ASSERT(func.NumParameters() == params->parameters->length());
 
   // Parse the function name out.
@@ -5013,19 +5020,22 @@
   // Now resolve the native function to the corresponding native entrypoint.
   const int num_params = NativeArguments::ParameterCountForResolution(func);
   NativeFunction native_function = NativeEntry::ResolveNative(
-      cls, native_name, num_params);
+      library, native_name, num_params);
   if (native_function == NULL) {
     ErrorMsg(native_pos, "native function '%s' cannot be found",
         native_name.ToCString());
   }
 
   // Now add the NativeBodyNode and return statement.
+  Dart_NativeEntryResolver resolver = library.native_entry_resolver();
+  bool is_bootstrap_native = Bootstrap::IsBootstapResolver(resolver);
   current_block_->statements->Add(
       new ReturnNode(TokenPos(),
                      new NativeBodyNode(TokenPos(),
                                         Function::ZoneHandle(func.raw()),
                                         native_name,
-                                        native_function)));
+                                        native_function,
+                                        is_bootstrap_native)));
 }
 
 
@@ -5052,16 +5062,14 @@
 
 void Parser::CaptureInstantiator() {
   ASSERT(current_block_->scope->function_level() > 0);
-  const bool kTestOnly = false;
-  // Side effect of lookup captures the instantiator variable.
-  LocalVariable* instantiator = NULL;
+  bool found = false;
   if (current_function().IsInFactoryScope()) {
-    instantiator = LookupTypeArgumentsParameter(current_block_->scope,
-                                                kTestOnly);
+    found = current_block_->scope->CaptureVariable(
+        Symbols::TypeArgumentsParameter());
   } else {
-    instantiator = LookupReceiver(current_block_->scope, kTestOnly);
+    found = current_block_->scope->CaptureVariable(Symbols::This());
   }
-  ASSERT(instantiator != NULL);
+  ASSERT(found);
 }
 
 
@@ -5130,8 +5138,17 @@
   // Add variable to scope after parsing the initalizer expression.
   // The expression must not be able to refer to the variable.
   if (!current_block_->scope->AddVariable(variable)) {
-    ErrorMsg(ident_pos, "identifier '%s' already defined",
-             variable->name().ToCString());
+    LocalVariable* existing_var =
+        current_block_->scope->LookupVariable(variable->name(), true);
+    ASSERT(existing_var != NULL);
+    if (existing_var->owner() == current_block_->scope) {
+      ErrorMsg(ident_pos, "identifier '%s' already defined",
+               variable->name().ToCString());
+    } else {
+      ErrorMsg(ident_pos,
+               "'%s' from outer scope has already been used, cannot redefine",
+               variable->name().ToCString());
+    }
   }
   if (is_final || is_const) {
     variable->set_is_final();
@@ -5290,8 +5307,18 @@
     ASSERT(current_block_ != NULL);
     ASSERT(current_block_->scope != NULL);
     if (!current_block_->scope->AddVariable(function_variable)) {
-      ErrorMsg(ident_pos, "identifier '%s' already defined",
-               function_variable->name().ToCString());
+      LocalVariable* existing_var =
+          current_block_->scope->LookupVariable(function_variable->name(),
+                                                true);
+      ASSERT(existing_var != NULL);
+      if (existing_var->owner() == current_block_->scope) {
+        ErrorMsg(ident_pos, "identifier '%s' already defined",
+                 function_variable->name().ToCString());
+      } else {
+        ErrorMsg(ident_pos,
+                 "'%s' from outer scope has already been used, cannot redefine",
+                 function_variable->name().ToCString());
+      }
     }
   }
 
@@ -6298,7 +6325,8 @@
 
 
 void Parser::PushTryBlock(Block* try_block) {
-  TryBlocks* block = new TryBlocks(try_block, try_blocks_list_);
+  intptr_t try_index = AllocateTryIndex();
+  TryBlocks* block = new TryBlocks(try_block, try_blocks_list_, try_index);
   try_blocks_list_ = block;
 }
 
@@ -6550,6 +6578,11 @@
   }
   catch_handler_list = CloseBlock();
   TryBlocks* inner_try_block = PopTryBlock();
+  intptr_t try_index = inner_try_block->try_index();
+  TryBlocks* outer_try_block = try_blocks_list_;
+  intptr_t outer_try_index = (outer_try_block != NULL)
+      ? outer_try_block->try_index()
+      : CatchClauseNode::kInvalidTryIndex;
 
   // Finally parse the 'finally' block.
   SequenceNode* finally_block = NULL;
@@ -6565,7 +6598,8 @@
       finally_block = ParseFinallyBlock();
       InlinedFinallyNode* node = new InlinedFinallyNode(finally_pos,
                                                         finally_block,
-                                                        context_var);
+                                                        context_var,
+                                                        outer_try_index);
       AddFinallyBlockToNode(node_to_inline, node);
       node_index += 1;
       node_to_inline = inner_try_block->GetNodeToInlineFinally(node_index);
@@ -6592,14 +6626,17 @@
                           Array::ZoneHandle(Array::MakeArray(handler_types)),
                           context_var,
                           catch_excp_var,
-                          catch_trace_var);
+                          catch_trace_var,
+                          (finally_block != NULL)
+                              ? AllocateTryIndex()
+                              : CatchClauseNode::kInvalidTryIndex);
 
   // Now create the try/catch ast node and return it. If there is a label
   // on the try/catch, close the block that's embedding the try statement
   // and attach the label to it.
   AstNode* try_catch_node =
       new TryCatchNode(try_pos, try_block, end_catch_label,
-                       context_var, catch_block, finally_block);
+                       context_var, catch_block, finally_block, try_index);
 
   if (try_label != NULL) {
     current_block_->statements->Add(try_catch_node);
@@ -8564,7 +8601,6 @@
         // be found.
         AstNode* receiver = NULL;
         const bool kTestOnly = true;
-        ASSERT(!current_function().IsInFactoryScope());
         if (!current_function().is_static() &&
             (LookupReceiver(current_block_->scope, kTestOnly) != NULL)) {
           receiver = LoadReceiver(ident_pos);
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index be417ae..92c30cb 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -686,6 +686,10 @@
   // done using 'return', 'break' or 'continue' statements.
   TryBlocks* try_blocks_list_;
 
+  // Each try in this function gets its own try index.
+  intptr_t AllocateTryIndex() { return ++last_used_try_index_; }
+  intptr_t last_used_try_index_;
+
   DISALLOW_COPY_AND_ASSIGN(Parser);
 };
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 80e1404..08a6516 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -176,7 +176,7 @@
   kSmiTagShift = 1,
 };
 
-enum TypeDataElementType {
+enum TypedDataElementType {
 #define V(name) k##name##Element,
 CLASS_LIST_TYPED_DATA(V)
 #undef V
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index dd084ff..e721cd7 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -309,7 +309,7 @@
   for (intptr_t i = 0; i < variables_.length(); i++) {
     LocalVariable* var = variables_[i];
     ASSERT(var->name().IsSymbol());
-    if ((var->name().raw() == name.raw()) && !var->is_invisible_) {
+    if (var->name().raw() == name.raw()) {
       return var;
     }
   }
@@ -321,7 +321,7 @@
   LocalScope* current_scope = this;
   while (current_scope != NULL) {
     LocalVariable* var = current_scope->LocalLookupVariable(name);
-    if (var != NULL) {
+    if ((var != NULL) && !var->is_invisible_) {
       if (!test_only) {
         if (var->owner()->function_level() != function_level()) {
           var->set_is_captured();
@@ -342,6 +342,30 @@
 }
 
 
+bool LocalScope::CaptureVariable(const String& name) {
+  ASSERT(name.IsSymbol());
+  LocalScope* current_scope = this;
+  while (current_scope != NULL) {
+    LocalVariable* var = current_scope->LocalLookupVariable(name);
+    if (var != NULL) {
+      if (var->owner()->function_level() != function_level()) {
+        var->set_is_captured();
+      }
+      // Insert aliases of the variable in intermediate scopes.
+      LocalScope* intermediate_scope = this;
+      while (intermediate_scope != current_scope) {
+        intermediate_scope->variables_.Add(var);
+        ASSERT(var->owner() != intermediate_scope);  // Item is an alias.
+        intermediate_scope = intermediate_scope->parent();
+      }
+      return true;
+    }
+    current_scope = current_scope->parent();
+  }
+  return false;
+}
+
+
 SourceLabel* LocalScope::LookupLabel(const String& name) {
   LocalScope* current_scope = this;
   while (current_scope != NULL) {
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index fa95e9d..edf6749 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -283,6 +283,11 @@
   // Returns NULL if this scope is not embedded in a switch.
   LocalScope* LookupSwitchScope();
 
+  // Looks up variable in this scope and mark as captured if applicable.
+  // Finds the variable even if it is marked invisible. Returns true if
+  // the variable was found, false if it was not found.
+  bool CaptureVariable(const String& name);
+
   // Look for unresolved forward references to labels in this scope.
   // If there are any, propagate the forward reference to the next
   // outer scope of a switch statement. If there is no outer switch
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index ffb08c0f..d19dbe1 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -7,12 +7,14 @@
 #include "vm/isolate.h"
 #include "vm/message.h"
 #include "vm/object.h"
+#include "vm/object_id_ring.h"
+#include "vm/object_store.h"
 #include "vm/port.h"
 #include "vm/service.h"
 
 namespace dart {
 
-typedef RawString* (*ServiceMessageHandler)(Isolate* isolate);
+typedef void (*ServiceMessageHandler)(Isolate* isolate, JSONStream* stream);
 
 struct ServiceMessageHandlerEntry {
   const char* command;
@@ -73,33 +75,94 @@
 
     ServiceMessageHandler handler =
         FindServiceMessageHandler(pathSegment.ToCString());
-    String& reply = String::Handle();
-    reply ^= handler(isolate);
-    ASSERT(!reply.IsNull());
-    PostReply(reply, reply_port);
+    ASSERT(handler != NULL);
+    {
+      TextBuffer buffer(256);
+      JSONStream js(&buffer);
+
+      // Setup JSONStream arguments and options. The arguments and options
+      // are zone allocated and will be freed immediately after handling the
+      // message.
+      Zone* zoneAllocator = zone.GetZone();
+      const char** arguments = zoneAllocator->Alloc<const char*>(path.Length());
+      String& string_iterator = String::Handle();
+      for (intptr_t i = 0; i < path.Length(); i++) {
+        string_iterator ^= path.At(i);
+        arguments[i] =
+            zoneAllocator->MakeCopyOfString(string_iterator.ToCString());
+      }
+      js.SetArguments(arguments, path.Length());
+      if (option_keys.Length() > 0) {
+        const char** option_keys_native =
+            zoneAllocator->Alloc<const char*>(option_keys.Length());
+        const char** option_values_native =
+            zoneAllocator->Alloc<const char*>(option_keys.Length());
+        for (intptr_t i = 0; i < option_keys.Length(); i++) {
+          string_iterator ^= option_keys.At(i);
+          option_keys_native[i] =
+              zoneAllocator->MakeCopyOfString(string_iterator.ToCString());
+          string_iterator ^= option_values.At(i);
+          option_values_native[i] =
+              zoneAllocator->MakeCopyOfString(string_iterator.ToCString());
+        }
+        js.SetOptions(option_keys_native, option_values_native,
+                      option_keys.Length());
+      }
+
+      handler(isolate, &js);
+      const String& reply = String::Handle(String::New(buffer.buf()));
+      ASSERT(!reply.IsNull());
+      PostReply(reply, reply_port);
+    }
   }
 }
 
 
-static RawString* HandleName(Isolate* isolate) {
-  TextBuffer buffer(256);
-  JSONStream js(&buffer);
-  js.OpenObject();
-  js.PrintProperty("type", "IsolateName");
-  js.PrintProperty("id", static_cast<intptr_t>(isolate->main_port()));
-  js.PrintProperty("name", isolate->name());
-  js.CloseObject();
-  return String::New(buffer.buf());
+static void PrintArgumentsAndOptions(JSONStream* js) {
+  js->OpenObject("message");
+  js->OpenArray("arguments");
+  for (intptr_t i = 0; i < js->num_arguments(); i++) {
+    js->PrintValue(js->GetArgument(i));
+  }
+  js->CloseArray();
+  js->OpenArray("option_keys");
+  for (intptr_t i = 0; i < js->num_options(); i++) {
+    js->PrintValue(js->GetOptionKey(i));
+  }
+  js->CloseArray();
+  js->OpenArray("option_values");
+  for (intptr_t i = 0; i < js->num_options(); i++) {
+    js->PrintValue(js->GetOptionValue(i));
+  }
+  js->CloseArray();
+  js->CloseObject();
 }
 
 
-RawString* HandleStackTrace(Isolate* isolate) {
-  TextBuffer buffer(256);
-  JSONStream js(&buffer);
+static void PrintCollectionErrorResponse(const char* collection_name,
+                                         JSONStream* js) {
+  js->OpenObject();
+  js->PrintProperty("type", "error");
+  js->PrintfProperty("text", "Must specify collection object id: /%s/id",
+                     collection_name);
+  js->CloseObject();
+}
+
+
+static void HandleName(Isolate* isolate, JSONStream* js) {
+  js->OpenObject();
+  js->PrintProperty("type", "IsolateName");
+  js->PrintProperty("id", static_cast<intptr_t>(isolate->main_port()));
+  js->PrintProperty("name", isolate->name());
+  js->CloseObject();
+}
+
+
+static void HandleStackTrace(Isolate* isolate, JSONStream* js) {
   DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
-  js.OpenObject();
-  js.PrintProperty("type", "StackTrace");
-  js.OpenArray("members");
+  js->OpenObject();
+  js->PrintProperty("type", "StackTrace");
+  js->OpenArray("members");
   intptr_t n_frames = stack->Length();
   String& url = String::Handle();
   String& function = String::Handle();
@@ -107,33 +170,84 @@
     ActivationFrame* frame = stack->ActivationFrameAt(i);
     url ^= frame->SourceUrl();
     function ^= frame->function().UserVisibleName();
-    js.OpenObject();
-    js.PrintProperty("name", function.ToCString());
-    js.PrintProperty("url", url.ToCString());
-    js.PrintProperty("line", frame->LineNumber());
-    js.PrintProperty("function", frame->function());
-    js.PrintProperty("code", frame->code());
-    js.CloseObject();
+    js->OpenObject();
+    js->PrintProperty("name", function.ToCString());
+    js->PrintProperty("url", url.ToCString());
+    js->PrintProperty("line", frame->LineNumber());
+    js->PrintProperty("function", frame->function());
+    js->PrintProperty("code", frame->code());
+    js->CloseObject();
   }
-  js.CloseArray();
-  js.CloseObject();
-  return String::New(buffer.buf());
+  js->CloseArray();
+  js->CloseObject();
 }
 
 
-RawString* HandleObjectHistogram(Isolate* isolate) {
-  TextBuffer buffer(256);
-  JSONStream js(&buffer);
+static void HandleObjectHistogram(Isolate* isolate, JSONStream* js) {
   ObjectHistogram* histogram = Isolate::Current()->object_histogram();
   if (histogram == NULL) {
-    js.OpenObject();
-    js.PrintProperty("type", "ObjectHistogram");
-    js.PrintProperty("error", "Run with --print_object_histogram");
-    js.CloseObject();
-    return String::New(buffer.buf());
+    js->OpenObject();
+    js->PrintProperty("type", "error");
+    js->PrintProperty("text", "Run with --print_object_histogram");
+    js->CloseObject();
+    return;
   }
-  histogram->PrintToJSONStream(&js);
-  return String::New(buffer.buf());
+  histogram->PrintToJSONStream(js);
+}
+
+
+static void HandleEcho(Isolate* isolate, JSONStream* js) {
+  js->OpenObject();
+  js->PrintProperty("type", "message");
+  PrintArgumentsAndOptions(js);
+  js->CloseObject();
+}
+
+// Print an error message if there is no ID argument.
+#define REQUIRE_COLLECTION_ID(collection)                                      \
+  if (js->num_arguments() == 1) {                                              \
+    PrintCollectionErrorResponse(collection, js);                              \
+    return;                                                                    \
+  }
+
+// Print a Dart object to the stream if found in ring. Otherwise print null.
+#define PRINT_RING_OBJ(type)                                                   \
+  ASSERT(js->num_arguments() >= 2);                                            \
+  ObjectIdRing* ring = isolate->object_id_ring();                              \
+  ASSERT(ring != NULL);                                                        \
+  intptr_t id = atoi(js->GetArgument(1));                                      \
+  Object& obj = Object::Handle(ring->GetObjectForId(id));                      \
+  if (!obj.Is##type()) {                                                       \
+    /* Object is not type, replace with null. */                               \
+    obj = Object::null();                                                      \
+  }                                                                            \
+  js->PrintValue(obj, false)
+
+
+static void HandleLibraries(Isolate* isolate, JSONStream* js) {
+  if (js->num_arguments() == 1) {
+    js->PrintValue(Library::Handle(isolate->object_store()->root_library()));
+    return;
+  }
+  PRINT_RING_OBJ(Library);
+}
+
+
+static void HandleFunctions(Isolate* isolate, JSONStream* js) {
+  REQUIRE_COLLECTION_ID("functions");
+  PRINT_RING_OBJ(Function);
+}
+
+
+static void HandleClasses(Isolate* isolate, JSONStream* js) {
+  REQUIRE_COLLECTION_ID("classes");
+  PRINT_RING_OBJ(Class);
+}
+
+
+static void HandleCodes(Isolate* isolate, JSONStream* js) {
+  REQUIRE_COLLECTION_ID("codes");
+  PRINT_RING_OBJ(Code);
 }
 
 
@@ -141,17 +255,20 @@
   { "name", HandleName },
   { "stacktrace", HandleStackTrace },
   { "objecthistogram", HandleObjectHistogram},
+  { "libraries", HandleLibraries },
+  { "functions", HandleFunctions },
+  { "classes", HandleClasses },
+  { "codes", HandleCodes },
+  { "_echo", HandleEcho },
 };
 
 
-static RawString* HandleFallthrough(Isolate* isolate) {
-  TextBuffer buffer(256);
-  JSONStream js(&buffer);
-  js.OpenObject();
-  js.PrintProperty("type", "error");
-  js.PrintProperty("text", "request not supported.");
-  js.CloseObject();
-  return String::New(buffer.buf());
+static void HandleFallthrough(Isolate* isolate, JSONStream* js) {
+  js->OpenObject();
+  js->PrintProperty("type", "error");
+  js->PrintProperty("text", "request not understood.");
+  PrintArgumentsAndOptions(js);
+  js->CloseObject();
 }
 
 
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 3469ab7..7826a37 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -1491,7 +1491,8 @@
 typedef double (*SimulatorLeafFloatRuntimeCall)(double d0, double d1);
 
 // Calls to native Dart functions are based on this interface.
-typedef void (*SimulatorNativeCall)(NativeArguments* arguments);
+typedef void (*SimulatorBootstrapNativeCall)(NativeArguments* arguments);
+typedef void (*SimulatorNativeCall)(NativeArguments* arguments, uword target);
 
 
 void Simulator::SupervisorCall(Instr* instr) {
@@ -1509,6 +1510,7 @@
         }
 
         if ((redirection->call_kind() == kRuntimeCall) ||
+            (redirection->call_kind() == kBootstrapNativeCall) ||
             (redirection->call_kind() == kNativeCall)) {
           // Set the top_exit_frame_info of this simulator to the native stack.
           set_top_exit_frame_info(reinterpret_cast<uword>(&buffer));
@@ -1548,13 +1550,21 @@
           double d1 = get_dregister(D1);
           d0 = target(d0, d1);
           set_dregister(D0, d0);
+        } else if (redirection->call_kind() == kBootstrapNativeCall) {
+          NativeArguments* arguments;
+          arguments = reinterpret_cast<NativeArguments*>(get_register(R0));
+          SimulatorBootstrapNativeCall target =
+              reinterpret_cast<SimulatorBootstrapNativeCall>(external);
+          target(arguments);
+          set_register(R0, icount_);  // Zap result register from void function.
         } else {
           ASSERT(redirection->call_kind() == kNativeCall);
           NativeArguments* arguments;
           arguments = reinterpret_cast<NativeArguments*>(get_register(R0));
+          uword target_func = get_register(R1);
           SimulatorNativeCall target =
               reinterpret_cast<SimulatorNativeCall>(external);
-          target(arguments);
+          target(arguments, target_func);
           set_register(R0, icount_);  // Zap result register from void function.
         }
         set_top_exit_frame_info(0);
diff --git a/runtime/vm/simulator_arm.h b/runtime/vm/simulator_arm.h
index 09c7667..0b488a4 100644
--- a/runtime/vm/simulator_arm.h
+++ b/runtime/vm/simulator_arm.h
@@ -105,6 +105,7 @@
     kRuntimeCall,
     kLeafRuntimeCall,
     kLeafFloatRuntimeCall,
+    kBootstrapNativeCall,
     kNativeCall
   };
   static uword RedirectExternalReference(uword function,
diff --git a/runtime/vm/simulator_mips.cc b/runtime/vm/simulator_mips.cc
index 9d33b46..fa8dbb8 100644
--- a/runtime/vm/simulator_mips.cc
+++ b/runtime/vm/simulator_mips.cc
@@ -973,7 +973,8 @@
 typedef double (*SimulatorLeafFloatRuntimeCall)(double d0, double d1);
 
 // Calls to native Dart functions are based on this interface.
-typedef void (*SimulatorNativeCall)(NativeArguments* arguments);
+typedef void (*SimulatorBootstrapNativeCall)(NativeArguments* arguments);
+typedef void (*SimulatorNativeCall)(NativeArguments* arguments, uword target);
 
 
 void Simulator::DoBreak(Instr *instr) {
@@ -1008,6 +1009,7 @@
       }
 
       if ((redirection->call_kind() == kRuntimeCall) ||
+          (redirection->call_kind() == kBootstrapNativeCall) ||
           (redirection->call_kind() == kNativeCall)) {
         // Set the top_exit_frame_info of this simulator to the native stack.
         set_top_exit_frame_info(reinterpret_cast<uword>(&buffer));
@@ -1045,13 +1047,22 @@
         double d7 = get_fregister_double(F14);
         d0 = target(d6, d7);
         set_fregister_double(F0, d0);
+      } else if (redirection->call_kind() == kBootstrapNativeCall) {
+        NativeArguments* arguments;
+        arguments = reinterpret_cast<NativeArguments*>(get_register(A0));
+        SimulatorBootstrapNativeCall target =
+            reinterpret_cast<SimulatorBootstrapNativeCall>(external);
+        target(arguments);
+        set_register(V0, icount_);  // Zap result register from void function.
+        set_register(V1, icount_);
       } else {
         ASSERT(redirection->call_kind() == kNativeCall);
         NativeArguments* arguments;
         arguments = reinterpret_cast<NativeArguments*>(get_register(A0));
+        uword target_func = get_register(A1);
         SimulatorNativeCall target =
             reinterpret_cast<SimulatorNativeCall>(external);
-        target(arguments);
+        target(arguments, target_func);
         set_register(V0, icount_);  // Zap result register from void function.
         set_register(V1, icount_);
       }
diff --git a/runtime/vm/simulator_mips.h b/runtime/vm/simulator_mips.h
index db95370..b6fded0 100644
--- a/runtime/vm/simulator_mips.h
+++ b/runtime/vm/simulator_mips.h
@@ -115,6 +115,7 @@
     kRuntimeCall,
     kLeafRuntimeCall,
     kLeafFloatRuntimeCall,
+    kBootstrapNativeCall,
     kNativeCall
   };
   static uword RedirectExternalReference(uword function,
diff --git a/runtime/vm/stack_frame_test.cc b/runtime/vm/stack_frame_test.cc
index b0ae1e5..fc5e269 100644
--- a/runtime/vm/stack_frame_test.cc
+++ b/runtime/vm/stack_frame_test.cc
@@ -75,7 +75,6 @@
 
 
 void FUNCTION_NAME(StackFrame_validateFrame)(Dart_NativeArguments args) {
-  Dart_EnterScope();
   Dart_Handle index = Dart_GetNativeArgument(args, 0);
   Dart_Handle name = Dart_GetNativeArgument(args, 1);
   const Smi& frame_index_smi = Smi::CheckedHandle(Api::UnwrapHandle(index));
@@ -108,7 +107,6 @@
       if (strcmp(full_name, name) != 0) {
         FATAL("StackFrame_validateFrame fails, incorrect frame.\n");
       }
-      Dart_ExitScope();
       return;
     }
     count += 1;  // Count the dart frames.
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 9d7a08e..e4f18a2 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -22,6 +22,7 @@
 #define VM_STUB_CODE_LIST(V)                                                   \
   V(CallToRuntime)                                                             \
   V(PrintStopMessage)                                                          \
+  V(CallBootstrapCFunction)                                                    \
   V(CallNativeCFunction)                                                       \
   V(AllocateArray)                                                             \
   V(CallNoSuchMethodFunction)                                                  \
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index bf9b5e4..b101db7 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -173,6 +173,92 @@
   // For now, space is reserved on the stack and we pass a pointer to it.
   __ stm(IA, SP,  (1 << R0) | (1 << R1) | (1 << R2) | (1 << R3));
   __ mov(R0, ShifterOperand(SP));  // Pass the pointer to the NativeArguments.
+  __ mov(R1, ShifterOperand(R5));  // Pass the function entrypoint to call.
+
+  // Call native function invocation wrapper or redirection via simulator.
+#if defined(USING_SIMULATOR)
+  uword entry = reinterpret_cast<uword>(NativeEntry::NativeCallWrapper);
+  entry = Simulator::RedirectExternalReference(
+      entry, Simulator::kNativeCall, NativeEntry::kNumCallWrapperArguments);
+  __ LoadImmediate(R2, entry);
+  __ blx(R2);
+#else
+  __ BranchLink(&NativeEntry::NativeCallWrapperLabel());
+#endif
+
+  // Reset exit frame information in Isolate structure.
+  __ LoadImmediate(R2, 0);
+  __ StoreToOffset(kWord, R2, CTX, Isolate::top_exit_frame_info_offset());
+
+  // Load Context pointer from Isolate structure into R2.
+  __ LoadFromOffset(kWord, R2, CTX, Isolate::top_context_offset());
+
+  // Reset Context pointer in Isolate structure.
+  __ LoadImmediate(R3, reinterpret_cast<intptr_t>(Object::null()));
+  __ StoreToOffset(kWord, R3, CTX, Isolate::top_context_offset());
+
+  // Cache Context pointer into CTX while executing Dart code.
+  __ mov(CTX, ShifterOperand(R2));
+
+  __ LeaveFrame((1 << FP) | (1 << LR));
+  __ Ret();
+}
+
+
+// Input parameters:
+//   LR : return address.
+//   SP : address of return value.
+//   R5 : address of the native function to call.
+//   R2 : address of first argument in argument array.
+//   R1 : argc_tag including number of arguments and function kind.
+void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) {
+  const intptr_t isolate_offset = NativeArguments::isolate_offset();
+  const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
+  const intptr_t argv_offset = NativeArguments::argv_offset();
+  const intptr_t retval_offset = NativeArguments::retval_offset();
+
+  __ EnterFrame((1 << FP) | (1 << LR), 0);
+
+  // Load current Isolate pointer from Context structure into R0.
+  __ ldr(R0, FieldAddress(CTX, Context::isolate_offset()));
+
+  // Save exit frame information to enable stack walking as we are about
+  // to transition to native code.
+  __ StoreToOffset(kWord, SP, R0, Isolate::top_exit_frame_info_offset());
+
+  // Save current Context pointer into Isolate structure.
+  __ StoreToOffset(kWord, CTX, R0, Isolate::top_context_offset());
+
+  // Cache Isolate pointer into CTX while executing native code.
+  __ mov(CTX, ShifterOperand(R0));
+
+  // Reserve space for the native arguments structure passed on the stack (the
+  // outgoing pointer parameter to the native arguments structure is passed in
+  // R0) and align frame before entering the C++ world.
+  __ ReserveAlignedFrameSpace(sizeof(NativeArguments));
+
+  // Initialize NativeArguments structure and call native function.
+  // Registers R0, R1, R2, and R3 are used.
+
+  ASSERT(isolate_offset == 0 * kWordSize);
+  // Set isolate in NativeArgs: R0 already contains CTX.
+
+  // There are no native calls to closures, so we do not need to set the tag
+  // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
+  ASSERT(argc_tag_offset == 1 * kWordSize);
+  // Set argc in NativeArguments: R1 already contains argc.
+
+  ASSERT(argv_offset == 2 * kWordSize);
+  // Set argv in NativeArguments: R2 already contains argv.
+
+  ASSERT(retval_offset == 3 * kWordSize);
+  __ add(R3, FP, ShifterOperand(2 * kWordSize));  // Set retval in NativeArgs.
+
+  // TODO(regis): Should we pass the structure by value as in runtime calls?
+  // It would require changing Dart API for native functions.
+  // For now, space is reserved on the stack and we pass a pointer to it.
+  __ stm(IA, SP,  (1 << R0) | (1 << R1) | (1 << R2) | (1 << R3));
+  __ mov(R0, ShifterOperand(SP));  // Pass the pointer to the NativeArguments.
 
   // Call native function or redirection via simulator.
   __ blx(R5);
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 6dd0a85..f5e4ed1 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -121,6 +121,78 @@
 //   EDX : argc_tag including number of arguments and function kind.
 // Uses EDI.
 void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) {
+  const intptr_t native_args_struct_offset =
+      NativeEntry::kNumCallWrapperArguments * kWordSize;
+  const intptr_t isolate_offset =
+      NativeArguments::isolate_offset() + native_args_struct_offset;
+  const intptr_t argc_tag_offset =
+      NativeArguments::argc_tag_offset() + native_args_struct_offset;
+  const intptr_t argv_offset =
+      NativeArguments::argv_offset() + native_args_struct_offset;
+  const intptr_t retval_offset =
+      NativeArguments::retval_offset() + native_args_struct_offset;
+
+  __ EnterFrame(0);
+
+  // Load current Isolate pointer from Context structure into EDI.
+  __ movl(EDI, FieldAddress(CTX, Context::isolate_offset()));
+
+  // Save exit frame information to enable stack walking as we are about
+  // to transition to dart VM code.
+  __ movl(Address(EDI, Isolate::top_exit_frame_info_offset()), ESP);
+
+  // Save current Context pointer into Isolate structure.
+  __ movl(Address(EDI, Isolate::top_context_offset()), CTX);
+
+  // Cache Isolate pointer into CTX while executing native code.
+  __ movl(CTX, EDI);
+
+  // Reserve space for the native arguments structure, the outgoing parameters
+  // (pointer to the native arguments structure, the C function entry point)
+  // and align frame before entering the C++ world.
+  __ AddImmediate(ESP, Immediate(-sizeof(NativeArguments) - (2 * kWordSize)));
+  if (OS::ActivationFrameAlignment() > 0) {
+    __ andl(ESP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
+  }
+
+  // Pass NativeArguments structure by value and call native function.
+  __ movl(Address(ESP, isolate_offset), CTX);  // Set isolate in NativeArgs.
+  __ movl(Address(ESP, argc_tag_offset), EDX);  // Set argc in NativeArguments.
+  __ movl(Address(ESP, argv_offset), EAX);  // Set argv in NativeArguments.
+  __ leal(EAX, Address(EBP, 2 * kWordSize));  // Compute return value addr.
+  __ movl(Address(ESP, retval_offset), EAX);  // Set retval in NativeArguments.
+  __ leal(EAX, Address(ESP, 2 * kWordSize));  // Pointer to the NativeArguments.
+  __ movl(Address(ESP, 0), EAX);  // Pass the pointer to the NativeArguments.
+  __ movl(Address(ESP, kWordSize), ECX);  // Function to call.
+  __ call(&NativeEntry::NativeCallWrapperLabel());
+
+  // Reset exit frame information in Isolate structure.
+  __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
+
+  // Load Context pointer from Isolate structure into EDI.
+  __ movl(EDI, Address(CTX, Isolate::top_context_offset()));
+
+  // Reset Context pointer in Isolate structure.
+  const Immediate& raw_null =
+      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  __ movl(Address(CTX, Isolate::top_context_offset()), raw_null);
+
+  // Cache Context pointer into CTX while executing Dart code.
+  __ movl(CTX, EDI);
+
+  __ LeaveFrame();
+  __ ret();
+}
+
+
+// Input parameters:
+//   ESP : points to return address.
+//   ESP + 4 : address of return value.
+//   EAX : address of first argument in argument array.
+//   ECX : address of the native function to call.
+//   EDX : argc_tag including number of arguments and function kind.
+// Uses EDI.
+void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) {
   const intptr_t native_args_struct_offset = kWordSize;
   const intptr_t isolate_offset =
       NativeArguments::isolate_offset() + native_args_struct_offset;
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 115bd84..bdb2981 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -189,6 +189,103 @@
   __ sw(A1, Address(SP, 1 * kWordSize));
   __ sw(A0, Address(SP, 0 * kWordSize));
   __ mov(A0, SP);  // Pass the pointer to the NativeArguments.
+  __ mov(A1, T5);  // Pass the function entrypoint.
+
+  __ ReserveAlignedFrameSpace(2 * kWordSize);  // Just passing A0, A1.
+
+  // Call native wrapper function or redirection via simulator.
+#if defined(USING_SIMULATOR)
+  uword entry = reinterpret_cast<uword>(NativeEntry::NativeCallWrapper);
+  entry = Simulator::RedirectExternalReference(
+      entry, Simulator::kNativeCall, NativeEntry::kNumCallWrapperArguments);
+  __ LoadImmediate(T5, entry);
+  __ jalr(T5);
+#else
+  __ BranchLink(&NativeEntry::NativeCallWrapperLabel());
+#endif
+  __ TraceSimMsg("CallNativeCFunctionStub return");
+
+  // Reset exit frame information in Isolate structure.
+  __ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
+
+  // Load Context pointer from Isolate structure into A2.
+  __ lw(A2, Address(CTX, Isolate::top_context_offset()));
+
+  // Load null.
+  __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
+
+  // Reset Context pointer in Isolate structure.
+  __ sw(TMP, Address(CTX, Isolate::top_context_offset()));
+
+  // Cache Context pointer into CTX while executing Dart code.
+  __ mov(CTX, A2);
+
+  __ mov(SP, FP);
+  __ lw(RA, Address(SP, 1 * kWordSize));
+  __ lw(FP, Address(SP, 0 * kWordSize));
+  __ Ret();
+  __ delay_slot()->addiu(SP, SP, Immediate(2 * kWordSize));
+}
+
+
+// Input parameters:
+//   RA : return address.
+//   SP : address of return value.
+//   T5 : address of the native function to call.
+//   A2 : address of first argument in argument array.
+//   A1 : argc_tag including number of arguments and function kind.
+void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) {
+  const intptr_t isolate_offset = NativeArguments::isolate_offset();
+  const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
+  const intptr_t argv_offset = NativeArguments::argv_offset();
+  const intptr_t retval_offset = NativeArguments::retval_offset();
+
+  __ SetPrologueOffset();
+  __ TraceSimMsg("CallNativeCFunctionStub");
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ sw(RA, Address(SP, 1 * kWordSize));
+  __ sw(FP, Address(SP, 0 * kWordSize));
+  __ mov(FP, SP);
+
+  // Load current Isolate pointer from Context structure into A0.
+  __ lw(A0, FieldAddress(CTX, Context::isolate_offset()));
+
+  // Save exit frame information to enable stack walking as we are about
+  // to transition to native code.
+  __ sw(SP, Address(A0, Isolate::top_exit_frame_info_offset()));
+
+  // Save current Context pointer into Isolate structure.
+  __ sw(CTX, Address(A0, Isolate::top_context_offset()));
+
+  // Cache Isolate pointer into CTX while executing native code.
+  __ mov(CTX, A0);
+
+  // Initialize NativeArguments structure and call native function.
+  // Registers A0, A1, A2, and A3 are used.
+
+  ASSERT(isolate_offset == 0 * kWordSize);
+  // Set isolate in NativeArgs: A0 already contains CTX.
+
+  // There are no native calls to closures, so we do not need to set the tag
+  // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
+  ASSERT(argc_tag_offset == 1 * kWordSize);
+  // Set argc in NativeArguments: A1 already contains argc.
+
+  ASSERT(argv_offset == 2 * kWordSize);
+  // Set argv in NativeArguments: A2 already contains argv.
+
+  ASSERT(retval_offset == 3 * kWordSize);
+  __ addiu(A3, FP, Immediate(2 * kWordSize));  // Set retval in NativeArgs.
+
+  // TODO(regis): Should we pass the structure by value as in runtime calls?
+  // It would require changing Dart API for native functions.
+  // For now, space is reserved on the stack and we pass a pointer to it.
+  __ addiu(SP, SP, Immediate(-4 * kWordSize));
+  __ sw(A3, Address(SP, 3 * kWordSize));
+  __ sw(A2, Address(SP, 2 * kWordSize));
+  __ sw(A1, Address(SP, 1 * kWordSize));
+  __ sw(A0, Address(SP, 0 * kWordSize));
+  __ mov(A0, SP);  // Pass the pointer to the NativeArguments.
 
   __ ReserveAlignedFrameSpace(kWordSize);  // Just passing A0.
 
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index c12b959..a0da196 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -28,6 +28,7 @@
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
+
 // Input parameters:
 //   RSP : points to return address.
 //   RSP + 8 : address of last argument in argument array.
@@ -161,6 +162,75 @@
   __ leaq(RAX, Address(RBP, 2 * kWordSize));  // Compute return value addr.
   __ movq(Address(RSP, retval_offset), RAX);  // Set retval in NativeArguments.
   __ movq(RDI, RSP);  // Pass the pointer to the NativeArguments.
+  __ movq(RSI, RBX);  // Pass pointer to function entrypoint.
+  __ call(&NativeEntry::NativeCallWrapperLabel());
+
+  // Reset exit frame information in Isolate structure.
+  __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
+
+  // Load Context pointer from Isolate structure into R8.
+  __ movq(R8, Address(CTX, Isolate::top_context_offset()));
+
+  // Reset Context pointer in Isolate structure.
+  const Immediate& raw_null =
+      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  __ movq(Address(CTX, Isolate::top_context_offset()), raw_null);
+
+  // Cache Context pointer into CTX while executing Dart code.
+  __ movq(CTX, R8);
+
+  __ LeaveFrame();
+  __ ret();
+}
+
+
+// Input parameters:
+//   RSP : points to return address.
+//   RSP + 8 : address of return value.
+//   RAX : address of first argument in argument array.
+//   RBX : address of the native function to call.
+//   R10 : argc_tag including number of arguments and function kind.
+void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) {
+  const intptr_t native_args_struct_offset = 0;
+  const intptr_t isolate_offset =
+      NativeArguments::isolate_offset() + native_args_struct_offset;
+  const intptr_t argc_tag_offset =
+      NativeArguments::argc_tag_offset() + native_args_struct_offset;
+  const intptr_t argv_offset =
+      NativeArguments::argv_offset() + native_args_struct_offset;
+  const intptr_t retval_offset =
+      NativeArguments::retval_offset() + native_args_struct_offset;
+
+  __ EnterFrame(0);
+
+  // Load current Isolate pointer from Context structure into R8.
+  __ movq(R8, FieldAddress(CTX, Context::isolate_offset()));
+
+  // Save exit frame information to enable stack walking as we are about
+  // to transition to native code.
+  __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), RSP);
+
+  // Save current Context pointer into Isolate structure.
+  __ movq(Address(R8, Isolate::top_context_offset()), CTX);
+
+  // Cache Isolate pointer into CTX while executing native code.
+  __ movq(CTX, R8);
+
+  // Reserve space for the native arguments structure passed on the stack (the
+  // outgoing pointer parameter to the native arguments structure is passed in
+  // RDI) and align frame before entering the C++ world.
+  __ AddImmediate(RSP, Immediate(-sizeof(NativeArguments)));
+  if (OS::ActivationFrameAlignment() > 0) {
+    __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
+  }
+
+  // Pass NativeArguments structure by value and call native function.
+  __ movq(Address(RSP, isolate_offset), CTX);  // Set isolate in NativeArgs.
+  __ movq(Address(RSP, argc_tag_offset), R10);  // Set argc in NativeArguments.
+  __ movq(Address(RSP, argv_offset), RAX);  // Set argv in NativeArguments.
+  __ leaq(RAX, Address(RBP, 2 * kWordSize));  // Compute return value addr.
+  __ movq(Address(RSP, retval_offset), RAX);  // Set retval in NativeArguments.
+  __ movq(RDI, RSP);  // Pass the pointer to the NativeArguments.
   __ call(RBX);
 
   // Reset exit frame information in Isolate structure.
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 9edb6bf..35f7d79 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -34,12 +34,11 @@
   V(ClosureParameter, ":closure")                                              \
   V(PhaseParameter, ":phase")                                                  \
   V(TypeArgumentsParameter, ":type_arguments")                                 \
-  V(AssertionError, "_AssertionErrorImplementation")                           \
-  V(CastError, "_CastErrorImplementation")                                     \
-  V(TypeError, "_TypeErrorImplementation")                                     \
-  V(FallThroughError, "_FallThroughErrorImplementation")                       \
-  V(AbstractClassInstantiationError,                                           \
-    "_AbstractClassInstantiationErrorImplementation")                          \
+  V(AssertionError, "AssertionError")                                          \
+  V(CastError, "CastError")                                                    \
+  V(TypeError, "TypeError")                                                    \
+  V(FallThroughError, "FallThroughError")                                      \
+  V(AbstractClassInstantiationError, "AbstractClassInstantiationError")        \
   V(NoSuchMethodError, "NoSuchMethodError")                                    \
   V(ThrowNew, "_throwNew")                                                     \
   V(List, "List")                                                              \
@@ -218,6 +217,8 @@
   V(_handleMessage, "_handleMessage")                                          \
   V(_SendPortImpl, "_SendPortImpl")                                            \
   V(_create, "_create")                                                        \
+  V(DotCreate, "._create")                                                     \
+  V(DotWithType, "._withType")                                                 \
   V(_id, "_id")                                                                \
   V(_get_or_create, "_get_or_create")                                          \
   V(RangeError, "RangeError")                                                  \
diff --git a/runtime/vm/verifier.h b/runtime/vm/verifier.h
index ae96f02..a622955 100644
--- a/runtime/vm/verifier.h
+++ b/runtime/vm/verifier.h
@@ -12,15 +12,6 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, verify_on_transition);
-
-#define VERIFY_ON_TRANSITION                                                   \
-  if (FLAG_verify_on_transition) {                                             \
-    VerifyPointersVisitor::VerifyPointers();                                   \
-    Isolate::Current()->heap()->Verify();                                      \
-  }                                                                            \
-
-
 // Forward declarations.
 class Isolate;
 class ObjectSet;
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 801bf15..cea087a 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -226,7 +226,6 @@
     'message_handler.h',
     'message_handler_test.cc',
     'message_test.cc',
-    'native_arguments.cc',
     'native_arguments.h',
     'native_entry.cc',
     'native_entry.h',
diff --git a/runtime/vm/zone.cc b/runtime/vm/zone.cc
index 4638695..5b43216 100644
--- a/runtime/vm/zone.cc
+++ b/runtime/vm/zone.cc
@@ -75,32 +75,6 @@
 }
 
 
-Zone::Zone()
-    : initial_buffer_(buffer_, kInitialChunkSize),
-      position_(initial_buffer_.start()),
-      limit_(initial_buffer_.end()),
-      head_(NULL),
-      large_segments_(NULL),
-      handles_(),
-      previous_(NULL) {
-#ifdef DEBUG
-  // Zap the entire initial buffer.
-  memset(initial_buffer_.pointer(), kZapUninitializedByte,
-         initial_buffer_.size());
-#endif
-}
-
-
-Zone::~Zone() {
-#if defined(DEBUG)
-  if (FLAG_trace_zones) {
-    DumpZoneSizes();
-  }
-#endif
-  DeleteAll();
-}
-
-
 void Zone::DeleteAll() {
   // Traverse the chained list of segments, zapping (in debug mode)
   // and freeing every zone segment.
@@ -212,34 +186,6 @@
 #endif
 
 
-StackZone::StackZone(BaseIsolate* isolate)
-    : StackResource(isolate),
-      zone_() {
-#ifdef DEBUG
-  if (FLAG_trace_zones) {
-    OS::PrintErr("*** Starting a new Stack zone 0x%"Px"(0x%"Px")\n",
-                 reinterpret_cast<intptr_t>(this),
-                 reinterpret_cast<intptr_t>(&zone_));
-  }
-#endif
-  zone_.Link(isolate->current_zone());
-  isolate->set_current_zone(&zone_);
-}
-
-
-StackZone::~StackZone() {
-  ASSERT(isolate()->current_zone() == &zone_);
-  isolate()->set_current_zone(zone_.previous_);
-#ifdef DEBUG
-  if (FLAG_trace_zones) {
-    OS::PrintErr("*** Deleting Stack zone 0x%"Px"(0x%"Px")\n",
-                 reinterpret_cast<intptr_t>(this),
-                 reinterpret_cast<intptr_t>(&zone_));
-  }
-#endif
-}
-
-
 void Zone::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   Zone* zone = this;
   while (zone != NULL) {
diff --git a/runtime/vm/zone.h b/runtime/vm/zone.h
index f8a2d23..f932db9 100644
--- a/runtime/vm/zone.h
+++ b/runtime/vm/zone.h
@@ -12,6 +12,8 @@
 
 namespace dart {
 
+DECLARE_DEBUG_FLAG(bool, trace_zones);
+
 // Zones support very fast allocation of small chunks of memory. The
 // chunks cannot be deallocated individually, but instead zones
 // support deallocating all chunks in one fast operation.
@@ -57,8 +59,29 @@
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
  private:
-  Zone();
-  ~Zone();  // Delete all memory associated with the zone.
+  Zone()
+    : initial_buffer_(buffer_, kInitialChunkSize),
+      position_(initial_buffer_.start()),
+      limit_(initial_buffer_.end()),
+      head_(NULL),
+      large_segments_(NULL),
+      handles_(),
+      previous_(NULL) {
+#ifdef DEBUG
+    // Zap the entire initial buffer.
+    memset(initial_buffer_.pointer(), kZapUninitializedByte,
+           initial_buffer_.size());
+#endif
+  }
+
+  ~Zone() {  // Delete all memory associated with the zone.
+#if defined(DEBUG)
+    if (FLAG_trace_zones) {
+      DumpZoneSizes();
+    }
+#endif
+    DeleteAll();
+  }
 
   // All pointers returned from AllocateUnsafe() and New() have this alignment.
   static const intptr_t kAlignment = kWordSize;
@@ -134,10 +157,32 @@
 class StackZone : public StackResource {
  public:
   // Create an empty zone and set is at the current zone for the Isolate.
-  explicit StackZone(BaseIsolate* isolate);
+  explicit StackZone(BaseIsolate* isolate)
+    : StackResource(isolate),
+      zone_() {
+#ifdef DEBUG
+    if (FLAG_trace_zones) {
+      OS::PrintErr("*** Starting a new Stack zone 0x%"Px"(0x%"Px")\n",
+                   reinterpret_cast<intptr_t>(this),
+                   reinterpret_cast<intptr_t>(&zone_));
+    }
+#endif
+    zone_.Link(isolate->current_zone());
+    isolate->set_current_zone(&zone_);
+  }
 
   // Delete all memory associated with the zone.
-  ~StackZone();
+  ~StackZone() {
+    ASSERT(isolate()->current_zone() == &zone_);
+    isolate()->set_current_zone(zone_.previous_);
+#ifdef DEBUG
+    if (FLAG_trace_zones) {
+      OS::PrintErr("*** Deleting Stack zone 0x%"Px"(0x%"Px")\n",
+                   reinterpret_cast<intptr_t>(this),
+                   reinterpret_cast<intptr_t>(&zone_));
+    }
+#endif
+  }
 
   // Compute the total size of this zone. This includes wasted space that is
   // due to internal fragmentation in the segments.
diff --git a/sdk/bin/dartanalyzer b/sdk/bin/dartanalyzer
index cc33e5c..4ea86af 100755
--- a/sdk/bin/dartanalyzer
+++ b/sdk/bin/dartanalyzer
@@ -28,7 +28,7 @@
 done
 
 DART_SDK=""
-if [ $FOUND_SDK = 0 ] ; then
+if [ $FOUND_SDK -eq 0 ] ; then
   if [ -f "$DART_ANALYZER_HOME/lib/core/core.dart" ] ; then
     DART_SDK=(--dart-sdk "$DART_ANALYZER_HOME")
   else
@@ -70,7 +70,7 @@
   # 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
+  if [ $FOUND_BATCH -eq 0 ] ; then
     EXTRA_JVMARGS+=" -client "
   fi
 fi
diff --git a/sdk/bin/dartanalyzer_developer b/sdk/bin/dartanalyzer_developer
index 9cf163d..1e95873 100755
--- a/sdk/bin/dartanalyzer_developer
+++ b/sdk/bin/dartanalyzer_developer
@@ -16,6 +16,18 @@
   echo "$1"
 }
 
+FOUND_BATCH=0
+for ARG in "$@"
+do
+  case $ARG in
+    -batch|--batch)
+      FOUND_BATCH=1
+      ;;
+    *)
+      ;;
+  esac
+done
+
 # Unlike $0, $BASH_SOURCE points to the absolute path of this file.
 PROG_NAME="$(follow_links "$BASH_SOURCE")"
 
@@ -29,12 +41,12 @@
   DART_CONFIGURATION="ReleaseIA32"
 fi
 
-if [[ `uname` == 'Darwin' ]]; 
+if [ `uname` == 'Darwin' ];
 then
   JAR_DIR="$CUR_DIR"/../../xcodebuild/$DART_CONFIGURATION/dartanalyzer
 else
   JAR_DIR="$CUR_DIR"/../../out/$DART_CONFIGURATION/dartanalyzer
-fi 
+fi
 
 JAR_FILE="$JAR_DIR/dartanalyzer.jar"
 
@@ -47,7 +59,7 @@
   # 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
+  if [ $FOUND_BATCH -eq 0 ] ; then
     EXTRA_JVMARGS+=" -client "
   fi
 fi
diff --git a/sdk/lib/_internal/compiler/compiler.dart b/sdk/lib/_internal/compiler/compiler.dart
index 8e5f77f..abeb36c 100644
--- a/sdk/lib/_internal/compiler/compiler.dart
+++ b/sdk/lib/_internal/compiler/compiler.dart
@@ -140,7 +140,12 @@
   static const Diagnostic HINT = const Diagnostic(4, 'hint');
 
   /**
-   * Informational messages.
+   * Additional information about the preceding non-info diagnostic from the
+   * compiler.
+   *
+   * For example, consider a duplicated definition. The compiler first emits a
+   * message about the duplicated definition, then emits an info message about
+   * the location of the existing definition.
    */
   static const Diagnostic INFO = const Diagnostic(8, 'info');
 
diff --git a/sdk/lib/_internal/compiler/implementation/apiimpl.dart b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
index 9f24fc6..7923de79 100644
--- a/sdk/lib/_internal/compiler/implementation/apiimpl.dart
+++ b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
@@ -48,11 +48,6 @@
             analyzeOnly: hasOption(options, '--analyze-only'),
             analyzeSignaturesOnly:
                 hasOption(options, '--analyze-signatures-only'),
-            rejectDeprecatedFeatures:
-                hasOption(options, '--reject-deprecated-language-features'),
-            checkDeprecationInSdk:
-                hasOption(options,
-                          '--report-sdk-use-of-deprecated-language-features'),
             strips: extractCsvOption(options, '--force-strip='),
             enableConcreteTypeInference:
                 hasOption(options, '--enable-concrete-type-inference'),
@@ -63,6 +58,7 @@
             sourceMapUri: extractSourceMapUri(options),
             globalJsName: extractStringOption(
                 options, '--global-js-name=', r'$'),
+            terseDiagnostics: hasOption(options, '--terse'),
             buildId: extractStringOption(
                 options, '--build-id=',
                 "build number could not be determined")) {
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index baaef0b..89e783b 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -744,7 +744,9 @@
 
   error(Node node) {
     // Just fail without reporting it anywhere.
-    throw new CompileTimeConstantError(MessageKind.NOT_A_COMPILE_TIME_CONSTANT);
+    throw new CompileTimeConstantError(
+        MessageKind.NOT_A_COMPILE_TIME_CONSTANT, const {},
+        compiler.terseDiagnostics);
   }
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 1aa47b7..88d35c5 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -306,8 +306,6 @@
    */
   final bool analyzeSignaturesOnly;
   final bool enableNativeLiveTypeAnalysis;
-  final bool rejectDeprecatedFeatures;
-  final bool checkDeprecationInSdk;
 
   /**
    * If [:true:], comment tokens are collected in [commentMap] during scanning.
@@ -331,6 +329,9 @@
    */
   final String globalJsName;
 
+  /// Emit terse diagnostics without howToFix.
+  final bool terseDiagnostics;
+
   final api.CompilerOutputProvider outputProvider;
 
   bool disableInlining = false;
@@ -387,6 +388,9 @@
   // Initialized when symbolImplementationClass has been resolved.
   FunctionElement symbolValidatedConstructor;
 
+  // Initialized when mirrorsUsedClass has been resolved.
+  FunctionElement mirrorsUsedConstructor;
+
   // Initialized when dart:mirrors is loaded.
   ClassElement deferredLibraryClass;
 
@@ -518,13 +522,12 @@
             this.analyzeAllFlag: false,
             bool analyzeOnly: false,
             bool analyzeSignaturesOnly: false,
-            this.rejectDeprecatedFeatures: false,
-            this.checkDeprecationInSdk: false,
             this.preserveComments: false,
             this.verbose: false,
             this.sourceMapUri: null,
             this.buildId: UNDETERMINED_BUILD_ID,
             this.globalJsName: r'$',
+            this.terseDiagnostics: false,
             outputProvider,
             List<String> strips: const []})
       : this.analyzeOnly = analyzeOnly || analyzeSignaturesOnly,
@@ -746,6 +749,8 @@
     } else if (symbolImplementationClass == cls) {
       symbolValidatedConstructor = symbolImplementationClass.lookupConstructor(
           symbolValidatedConstructorSelector);
+    } else if (mirrorsUsedClass == cls) {
+      mirrorsUsedConstructor = cls.constructors.head;
     }
   }
 
@@ -801,7 +806,9 @@
           '$missingHelperClasses');
     }
 
-    types = new Types(this, dynamicClass);
+    if (types == null) {
+      types = new Types(this, dynamicClass);
+    }
     backend.initializeHelperClasses();
 
     dynamicClass.ensureResolved(this);
@@ -1171,7 +1178,7 @@
                    MessageKind errorCode,
                    [Map arguments = const {}]) {
     reportMessage(spanFromSpannable(node),
-                  errorCode.error(arguments),
+                  errorCode.error(arguments, terseDiagnostics),
                   api.Diagnostic.ERROR);
   }
 
@@ -1187,21 +1194,21 @@
   void reportWarningCode(Spannable node, MessageKind errorCode,
                          [Map arguments = const {}]) {
     reportMessage(spanFromSpannable(node),
-                  errorCode.error(arguments),
+                  errorCode.error(arguments, terseDiagnostics),
                   api.Diagnostic.WARNING);
   }
 
   void reportInfo(Spannable node, MessageKind errorCode,
                   [Map arguments = const {}]) {
     reportMessage(spanFromSpannable(node),
-                  errorCode.error(arguments),
+                  errorCode.error(arguments, terseDiagnostics),
                   api.Diagnostic.INFO);
   }
 
   void reportHint(Spannable node, MessageKind errorCode,
                   [Map arguments = const {}]) {
     reportMessage(spanFromSpannable(node),
-                  errorCode.error(arguments),
+                  errorCode.error(arguments, terseDiagnostics),
                   api.Diagnostic.HINT);
   }
 
@@ -1221,24 +1228,6 @@
     reportDiagnostic(span, "$message", kind);
   }
 
-  /// Returns true if a diagnostic was emitted.
-  bool onDeprecatedFeature(Spannable span, String feature) {
-    if (currentElement == null)
-      throw new SpannableAssertionFailure(span, feature);
-    if (!checkDeprecationInSdk &&
-        currentElement.getLibrary().isPlatformLibrary) {
-      return false;
-    }
-    var kind = rejectDeprecatedFeatures
-        ? api.Diagnostic.ERROR : api.Diagnostic.WARNING;
-    var message = rejectDeprecatedFeatures
-        ? MessageKind.DEPRECATED_FEATURE_ERROR.error({'featureName': feature})
-        : MessageKind.DEPRECATED_FEATURE_WARNING.error(
-            {'featureName': feature});
-    reportMessage(spanFromSpannable(span), message, kind);
-    return true;
-  }
-
   void reportDiagnostic(SourceSpan span, String message, api.Diagnostic kind);
 
   SourceSpan spanFromTokens(Token begin, Token end, [Uri uri]) {
diff --git a/sdk/lib/_internal/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart
index 55812c0..6b24057 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2js.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart
@@ -256,12 +256,10 @@
     new OptionHandler('--analyze-only', setAnalyzeOnly),
     new OptionHandler('--analyze-signatures-only', passThrough),
     new OptionHandler('--disable-native-live-type-analysis', passThrough),
-    new OptionHandler('--reject-deprecated-language-features', passThrough),
-    new OptionHandler('--report-sdk-use-of-deprecated-language-features',
-                      passThrough),
     new OptionHandler('--categories=.*', setCategories),
     new OptionHandler('--global-js-name=.*', checkGlobalName),
     new OptionHandler('--disable-type-inference', passThrough),
+    new OptionHandler('--terse', passThrough),
 
     // The following two options must come last.
     new OptionHandler('-.*', (String argument) {
@@ -503,6 +501,10 @@
   --enable-diagnostic-colors
     Add colors to diagnostic messages.
 
+  --terse
+    Emit diagnostics without suggestions for how to get rid of the diagnosed
+    problems.
+
 The following options are only used for compiler development and may
 be removed in a future version:
 
@@ -526,19 +528,6 @@
     Disable the optimization that removes unused native types from dart:html
     and related libraries.
 
-  --reject-deprecated-language-features
-    Reject deprecated language features.  Without this option, the
-    compiler will accept language features that are no longer valid
-    according to The Dart Programming Language Specification, version
-    0.12, M1.
-
-  --report-sdk-use-of-deprecated-language-features
-    Report use of deprecated features in Dart platform libraries.
-    Without this option, the compiler will silently accept use of
-    deprecated language features from these libraries.  The option
-    --reject-deprecated-language-features controls if these usages are
-    reported as errors or warnings.
-
   --categories=<categories>
     A comma separated list of allowed library categories.  The default
     is "Client".  Possible categories can be seen by providing an
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index 4c29888..9f4c816 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -122,6 +122,12 @@
   final bool stripAsserts;
   // TODO(antonm): make available from command-line options.
   final bool outputAst = false;
+  final Map<Node, String> renames;
+  final Map<LibraryElement, String> imports;
+  final Map<ClassNode, List<Node>> memberNodes;
+  // TODO(zarah) Maybe change this to a command-line option.
+  // Right now, it is set by the tests.
+  bool useMirrorHelperLibrary = false;
 
   Map<Element, TreeElements> get resolvedElements =>
       compiler.enqueuer.resolution.resolvedElements;
@@ -171,6 +177,9 @@
 
   DartBackend(Compiler compiler, List<String> strips)
       : tasks = <CompilerTask>[],
+        renames = new Map<Node, String>(),
+        imports = new Map<LibraryElement, String>(),
+        memberNodes = new Map<ClassNode, List<Node>>(),
         forceStripTypes = strips.indexOf('types') != -1,
         stripAsserts = strips.indexOf('asserts') != -1,
         super(compiler);
@@ -357,7 +366,7 @@
       var classNode = classElement.parseNode(compiler);
       SynthesizedConstructorElementX constructor =
           new SynthesizedConstructorElementX(
-              classElement.name, null, classElement);
+              classElement.name, null, classElement, false);
       constructor.type = new FunctionType(
           constructor,
           compiler.types.voidType,
@@ -395,8 +404,6 @@
     }
     topLevelElements.forEach(makePlaceholders);
     // Create renames.
-    Map<Node, String> renames = new Map<Node, String>();
-    Map<LibraryElement, String> imports = new Map<LibraryElement, String>();
     bool shouldCutDeclarationTypes = forceStripTypes
         || (compiler.enableMinification
             && isSafeToRemoveTypeDeclarations(classMembers));
@@ -431,7 +438,6 @@
     }
 
     final topLevelNodes = <Node>[];
-    final memberNodes = new Map<ClassNode, List<Node>>();
     for (final element in sortedTopLevels) {
       topLevelNodes.add(elementAsts[element].ast);
       if (element.isClass() && !element.isMixinApplication) {
@@ -443,6 +449,10 @@
       }
     }
 
+    if (useMirrorHelperLibrary && compiler.mirrorsLibrary != null) {
+      MirrorRenamer.addMirrorHelperImport(imports);
+    }
+
     final unparser = new EmitterUnparser(renames);
     emitCode(unparser, imports, topLevelNodes, memberNodes);
     compiler.assembledCode = unparser.result;
@@ -468,6 +478,12 @@
   }
 
   log(String message) => compiler.log('[DartBackend] $message');
+
+  void registerStaticSend(Element element, Node node) {
+    if (useMirrorHelperLibrary && compiler.mirrorsLibrary != null) {
+      MirrorRenamer.handleStaticSend(renames, element, node, compiler);
+    }
+  }
 }
 
 class EmitterUnparser extends Unparser {
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
index 8a8abe4..82bfe58 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
@@ -10,6 +10,7 @@
 import '../dart_types.dart';
 import '../tree/tree.dart';
 import '../util/util.dart';
+import '../mirror_renamer/mirror_renamer.dart' show MirrorRenamer;
 
 import '../scanner/scannerlib.dart' show StringToken,
                                          Keyword,
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
index c7c7ec2..db7b9ee 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -45,6 +45,7 @@
   final PlaceholderCollector collector;
 
   get compiler => collector.compiler;
+  DartBackend get backend => compiler.backend;
 
   SendVisitor(this.collector, TreeElements elements) : super(elements);
 
@@ -106,6 +107,8 @@
 
   visitStaticSend(Send node) {
     final element = elements[node];
+    backend.registerStaticSend(element, node);
+
     if (Elements.isUnresolved(element)
         || identical(element, compiler.assertMethod)) {
       return;
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index 53eca97..4ecf03f 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -83,21 +83,23 @@
           new LinkedHashMap<LibraryElement, Set<Element>>();
       Set<Element> eagerElements = new LinkedHashSet<Element>();
 
-      // Iterate through the local members of the main script.  Create
+      // Iterate through live local members of the main script.  Create
       // a root-set of elements that must be loaded eagerly
       // (everything that is directly referred to from the main
       // script, but not imported from a deferred library), as well as
       // root-sets for deferred libraries.
       mainApp.forEachLocalMember((Element e) {
-        for (Element dependency in allElementsResolvedFrom(e)) {
-          if (isExplicitlyDeferred(dependency)) {
-            Set<Element> deferredElementsFromLibrary =
-                deferredElements.putIfAbsent(
-                    dependency.getLibrary(),
-                    () => new LinkedHashSet<Element>());
-            deferredElementsFromLibrary.add(dependency);
-          } else if (dependency.getLibrary() != mainApp) {
-            eagerElements.add(dependency.implementation);
+        if (compiler.enqueuer.resolution.isLive(e)) {
+          for (Element dependency in allElementsResolvedFrom(e)) {
+            if (isExplicitlyDeferred(dependency)) {
+              Set<Element> deferredElementsFromLibrary =
+                  deferredElements.putIfAbsent(
+                      dependency.getLibrary(),
+                      () => new LinkedHashSet<Element>());
+              deferredElementsFromLibrary.add(dependency);
+            } else if (dependency.getLibrary() != mainApp) {
+              eagerElements.add(dependency.implementation);
+            }
           }
         }
       });
diff --git a/sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart b/sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart
index 67d3792..ca73463 100644
--- a/sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart
@@ -23,9 +23,6 @@
 
   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
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 30825c7..21d5920 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -585,7 +585,7 @@
 
 // TODO(kasperl): This probably shouldn't be called an element. It's
 // just an interface shared by classes and libraries.
-abstract class ScopeContainerElement {
+abstract class ScopeContainerElement implements Element {
   Element localLookup(SourceString elementName);
 
   void forEachLocalMember(f(Element element));
@@ -819,6 +819,7 @@
   SourceString get nativeTagInfo;
 
   bool get isMixinApplication;
+  bool get isUnnamedMixinApplication;
   bool get hasBackendMembers;
   bool get hasLocalScopeMembers;
 
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 6c8bdd1..3bdbe46 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -1398,17 +1398,19 @@
  */
 class SynthesizedConstructorElementX extends FunctionElementX {
   final FunctionElement superMember;
+  final bool isDefaultConstructor;
 
   SynthesizedConstructorElementX(SourceString name,
                                  this.superMember,
-                                 Element enclosing)
+                                 Element enclosing,
+                                 this.isDefaultConstructor)
       : super(name,
               ElementKind.GENERATIVE_CONSTRUCTOR,
               Modifiers.EMPTY,
               enclosing);
 
   SynthesizedConstructorElementX.forDefault(superMember, Element enclosing)
-      : this(const SourceString(''), superMember, enclosing);
+      : this(const SourceString(''), superMember, enclosing, true);
 
   Token position() => enclosingElement.position();
 
@@ -1417,6 +1419,11 @@
   FunctionElement get targetConstructor => superMember;
 
   FunctionSignature computeSignature(compiler) {
+    if (isDefaultConstructor) {
+      return new FunctionSignatureX(
+          const Link<Element>(), const Link<Element>(), 0, 0, false,
+          getEnclosingClass().thisType);
+    }
     if (superMember.isErroneous()) {
       return compiler.objectClass.localLookup(
           const SourceString('')).computeSignature(compiler);
@@ -1525,6 +1532,8 @@
 
   bool get hasBackendMembers => !backendMembers.isEmpty;
 
+  bool get isUnnamedMixinApplication => false;
+
   InterfaceType computeType(Compiler compiler) {
     if (thisType == null) {
       if (origin == null) {
@@ -1987,6 +1996,7 @@
       : super(name, enclosing, id, STATE_NOT_STARTED);
 
   bool get isMixinApplication => true;
+  bool get isUnnamedMixinApplication => node is! NamedMixinApplication;
   bool get hasConstructor => !constructors.isEmpty;
   bool get hasLocalScopeMembers => !constructors.isEmpty;
 
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index 288065d..f750960 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -572,6 +572,13 @@
 
   bool isProcessed(Element member) => resolvedElements.containsKey(member);
 
+  /// Returns [:true:] if [element] has actually been used.
+  bool isLive(Element element) {
+    if (seenClasses.contains(element)) return true;
+    if (getCachedElements(element) != null) return true;
+    return false;
+  }
+
   TreeElements getCachedElements(Element element) {
     // TODO(ngeoffray): Get rid of this check.
     if (element.enclosingElement.isClosure()) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index cc7b0fb..970af53 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -308,6 +308,9 @@
   /// True if a call to disableTreeShaking has been seen.
   bool isTreeShakingDisabled = false;
 
+  /// True if there isn't sufficient @MirrorsUsed data.
+  bool hasInsufficientMirrorsUsed = false;
+
   /// List of instantiated types from metadata.  If metadata must be preserved,
   /// these types must registered.
   final List<Dependency> metadataInstantiatedTypes = <Dependency>[];
@@ -1359,10 +1362,9 @@
 
   void registerStaticUse(Element element, Enqueuer enqueuer) {
     if (element == disableTreeShakingMarker) {
-      enqueuer.enqueueEverything();
-      if (isTreeShakingDisabled) return;
       compiler.disableTypeInferenceForMirrors = true;
       isTreeShakingDisabled = true;
+      enqueuer.enqueueEverything();
     } else if (element == preserveNamesMarker) {
       if (mustPreserveNames) return;
       mustPreserveNames = true;
@@ -1395,17 +1397,25 @@
 
   /// Called when [:const Symbol(name):] is seen.
   void registerConstSymbol(String name, TreeElements elements) {
+    symbolsUsed.add(name);
   }
 
   /// Called when [:new Symbol(...):] is seen.
   void registerNewSymbol(TreeElements elements) {
   }
 
-  bool retainGetter(Element element) => isTreeShakingDisabled;
+  /// Should [element] (a getter) be retained for reflection?
+  bool shouldRetainGetter(Element element) => isNeededForReflection(element);
 
-  bool retainSetter(Element element) => isTreeShakingDisabled;
+  /// Should [element] (a setter) be retained for reflection?
+  bool shouldRetainSetter(Element element) => isNeededForReflection(element);
 
-  bool retainName(SourceString name) => mustPreserveNames;
+  /// Should [name] be retained for reflection?
+  bool shouldRetainName(SourceString name) {
+    if (hasInsufficientMirrorsUsed) return mustPreserveNames;
+    if (name == const SourceString('')) return false;
+    return symbolsUsed.contains(name.slowToString());
+  }
 
   bool get rememberLazies => isTreeShakingDisabled;
 
@@ -1460,20 +1470,49 @@
   void registerMirrorUsage(Set<String> symbols,
                            Set<Element> targets,
                            Set<Element> metaTargets) {
+    if (symbols == null && targets == null && metaTargets == null) {
+      // The user didn't specify anything, or there are imports of
+      // 'dart:mirrors' without @MirrorsUsed.
+      hasInsufficientMirrorsUsed = true;
+      return;
+    }
     if (symbols != null) symbolsUsed.addAll(symbols);
     if (targets != null) {
-      for (Element element in targets) {
-        // TODO(ahe): Implement finer granularity.
-        targetsUsed.add(element.getLibrary());
+      for (Element target in targets) {
+        if (target.isAbstractField()) {
+          AbstractFieldElement field = target;
+          targetsUsed.add(field.getter);
+          targetsUsed.add(field.setter);
+        } else {
+          targetsUsed.add(target);
+        }
       }
     }
     if (metaTargets != null) metaTargetsUsed.addAll(metaTargets);
   }
 
   bool isNeededForReflection(Element element) {
-    // TODO(ahe): Implement this.
-    if (!metaTargetsUsed.isEmpty) return true;
-    if (targetsUsed.contains(element.getLibrary())) return true;
+    if (hasInsufficientMirrorsUsed) return isTreeShakingDisabled;
+    /// Record the name of [element] in [symbolsUsed]. Return true for
+    /// convenience.
+    bool registerNameOf(Element element) {
+      symbolsUsed.add(element.name.slowToString());
+      if (element.isConstructor()) {
+        symbolsUsed.add(element.getEnclosingClass().name.slowToString());
+      }
+      return true;
+    }
+
+    if (!metaTargetsUsed.isEmpty) {
+      // TODO(ahe): Implement this.
+      return registerNameOf(element);
+    }
+
+    if (!targetsUsed.isEmpty) {
+      for (Element e = element; e != null; e = e.enclosingElement) {
+        if (targetsUsed.contains(e)) return registerNameOf(element);
+      }
+    }
     return false;
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index 2302aec..21e7b5c 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -1220,7 +1220,7 @@
   bool fieldNeedsGetter(VariableElement field) {
     assert(field.isField());
     if (fieldAccessNeverThrows(field)) return false;
-    return backend.retainGetter(field)
+    return backend.shouldRetainGetter(field)
         || compiler.codegenWorld.hasInvokedGetter(field, compiler);
   }
 
@@ -1228,7 +1228,7 @@
     assert(field.isField());
     if (fieldAccessNeverThrows(field)) return false;
     return (!field.modifiers.isFinalOrConst())
-        && (backend.retainSetter(field)
+        && (backend.shouldRetainSetter(field)
             || compiler.codegenWorld.hasInvokedSetter(field, compiler));
   }
 
@@ -1288,8 +1288,25 @@
     emitExtraAccessors(member, builder);
   }
 
+  /// Returns the "reflection name" of an [Element] or [Selector].
+  /// The reflection name of a getter 'foo' is 'foo'.
+  /// The reflection name of a setter 'foo' is 'foo='.
+  /// The reflection name of a method 'foo' is 'foo:N:M:O', where N is the
+  /// number of required arguments, M is the number of optional arguments, and
+  /// O is the named arguments.
+  /// The reflection name of a constructor is similar to a regular method but
+  /// starts with 'new '.
+  /// This is used by js_mirrors.dart.
   String getReflectionName(elementOrSelector, String mangledName) {
-    if (!backend.retainName(elementOrSelector.name)) return null;
+    SourceString name = elementOrSelector.name;
+    if (!backend.shouldRetainName(name)) {
+      if (name == const SourceString('') && elementOrSelector is Element) {
+        // Make sure to retain names of unnamed constructors.
+        if (!backend.isNeededForReflection(elementOrSelector)) return null;
+      } else {
+        return null;
+      }
+    }
     // TODO(ahe): Enable the next line when I can tell the difference between
     // an instance method and a global.  They may have the same mangled name.
     // if (recordedMangledNames.contains(mangledName)) return null;
@@ -1701,7 +1718,7 @@
   void recordMangledField(Element member,
                           String accessorName,
                           String memberName) {
-    if (!backend.retainGetter(member)) return;
+    if (!backend.shouldRetainGetter(member)) return;
     String previousName;
     if (member.isInstanceMember()) {
       previousName = mangledFieldNames.putIfAbsent(
@@ -1959,8 +1976,9 @@
     }
     buffer.write('$className:$_');
     buffer.write(jsAst.prettyPrint(builder.toObjectInitializer(), compiler));
-    if (backend.retainName(classElement.name)) {
+    if (backend.shouldRetainName(classElement.name)) {
       buffer.write(',$n$n"+${classElement.name.slowToString()}": 0');
+      recordedMangledNames.add(className);
     }
   }
 
@@ -2029,6 +2047,9 @@
 
     bool haveSameTypeVariables(ClassElement a, ClassElement b) {
       if (a.isClosure()) return true;
+      if (b.isUnnamedMixinApplication) {
+        return false;
+      }
       return a.typeVariables == b.typeVariables;
     }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
index 4c72122..29e1ecb 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
@@ -463,15 +463,13 @@
                                    { bool alwaysGenerateFunction: false }) {
     if (isTrivialSubstitution(cls, check)) return null;
 
+    // Unnamed mixin application classes do not need substitutions, because they
+    // are never instantiated and their checks are overwritten by the class that
+    // they are mixed into.
+    if (cls.isUnnamedMixinApplication) return null;
     InterfaceType type = cls.computeType(compiler);
     InterfaceType target = type.asInstanceOf(check);
-    Link<DartType> typeVariables;
-    if (cls.isMixinApplication) {
-      MixinApplicationElement mixinApplication = cls;
-      typeVariables = mixinApplication.mixin.typeVariables;
-    } else {
-      typeVariables = cls.typeVariables;
-    }
+    Link<DartType> typeVariables = cls.typeVariables;
     if (typeVariables.isEmpty && !alwaysGenerateFunction) {
       return new Substitution.list(target.typeArguments);
     } else {
diff --git a/sdk/lib/_internal/compiler/implementation/library_loader.dart b/sdk/lib/_internal/compiler/implementation/library_loader.dart
index 0bcd1a5..8f4f224 100644
--- a/sdk/lib/_internal/compiler/implementation/library_loader.dart
+++ b/sdk/lib/_internal/compiler/implementation/library_loader.dart
@@ -368,17 +368,7 @@
     compiler.withCurrentElement(unit, () {
       compiler.scanner.scan(unit);
       if (unit.partTag == null) {
-        bool wasDiagnosticEmitted = false;
-        compiler.withCurrentElement(library, () {
-          wasDiagnosticEmitted =
-              compiler.onDeprecatedFeature(part, 'missing part-of tag');
-        });
-        if (wasDiagnosticEmitted) {
-          compiler.reportMessage(
-              compiler.spanFromElement(unit),
-              MessageKind.MISSING_PART_OF_TAG.error(),
-              api.Diagnostic.INFO);
-        }
+        compiler.reportError(unit, MessageKind.MISSING_PART_OF_TAG);
       }
     });
   }
diff --git a/sdk/lib/_internal/compiler/implementation/mirror_renamer/mirror_renamer.dart b/sdk/lib/_internal/compiler/implementation/mirror_renamer/mirror_renamer.dart
new file mode 100644
index 0000000..3ed8b5d
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/mirror_renamer/mirror_renamer.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library mirror_renamer;
+
+// TODO(zarah): Remove this hack! LibraryElementX should not be created outside
+// the library loader!
+import '../elements/modelx.dart' show LibraryElementX;
+import '../dart2jslib.dart' show Script, Compiler;
+import '../tree/tree.dart';
+import '../elements/elements.dart';
+
+part 'renamer.dart';
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/mirror_renamer/renamer.dart b/sdk/lib/_internal/compiler/implementation/mirror_renamer/renamer.dart
new file mode 100644
index 0000000..003dda4
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/mirror_renamer/renamer.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of mirror_renamer;
+
+class MirrorRenamer {
+  static const String MIRROR_HELPER_CLASS = 'MirrorHelper';
+  static const String MIRROR_HELPER_GET_NAME_FUNCTION = 'getName';
+  static const String MIRROR_HELPER_LIBRARY_NAME = 'mirror_helper.dart';
+  static const String MIRROR_HELPER_LIBRARY_PREFIX = 'm';
+  static const String MIRROR_HELPER_CLASS_FULLY_QUALIFIED_NAME =
+      '$MIRROR_HELPER_LIBRARY_PREFIX.$MIRROR_HELPER_CLASS';
+
+  static void handleStaticSend(Map<Node, String> renames, Element element,
+                               Send node, Compiler compiler) {
+  if (element == compiler.mirrorSystemGetNameFunction) {
+    renames[node.selector] = MIRROR_HELPER_GET_NAME_FUNCTION;
+    renames[node.receiver] = MIRROR_HELPER_CLASS_FULLY_QUALIFIED_NAME;
+    }
+ }
+
+  static void addMirrorHelperImport(Map<LibraryElement, String> imports) {
+    Uri mirrorHelperUri = new Uri(path: MIRROR_HELPER_LIBRARY_NAME);
+    // TODO(zarah): Remove this hack! LibraryElementX should not be created
+    // outside the library loader. When actual mirror helper library
+    // is created, change to load that.
+    LibraryElement mirrorHelperLib = new LibraryElementX(
+        new Script(mirrorHelperUri, null));
+    imports.putIfAbsent(mirrorHelperLib, () => MIRROR_HELPER_LIBRARY_PREFIX);
+  }
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
index 7b795a2..9c8df9c 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
@@ -13,23 +13,36 @@
     MessageKind,
     SourceString,
     StringConstant,
-    TypeConstant;
+    TreeElements,
+    TypeConstant,
+    invariant;
 
 import 'elements/elements.dart' show
+    ClassElement,
     Element,
     LibraryElement,
     MetadataAnnotation,
+    ScopeContainerElement,
     VariableElement;
 
 import 'util/util.dart' show
-    Link;
+    Link,
+    Spannable;
 
 import 'dart_types.dart' show
-    DartType;
+    DartType,
+    InterfaceType,
+    TypeKind;
 
 import 'tree/tree.dart' show
     Import,
-    LibraryTag;
+    LibraryTag,
+    NamedArgument,
+    NewExpression,
+    Node;
+
+import 'resolution/resolution.dart' show
+    ConstantMapper;
 
 /**
  * Compiler task that analyzes MirrorsUsed annotations.
@@ -81,13 +94,17 @@
  */
 class MirrorUsageAnalyzerTask extends CompilerTask {
   Set<LibraryElement> librariesWithUsage;
+  MirrorUsageAnalyzer analyzer;
 
   MirrorUsageAnalyzerTask(Compiler compiler)
-      : super(compiler);
+      : super(compiler) {
+    analyzer = new MirrorUsageAnalyzer(compiler, this);
+  }
 
+  /// Collect @MirrorsUsed annotations in all libraries.  Called by the
+  /// compiler after all libraries are loaded, but before resolution.
   void analyzeUsage(LibraryElement mainApp) {
     if (compiler.mirrorsLibrary == null) return;
-    MirrorUsageAnalyzer analyzer = new MirrorUsageAnalyzer(compiler, this);
     measure(analyzer.run);
     List<String> symbols = analyzer.mergedMirrorUsage.symbols;
     List<Element> targets = analyzer.mergedMirrorUsage.targets;
@@ -99,44 +116,90 @@
     librariesWithUsage = analyzer.librariesWithUsage;
   }
 
+  /// Is there a @MirrorsUsed annotation in the library of [element]?  Used by
+  /// the resolver to suppress hints about using new Symbol or
+  /// MirrorSystem.getName.
   bool hasMirrorUsage(Element element) {
     return librariesWithUsage != null
         && librariesWithUsage.contains(element.getLibrary());
   }
+
+  /// Call-back from the resolver to analyze MirorsUsed annotations. The result
+  /// is stored in [analyzer] and later used to compute
+  /// [:analyzer.mergedMirrorUsage:].
+  void validate(NewExpression node, TreeElements mapping) {
+    for (Node argument in node.send.arguments) {
+      NamedArgument named = argument.asNamedArgument();
+      if (named == null) continue;
+      Constant value = compiler.metadataHandler.compileNodeWithDefinitions(
+          named.expression, mapping, isConst: true);
+
+      ConstantMapper mapper =
+          new ConstantMapper(compiler.metadataHandler, mapping, compiler);
+      named.expression.accept(mapper);
+
+      MirrorUsageBuilder builder =
+          new MirrorUsageBuilder(
+              analyzer, mapping.currentElement.getLibrary(), named.expression,
+              value, mapper.constantToNodeMap);
+
+      if (named.name.source == const SourceString('symbols')) {
+        analyzer.cachedValues[value] =
+            builder.convertToListOfStrings(
+                builder.convertConstantToUsageList(value, onlyStrings: true));
+      } else if (named.name.source == const SourceString('targets')) {
+        analyzer.cachedValues[value] =
+            builder.resolveUsageList(builder.convertConstantToUsageList(value));
+      } else if (named.name.source == const SourceString('metaTargets')) {
+        analyzer.cachedValues[value] =
+            builder.resolveUsageList(builder.convertConstantToUsageList(value));
+      } else if (named.name.source == const SourceString('override')) {
+        analyzer.cachedValues[value] =
+            builder.resolveUsageList(builder.convertConstantToUsageList(value));
+      }
+    }
+  }
 }
 
 class MirrorUsageAnalyzer {
   final Compiler compiler;
   final MirrorUsageAnalyzerTask task;
-  final List<LibraryElement> wildcard;
+  List<LibraryElement> wildcard;
   final Set<LibraryElement> librariesWithUsage;
-  final Set<LibraryElement> librariesWithoutUsage;
+  final Map<Constant, List> cachedValues;
   MirrorUsage mergedMirrorUsage;
 
   MirrorUsageAnalyzer(Compiler compiler, this.task)
       : compiler = compiler,
-        wildcard = compiler.libraries.values.toList(),
         librariesWithUsage = new Set<LibraryElement>(),
-        librariesWithoutUsage = new Set<LibraryElement>();
+        cachedValues = new Map<Constant, List>();
 
+  /// Collect and merge all @MirrorsUsed annotations. As a side-effect, also
+  /// compute which libraries have the annotation (which is used by
+  /// [MirrorUsageAnalyzerTask.hasMirrorUsage]).
   void run() {
+    wildcard = compiler.libraries.values.toList();
     Map<LibraryElement, List<MirrorUsage>> usageMap =
         collectMirrorsUsedAnnotation();
     propagateOverrides(usageMap);
-    librariesWithoutUsage.removeAll(usageMap.keys);
+    Set<LibraryElement> librariesWithoutUsage = new Set<LibraryElement>();
+    usageMap.forEach((LibraryElement library, List<MirrorUsage> usage) {
+      if (usage.isEmpty) librariesWithoutUsage.add(library);
+    });
     if (librariesWithoutUsage.isEmpty) {
       mergedMirrorUsage = mergeUsages(usageMap);
     } else {
-      mergedMirrorUsage = new MirrorUsage(null, wildcard, null, null);
+      mergedMirrorUsage = new MirrorUsage(null, null, null, null);
     }
   }
 
+  /// Collect all @MirrorsUsed from all libraries and represent them as
+  /// [MirrorUsage].
   Map<LibraryElement, List<MirrorUsage>> collectMirrorsUsedAnnotation() {
     Map<LibraryElement, List<MirrorUsage>> result =
         new Map<LibraryElement, List<MirrorUsage>>();
     for (LibraryElement library in compiler.libraries.values) {
       if (library.isInternalLibrary) continue;
-      librariesWithoutUsage.add(library);
       for (LibraryTag tag in library.tags) {
         Import importTag = tag.asImport();
         if (importTag == null) continue;
@@ -157,6 +220,7 @@
     return result;
   }
 
+  /// Apply [MirrorUsage] with 'override' to libraries they override.
   void propagateOverrides(Map<LibraryElement, List<MirrorUsage>> usageMap) {
     Map<LibraryElement, List<MirrorUsage>> propagatedOverrides =
         new Map<LibraryElement, List<MirrorUsage>>();
@@ -189,6 +253,8 @@
     });
   }
 
+  /// Find @MirrorsUsed annotations on the given import [tag] in [library]. The
+  /// annotations are represented as [MirrorUsage].
   List<MirrorUsage> mirrorsUsedOnLibraryTag(LibraryElement library,
                                             Import tag) {
     LibraryElement importedLibrary = library.getLibraryFromTag(tag);
@@ -200,19 +266,13 @@
       metadata.ensureResolved(compiler);
       Element element = metadata.value.computeType(compiler).element;
       if (element == compiler.mirrorsUsedClass) {
-        try {
-          MirrorUsage usage =
-              new MirrorUsageBuilder(this, library).build(metadata.value);
-          result.add(usage);
-        } on BadMirrorsUsedAnnotation catch (e) {
-          compiler.reportError(
-              metadata, MessageKind.GENERIC, {'text': e.message});
-        }
+        result.add(buildUsage(metadata.value));
       }
     }
     return result;
   }
 
+  /// Merge all [MirrorUsage] instances accross all libraries.
   MirrorUsage mergeUsages(Map<LibraryElement, List<MirrorUsage>> usageMap) {
     Set<MirrorUsage> usagesToMerge = new Set<MirrorUsage>();
     usageMap.forEach((LibraryElement library, List<MirrorUsage> usages) {
@@ -230,7 +290,11 @@
     }
   }
 
+  /// Merge [a] with [b]. The resulting [MirrorUsage] simply has the symbols,
+  /// targets, and metaTargets of [a] and [b] concatenated. 'override' is
+  /// ignored.
   MirrorUsage merge(MirrorUsage a, MirrorUsage b) {
+    // TOOO(ahe): Should be an instance method on MirrorUsage.
     if (a.symbols == null && a.targets == null && a.metaTargets == null) {
       return b;
     } else if (
@@ -258,8 +322,30 @@
     }
     return new MirrorUsage(symbols, targets, metaTargets, null);
   }
+
+  /// Convert a [constant] to an instance of [MirrorUsage] using information
+  /// that was resolved during [MirrorUsageAnalyzerTask.validate].
+  MirrorUsage buildUsage(ConstructedConstant constant) {
+    Map<Element, Constant> fields = constant.fieldElements;
+    VariableElement symbolsField = compiler.mirrorsUsedClass.lookupLocalMember(
+        const SourceString('symbols'));
+    VariableElement targetsField = compiler.mirrorsUsedClass.lookupLocalMember(
+        const SourceString('targets'));
+    VariableElement metaTargetsField =
+        compiler.mirrorsUsedClass.lookupLocalMember(
+            const SourceString('metaTargets'));
+    VariableElement overrideField = compiler.mirrorsUsedClass.lookupLocalMember(
+        const SourceString('override'));
+
+    return new MirrorUsage(
+        cachedValues[fields[symbolsField]],
+        cachedValues[fields[targetsField]],
+        cachedValues[fields[metaTargetsField]],
+        cachedValues[fields[overrideField]]);
+  }
 }
 
+/// Used to represent a resolved MirrorsUsed constant.
 class MirrorUsage {
   final List<String> symbols;
   final List<Element> targets;
@@ -281,38 +367,28 @@
 }
 
 class MirrorUsageBuilder {
-  MirrorUsageAnalyzer analyzer;
-  LibraryElement enclosingLibrary;
+  final MirrorUsageAnalyzer analyzer;
+  final LibraryElement enclosingLibrary;
+  final Spannable spannable;
+  final Constant constant;
+  final Map<Constant, Node> constantToNodeMap;
 
-  MirrorUsageBuilder(this.analyzer, this.enclosingLibrary);
+  MirrorUsageBuilder(
+      this.analyzer,
+      this.enclosingLibrary,
+      this.spannable,
+      this.constant,
+      this.constantToNodeMap);
 
   Compiler get compiler => analyzer.compiler;
 
-  MirrorUsage build(ConstructedConstant constant) {
-    Map<Element, Constant> fields = constant.fieldElements;
-    VariableElement symbolsField = compiler.mirrorsUsedClass.lookupLocalMember(
-        const SourceString('symbols'));
-    VariableElement targetsField = compiler.mirrorsUsedClass.lookupLocalMember(
-        const SourceString('targets'));
-    VariableElement metaTargetsField =
-        compiler.mirrorsUsedClass.lookupLocalMember(
-            const SourceString('metaTargets'));
-    VariableElement overrideField = compiler.mirrorsUsedClass.lookupLocalMember(
-        const SourceString('override'));
-    List<String> symbols =
-        convertToListOfStrings(
-            convertConstantToUsageList(fields[symbolsField]));
-    List<Element> targets =
-        resolveUsageList(convertConstantToUsageList(fields[targetsField]));
-
-    List<Element> metaTargets =
-        resolveUsageList(convertConstantToUsageList(fields[metaTargetsField]));
-    List<Element> override =
-        resolveUsageList(convertConstantToUsageList(fields[overrideField]));
-    return new MirrorUsage(symbols, targets, metaTargets, override);
-  }
-
-  List convertConstantToUsageList(Constant constant) {
+  /// Convert a constant to a list of [String] and [Type] values. If the
+  /// constant is a single [String], it is assumed to be a comma-separated list
+  /// of qualified names. If the constant is a [Type] t, the result is [:[t]:].
+  /// Otherwise, the constant is assumed to represent a list of strings (each a
+  /// qualified name) and types, and such a list is constructed.
+  List convertConstantToUsageList(
+      Constant constant, { bool onlyStrings: false }) {
     if (constant.isNull()) {
       return null;
     } else if (constant.isList()) {
@@ -322,16 +398,21 @@
         if (entry.isString()) {
           StringConstant string = entry;
           result.add(string.value.slowToString());
-        } else if (entry.isType()) {
+        } else if (!onlyStrings && entry.isType()) {
           TypeConstant type = entry;
           result.add(type.representedType);
         } else {
-          throw new BadMirrorsUsedAnnotation(
-              'Expected a string or type, but got "$entry".');
+          Spannable node = positionOf(entry);
+          MessageKind kind = onlyStrings
+              ? MessageKind.MIRRORS_EXPECTED_STRING
+              : MessageKind.MIRRORS_EXPECTED_STRING_OR_TYPE;
+          compiler.reportHint(
+              node,
+              kind, {'name': node, 'type': apiTypeOf(entry)});
         }
       }
       return result;
-    } else if (constant.isType()) {
+    } else if (!onlyStrings && constant.isType()) {
       TypeConstant type = constant;
       return [type.representedType];
     } else if (constant.isString()) {
@@ -339,25 +420,53 @@
       return
           string.value.slowToString().split(',').map((e) => e.trim()).toList();
     } else {
-      throw new BadMirrorsUsedAnnotation(
-          'Expected a string or a list of string, but got "$constant".');
+      Spannable node = positionOf(constant);
+      MessageKind kind = onlyStrings
+          ? MessageKind.MIRRORS_EXPECTED_STRING_OR_LIST
+          : MessageKind.MIRRORS_EXPECTED_STRING_TYPE_OR_LIST;
+      compiler.reportHint(
+          node,
+          kind, {'name': node, 'type': apiTypeOf(constant)});
+      return null;
     }
   }
 
+  /// Find the first non-implementation interface of constant.
+  DartType apiTypeOf(Constant constant) {
+    DartType type = constant.computeType(compiler);
+    LibraryElement library = type.element.getLibrary();
+    if (type.kind == TypeKind.INTERFACE && library.isInternalLibrary) {
+      InterfaceType interface = type;
+      ClassElement cls = type.element;
+      for (DartType supertype in cls.ensureResolved(compiler).allSupertypes) {
+        if (supertype.kind == TypeKind.INTERFACE
+            && !supertype.element.getLibrary().isInternalLibrary) {
+          return interface.asInstanceOf(supertype.element);
+        }
+      }
+    }
+    return type;
+  }
+
+  /// Ensure a list contains only strings.
   List<String> convertToListOfStrings(List list) {
     if (list == null) return null;
     List<String> result = new List<String>(list.length);
     int count = 0;
     for (var entry in list) {
-      if (entry is! String) {
-        throw new BadMirrorsUsedAnnotation(
-            'Expected a string, but got "$entry"');
-      }
+      assert(invariant(spannable, entry is String));
       result[count++] = entry;
     }
     return result;
   }
 
+  /// Convert a list of strings and types to a list of elements. Types are
+  /// converted to their corresponding element, and strings are resolved as
+  /// follows:
+  ///
+  /// First find the longest library name that is a prefix of the string, if
+  /// there are none, resolve using [resolveExpression]. Otherwise, resolve the
+  /// rest of the string using [resolveLocalExpression].
   List<Element> resolveUsageList(List list) {
     if (list == null) return null;
     if (list.length == 1 && list[0] == '*') {
@@ -370,22 +479,114 @@
         result.add(type.element);
       } else {
         String string = entry;
+        LibraryElement libraryCandiate;
+        String libraryNameCandiate;
         for (LibraryElement l in compiler.libraries.values) {
           if (l.hasLibraryName()) {
             String libraryName = l.getLibraryOrScriptName();
-            if (string == libraryName || string.startsWith('$libraryName.')) {
-              result.add(l);
+            if (string == libraryName) {
+              // Found an exact match.
+              libraryCandiate = l;
+              libraryNameCandiate = libraryName;
               break;
+            } else if (string.startsWith('$libraryName.')) {
+              if (libraryNameCandiate == null
+                  || libraryNameCandiate.length < libraryName.length) {
+                // Found a better candiate
+                libraryCandiate = l;
+                libraryNameCandiate = libraryName;
+              }
             }
           }
         }
+        Element e;
+        if (libraryNameCandiate == string) {
+          e = libraryCandiate;
+        } else if (libraryNameCandiate != null) {
+          e = resolveLocalExpression(
+              libraryCandiate,
+              string.substring(libraryNameCandiate.length + 1).split('.'));
+        } else {
+          e = resolveExpression(string);
+        }
+        if (e != null) result.add(e);
       }
     }
     return result;
   }
-}
 
-class BadMirrorsUsedAnnotation {
-  final String message;
-  BadMirrorsUsedAnnotation(this.message);
+  /// Resolve [expression] in [enclosingLibrary]'s import scope.
+  Element resolveExpression(String expression) {
+    List<String> identifiers = expression.split('.');
+    Element element = enclosingLibrary.find(new SourceString(identifiers[0]));
+    if (element == null) {
+      compiler.reportHint(
+          spannable, MessageKind.MIRRORS_CANNOT_RESOLVE_IN_CURRENT_LIBRARY,
+          {'name': expression});
+      return null;
+    } else {
+      if (identifiers.length == 1) return element;
+      return resolveLocalExpression(element, identifiers.sublist(1));
+    }
+  }
+
+  /// Resolve [identifiers] in [element]'s local members.
+  Element resolveLocalExpression(Element element, List<String> identifiers) {
+    Element current = element;
+    for (String identifier in identifiers) {
+      Element e = findLocalMemberIn(current, new SourceString(identifier));
+      if (e == null) {
+        if (current.isLibrary()) {
+          LibraryElement library = current;
+          compiler.reportHint(
+              spannable, MessageKind.MIRRORS_CANNOT_RESOLVE_IN_LIBRARY,
+              {'name': identifiers[0],
+               'library': library.getLibraryOrScriptName()});
+        } else {
+          compiler.reportHint(
+              spannable, MessageKind.MIRRORS_CANNOT_FIND_IN_ELEMENT,
+              {'name': identifier, 'element': current.name});
+        }
+        return current;
+      }
+      current = e;
+    }
+    return current;
+  }
+
+  /// Helper method to lookup members in a [ScopeContainerElement]. If
+  /// [element] is not a ScopeContainerElement, return null.
+  Element findLocalMemberIn(Element element, SourceString name) {
+    if (element is ScopeContainerElement) {
+      ScopeContainerElement scope = element;
+      return scope.localLookup(name);
+    }
+    return null;
+  }
+
+  /// Attempt to find a [Spannable] corresponding to constant.
+  Spannable positionOf(Constant constant) {
+    Node node = constantToNodeMap[constant];
+    if (node == null) {
+      // TODO(ahe): Returning [spannable] here leads to confusing error
+      // messages.  For example, consider:
+      // @MirrorsUsed(targets: fisk)
+      // import 'dart:mirrors';
+      //
+      // const fisk = const [main];
+      //
+      // main() {}
+      //
+      // The message is:
+      // example.dart:1:23: Hint: Can't use 'fisk' here because ...
+      // Did you forget to add quotes?
+      // @MirrorsUsed(targets: fisk)
+      //                       ^^^^
+      //
+      // Instead of saying 'fisk' should pretty print the problematic constant
+      // value.
+      return spannable;
+    }
+    return node;
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 607bc6e..f6f8cc9 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -974,6 +974,23 @@
   }
 }
 
+class ConstantMapper extends Visitor {
+  final Map<Constant, Node> constantToNodeMap = new Map<Constant, Node>();
+  final CompileTimeConstantEvaluator evaluator;
+
+  ConstantMapper(ConstantHandler handler,
+                 TreeElements elements,
+                 Compiler compiler)
+      : evaluator = new CompileTimeConstantEvaluator(
+          handler, elements, compiler, isConst: false);
+
+  visitNode(Node node) {
+    Constant constant = evaluator.evaluate(node);
+    if (constant != null) constantToNodeMap[constant] = node;
+    node.visitChildren(this);
+  }
+}
+
 class InitializerResolver {
   final ResolverVisitor visitor;
   final Map<Element, Node> initialized;
@@ -1274,7 +1291,8 @@
   }
 
   void warning(Node node, MessageKind kind, [Map arguments = const {}]) {
-    ResolutionWarning message  = new ResolutionWarning(kind, arguments);
+    ResolutionWarning message =
+        new ResolutionWarning(kind, arguments, compiler.terseDiagnostics);
     compiler.reportWarning(node, message);
   }
 
@@ -1515,7 +1533,7 @@
             visitor, node, typdef.typeVariables, arguments);
         if (hasTypeArgumentMismatch) {
           type = new BadTypedefType(typdef,
-              new TypedefType.forUserProvidedBadType(typdef, 
+              new TypedefType.forUserProvidedBadType(typdef,
                                                      arguments.toLink()));
         } else {
           if (arguments.isEmpty) {
@@ -1750,7 +1768,8 @@
                                                  SourceString name,
                                                  DualKind kind,
                                                  [Map arguments = const {}]) {
-    ResolutionWarning warning = new ResolutionWarning(kind.warning, arguments);
+    ResolutionWarning warning = new ResolutionWarning(
+        kind.warning, arguments, compiler.terseDiagnostics);
     compiler.reportWarning(node, warning);
     return new ErroneousElementX(kind.error, arguments, name, enclosingElement);
   }
@@ -2131,17 +2150,22 @@
       if (identical(string, '!') ||
           identical(string, '&&') || identical(string, '||') ||
           identical(string, 'is') || identical(string, 'as') ||
-          identical(string, '===') || identical(string, '!==') ||
           identical(string, '?') ||
           identical(string, '>>>')) {
         return null;
       }
+      SourceString op = source;
       if (!isUserDefinableOperator(source.stringValue)) {
-        source = Elements.mapToUserOperator(source);
+        op = Elements.mapToUserOperatorOrNull(source);
+      }
+      if (op == null) {
+        // Unsupported operator. An error has been reported during parsing.
+        return new Selector.call(
+            source, library, node.argumentsNode.slowLength(), []);
       }
       return node.arguments.isEmpty
-          ? new Selector.unaryOperator(source)
-          : new Selector.binaryOperator(source);
+          ? new Selector.unaryOperator(op)
+          : new Selector.binaryOperator(op);
     }
 
     Identifier identifier = node.selector.asIdentifier();
@@ -2593,6 +2617,8 @@
     Node selector = node.send.selector;
     FunctionElement constructor = resolveConstructor(node);
     final bool isSymbolConstructor = constructor == compiler.symbolConstructor;
+    final bool isMirrorsUsedConstant =
+        node.isConst() && (constructor == compiler.mirrorsUsedConstructor);
     resolveSelector(node.send, constructor);
     resolveArguments(node.send.argumentsNode);
     useElement(node.send, constructor);
@@ -2645,6 +2671,8 @@
         }
         world.registerNewSymbol(mapping);
       }
+    } else if (isMirrorsUsedConstant) {
+      compiler.mirrorUsageAnalyzerTask.validate(node, mapping);
     }
 
     return null;
@@ -3337,9 +3365,8 @@
 
   FunctionElement createForwardingConstructor(FunctionElement target,
                                               ClassElement enclosing) {
-    return new SynthesizedConstructorElementX(target.name,
-                                              target,
-                                              enclosing);
+    return new SynthesizedConstructorElementX(
+        target.name, target, enclosing, false);
   }
 
   void doApplyMixinTo(MixinApplicationElement mixinApplication,
@@ -3854,14 +3881,8 @@
         if (!identical(formalParameters.getEndToken().next.stringValue,
                        // TODO(ahe): Remove the check for native keyword.
                        'native')) {
-          if (compiler.rejectDeprecatedFeatures &&
-              // TODO(ahe): Remove isPlatformLibrary check.
-              !element.getLibrary().isPlatformLibrary) {
-            compiler.reportError(formalParameters,
-                                     MessageKind.EXTRA_FORMALS);
-          } else {
-            compiler.onDeprecatedFeature(formalParameters, 'getter parameters');
-          }
+          compiler.reportError(formalParameters,
+                               MessageKind.EXTRA_FORMALS);
         }
       }
       LinkBuilder<Element> parametersBuilder =
@@ -3890,10 +3911,6 @@
                                  MessageKind.ILLEGAL_SETTER_FORMALS);
       }
     }
-    if (element.isGetter() && (requiredParameterCount != 0
-                               || visitor.optionalParameterCount != 0)) {
-      compiler.reportError(formalParameters, MessageKind.EXTRA_FORMALS);
-    }
     return new FunctionSignatureX(parameters,
                                   visitor.optionalParameters,
                                   requiredParameterCount,
@@ -3939,7 +3956,8 @@
       error(diagnosticNode, kind.error, arguments);
     } else {
       ResolutionWarning warning  =
-          new ResolutionWarning(kind.warning, arguments);
+          new ResolutionWarning(
+              kind.warning, arguments, compiler.terseDiagnostics);
       compiler.reportWarning(diagnosticNode, warning);
       return new ErroneousElementX(
           kind.error, arguments, targetName, enclosing);
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index 65f35e2..7d3cf1c 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -1346,8 +1346,13 @@
       NodeList arguments = new NodeList.singleton(argument);
       pushNode(new Send(receiver, new Operator(token), arguments));
     }
-    if (identical(tokenString, '===') || identical(tokenString, '!==')) {
-      listener.onDeprecatedFeature(token, tokenString);
+    if (identical(tokenString, '===')) {
+      listener.reportError(token, MessageKind.UNSUPPORTED_EQ_EQ_EQ,
+                           {'lhs': receiver, 'rhs': argument});
+    }
+    if (identical(tokenString, '!==')) {
+      listener.reportError(token, MessageKind.UNSUPPORTED_BANG_EQ_EQ,
+                           {'lhs': receiver, 'rhs': argument});
     }
   }
 
@@ -1497,7 +1502,8 @@
   void endRethrowStatement(Token throwToken, Token endToken) {
     pushNode(new Rethrow(throwToken, endToken));
     if (identical(throwToken.stringValue, 'throw')) {
-      listener.onDeprecatedFeature(throwToken, 'throw without an expression');
+      listener.reportError(throwToken,
+                           MessageKind.UNSUPPORTED_THROW_WITHOUT_EXP);
     }
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 12be2f6..7266529 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -4432,15 +4432,6 @@
                   MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS);
               failure = true;
             }
-          } else {
-            DartType constantType =
-                constant.computeType(compiler);
-            if (constantType != firstConstantType) {
-              compiler.reportFatalError(
-                  match.expression,
-                  MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL);
-              failure = true;
-            }
           }
           constants[labelOrCase] = constant;
         }
diff --git a/sdk/lib/_internal/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart
index d9f7c5bc..4b31459 100644
--- a/sdk/lib/_internal/compiler/implementation/typechecker.dart
+++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart
@@ -189,7 +189,8 @@
   LibraryElement get currentLibrary => elements.currentElement.getLibrary();
 
   reportTypeWarning(Node node, MessageKind kind, [Map arguments = const {}]) {
-    compiler.reportWarning(node, new TypeWarning(kind, arguments));
+    compiler.reportWarning(
+        node, new TypeWarning(kind, arguments, compiler.terseDiagnostics));
   }
 
   reportTypeInfo(Spannable node, MessageKind kind, [Map arguments = const {}]) {
@@ -1187,18 +1188,50 @@
   visitSwitchStatement(SwitchStatement node) {
     // TODO(johnniwinther): Handle reachability based on reachability of
     // switch cases.
-    // TODO(johnniwinther): Check assignability to constants.
     DartType expressionType = analyze(node.expression);
+    Map<CaseMatch, DartType> caseTypeMap =
+        new LinkedHashMap<CaseMatch, DartType>();
     for (SwitchCase switchCase in node.cases) {
       for (Node labelOrCase in switchCase.labelsAndCases) {
         CaseMatch caseMatch = labelOrCase.asCaseMatch();
         if (caseMatch == null) continue;
 
         DartType caseType = analyze(caseMatch.expression);
+        caseTypeMap[caseMatch] = caseType;
         checkAssignable(caseMatch, expressionType, caseType);
       }
+
       analyze(switchCase);
     }
+
+    CaseMatch firstCase = null;
+    DartType firstCaseType = null;
+    bool hasReportedProblem = false;
+    caseTypeMap.forEach((CaseMatch caseMatch, DartType caseType) {
+      if (firstCaseType == null) {
+        firstCase = caseMatch;
+        firstCaseType = caseType;
+      } else {
+        if (caseType != firstCaseType) {
+          if (!hasReportedProblem) {
+            compiler.reportError(
+                node,
+                MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL,
+                {'type': firstCaseType});
+            compiler.reportInfo(
+                firstCase.expression,
+                MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
+                {'type': firstCaseType});
+            hasReportedProblem = true;
+          }
+          compiler.reportInfo(
+              caseMatch.expression,
+              MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
+              {'type': caseType});
+        }
+      }
+    });
+
     return StatementType.NOT_RETURNING;
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index 7950a31..803d5a9 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -9,34 +9,33 @@
  *
  * 1. The message should start with exactly one of "Error", "Internal error",
  * "Warning", "Info", or "Hint" followed by a colon. It is crucial to users to
- * be able to locate errors in the midst of warnings, but we are operating
- * under the assumption that these messages will eventually be translated to
- * other languages than English, and that it is therefor not possible to
- * automatically apply these prefixes.
+ * be able to locate errors in the midst of warnings.
+ * TODO(ahe): Remove these prefixes from the error message.
  *
  * 2. After the colon, one space and a complete sentence starting with an
  * uppercase letter, and ending with a period.
  *
- * 3. Reserved words and embedded identifiers should be in quotes (double
- * quotes), so prefer single quotes for the complete message. For example,
- * 'Error: The class "#{className}" cannot use "super".' Notice that the word
- * "class" in the preceding message is not quoted as it refers to the concept
- * "class", not the reserved word. On the other hand, "super" refers to the
- * reserved word. Do not quote "null" and numeric literals.
+ * 3. Reserved words and embedded identifiers should be in single quotes, so
+ * prefer double quotes for the complete message. For example, "Error: The
+ * class '#{className}' can't use 'super'." Notice that the word 'class' in the
+ * preceding message is not quoted as it refers to the concept 'class', not the
+ * reserved word. On the other hand, 'super' refers to the reserved word. Do
+ * not quote 'null' and numeric literals.
  *
  * 4. Do not try to compose messages, as it can make translating them hard.
  *
  * 5. Try to keep the error messages short, but informative.
  *
- * 6. Use simple words and terminology, assume the reader of the message does
- * not have an advanced degree in math, and that English is not the reader's
- * native language. Do not assume any formal computer science training. For
- * example, do not use Latin abbreviations (prefer "that is" over "i.e.", and
- * "for example" over "e.g."). Also avoid phrases such as "if and only if" and
- * "iff", that level of precision is unnecessary.
+ * 6. Use simple words and terminology, assume the reader of the message
+ * doesn't have an advanced degree in math, and that English is not the
+ * reader's native language. Do not assume any formal computer science
+ * training. For example, do not use Latin abbreviations (prefer "that is" over
+ * "i.e.", and "for example" over "e.g."). Also avoid phrases such as "if and
+ * only if" and "iff", that level of precision is unnecessary.
  *
- * 7. Do not use contractions, for example, prefer "cannot" over "can't". This
- * is again to benefit readers to whom English is not their first language.
+ * 7. Prefer contractions when they are in common use, for example, prefer
+ * "can't" over "cannot". Using "cannot", "must not", "shall not", etc. is
+ * off-putting to people new to programming.
  *
  * 8. Use common terminology, preferably from the Dart Language
  * Specification. This increases the user's chance of finding a good
@@ -47,13 +46,38 @@
  * not want to use this product to begin with with.
  *
  * 10. Do not lie, that is, do not write error messages containing phrases like
- * "cannot happen".  If the user ever saw this message, it would be a
- * lie. Prefer messages like: 'Internal error: This function should not be
- * called when "x" is null.'.
+ * "can't happen".  If the user ever saw this message, it would be a
+ * lie. Prefer messages like: "Internal error: This function should not be
+ * called when 'x' is null.".
+ *
+ * 11. Prefer to not use imperative tone. That is, the message should not sound
+ * accusing or like it is ordering the user around. The computer should
+ * describe the problem, not criticize for violating the specification.
+ *
+ * Other things to keep in mind:
+ *
+ * An INFO message should always be preceded by a non-INFO message, and the
+ * INFO messages are additional details about the preceding non-INFO
+ * message. For example, consider duplicated elements. First report a WARNING
+ * or ERROR about the duplicated element, and then report an INFO about the
+ * location of the existing element.
+ *
+ * Generally, we want to provide messages that consists of three sentences:
+ * 1. what is wrong, 2. why is it wrong, 3. how do I fix it. However, we
+ * combine the first two in [template] and the last in [howToFix].
  */
 class MessageKind {
+  /// Should describe what is wrong and why.
   final String template;
-  const MessageKind(this.template);
+
+  /// Should describe how to fix the problem. Elided when using --terse option.
+  final String howToFix;
+
+  /// Examples will be checked by
+  /// tests/compiler/dart2js/message_kind_test.dart.
+  final List<String> examples;
+
+  const MessageKind(this.template, {this.howToFix, this.examples});
 
   /// Do not use this. It is here for legacy and debugging. It violates item 4
   /// above.
@@ -326,7 +350,10 @@
       'Error: "default" only allowed on last case of a switch.');
 
   static const MessageKind SWITCH_CASE_TYPES_NOT_EQUAL = const MessageKind(
-      'Error: "case" expressions do not all have the same type.');
+      'Error: "case" expressions do not all have type "#{type}".');
+
+  static const MessageKind SWITCH_CASE_TYPES_NOT_EQUAL_CASE = const MessageKind(
+      'Info: "case" expression of type "#{type}".');
 
   static const MessageKind SWITCH_CASE_VALUE_OVERRIDES_EQUALS =
       const MessageKind(
@@ -468,18 +495,6 @@
   static const MessageKind OPERATOR_NAMED_PARAMETERS = const MessageKind(
       'Error: Operator "#{operatorName}" cannot have named parameters.');
 
-  // TODO(ahe): This message is hard to localize.  This is acceptable,
-  // as it will be removed when we ship Dart version 1.0.
-  static const MessageKind DEPRECATED_FEATURE_WARNING = const MessageKind(
-      'Warning: Deprecated language feature, #{featureName}, '
-      'will be removed in a future Dart milestone.');
-
-  // TODO(ahe): This message is hard to localize.  This is acceptable,
-  // as it will be removed when we ship Dart version 1.0.
-  static const MessageKind DEPRECATED_FEATURE_ERROR = const MessageKind(
-      'Error: #{featureName} are not legal '
-      'due to option --reject-deprecated-language-features.');
-
   static const MessageKind CONSTRUCTOR_WITH_RETURN_TYPE = const MessageKind(
       'Error: Cannot have return type for constructor.');
 
@@ -534,7 +549,7 @@
       'Warning: Expected part of library name "#{libraryName}".');
 
   static const MessageKind MISSING_PART_OF_TAG = const MessageKind(
-      'Note: This file has no part-of tag, but it is being used as a part.');
+      'Error: This file has no part-of tag, but it is being used as a part.');
 
   static const MessageKind DUPLICATED_PART_OF = const MessageKind(
       'Error: Duplicated part-of directive.');
@@ -616,6 +631,117 @@
   static const MessageKind PACKAGE_ROOT_NOT_SET = const MessageKind(
       'Error: Cannot resolve "#{uri}". Package root has not been set.');
 
+  static const MessageKind UNSUPPORTED_EQ_EQ_EQ = const MessageKind(
+      'Error: "===" is not an operator. '
+      'Did you mean "#{lhs} == #{rhs}" or "identical(#{lhs}, #{rhs})"?');
+
+  static const MessageKind UNSUPPORTED_BANG_EQ_EQ = const MessageKind(
+      'Error: "!==" is not an operator. '
+      'Did you mean "#{lhs} != #{rhs}" or "!identical(#{lhs}, #{rhs})"?');
+
+  static const MessageKind UNSUPPORTED_THROW_WITHOUT_EXP = const MessageKind(
+      'Error: No expression after "throw". '
+      'Did you mean "rethrow"?');
+
+  static const MessageKind MIRRORS_EXPECTED_STRING = const MessageKind(
+      "Hint: Can't use '#{name}' here because it's an instance of '#{type}' "
+      "and a 'String' value is expected.",
+      howToFix: "Did you forget to add quotes?",
+      examples: const [
+          """
+// 'main' is a method, not a class.
+@MirrorsUsed(symbols: const [Foo])
+import 'dart:mirrors';
+
+class Foo {}
+
+main() {}
+"""]);
+
+  static const MessageKind MIRRORS_EXPECTED_STRING_OR_TYPE = const MessageKind(
+      "Hint: Can't use '#{name}' here because it's an instance of '#{type}' "
+      "and a 'String' or 'Type' value is expected.",
+      howToFix: "Did you forget to add quotes?",
+      examples: const [
+          """
+// 'main' is a method, not a class.
+@MirrorsUsed(targets: const [main])
+import 'dart:mirrors';
+
+main() {}
+"""]);
+
+  static const MessageKind MIRRORS_EXPECTED_STRING_OR_LIST = const MessageKind(
+      "Hint: Can't use '#{name}' here because it's an instance of '#{type}' "
+      "and a 'String' or 'List' value is expected.",
+      howToFix: "Did you forget to add quotes?",
+      examples: const [
+          """
+// 'Foo' is not a string.
+@MirrorsUsed(symbols: Foo)
+import 'dart:mirrors';
+
+class Foo {}
+
+main() {}
+"""]);
+
+  static const MessageKind MIRRORS_EXPECTED_STRING_TYPE_OR_LIST =
+      const MessageKind(
+      "Hint: Can't use '#{name}' here because it's an instance of '#{type}' "
+      "but a 'String', 'Type', or 'List' value is expected.",
+      howToFix: "Did you forget to add quotes?",
+      examples: const [
+          """
+// '1' is not a string.
+@MirrorsUsed(targets: 1)
+import 'dart:mirrors';
+
+main() {}
+"""]);
+
+  static const MessageKind MIRRORS_CANNOT_RESOLVE_IN_CURRENT_LIBRARY =
+      const MessageKind(
+      "Hint: Can't find '#{name}' in the current library.",
+      // TODO(ahe): The closest identifiers in edit distance would be nice.
+      howToFix: "Did you forget to add an import?",
+      examples: const [
+          """
+// 'window' is not in scope because dart:html isn't imported.
+@MirrorsUsed(targets: 'window')
+import 'dart:mirrors';
+
+main() {}
+"""]);
+
+  static const MessageKind MIRRORS_CANNOT_RESOLVE_IN_LIBRARY =
+      const MessageKind(
+      "Hint: Can't find '#{name}' in the library '#{library}'.",
+      // TODO(ahe): The closest identifiers in edit distance would be nice.
+      howToFix: "Is '#{name}' spelled right?",
+      examples: const [
+          """
+// 'List' is misspelled.
+@MirrorsUsed(targets: 'dart.core.Lsit')
+import 'dart:mirrors';
+
+main() {}
+"""]);
+
+  static const MessageKind MIRRORS_CANNOT_FIND_IN_ELEMENT =
+      const MessageKind(
+      "Hint: Can't find '#{name}' in '#{element}'.",
+      // TODO(ahe): The closest identifiers in edit distance would be nice.
+      howToFix: "Is '#{name}' spelled right?",
+      examples: const [
+          """
+// 'addAll' is misspelled.
+@MirrorsUsed(targets: 'dart.core.List.addAl')
+import 'dart:mirrors';
+
+main() {}
+"""]);
+
   static const MessageKind COMPILER_CRASHED = const MessageKind(
       'Error: The compiler crashed when compiling this element.');
 
@@ -733,12 +859,12 @@
 
   toString() => template;
 
-  Message message([Map arguments = const {}]) {
-    return new Message(this, arguments);
+  Message message([Map arguments = const {}, bool terse = false]) {
+    return new Message(this, arguments, terse);
   }
 
-  CompilationError error([Map arguments = const {}]) {
-    return new CompilationError(this, arguments);
+  CompilationError error([Map arguments = const {}, bool terse = false]) {
+    return new CompilationError(this, arguments, terse);
   }
 }
 
@@ -750,11 +876,12 @@
 }
 
 class Message {
-  final kind;
+  final MessageKind kind;
   final Map arguments;
+  final bool terse;
   String message;
 
-  Message(this.kind, this.arguments) {
+  Message(this.kind, this.arguments, this.terse) {
     assert(() { computeMessage(); return true; });
   }
 
@@ -769,6 +896,14 @@
           CURRENT_ELEMENT_SPANNABLE,
           !message.contains(new RegExp(r'#\{.+\}')),
           message: 'Missing arguments in error message: "$message"'));
+      if (!terse && kind.howToFix != null) {
+        String howToFix = kind.howToFix;
+        arguments.forEach((key, value) {
+          String string = slowToString(value);
+          howToFix = howToFix.replaceAll('#{${key}}', string);
+        });
+        message = '$message\n$howToFix';
+      }
     }
     return message;
   }
@@ -795,27 +930,27 @@
 
 class Diagnostic {
   final Message message;
-  Diagnostic(MessageKind kind, [Map arguments = const {}])
-      : message = new Message(kind, arguments);
+  Diagnostic(MessageKind kind, Map arguments, bool terse)
+      : message = new Message(kind, arguments, terse);
   String toString() => message.toString();
 }
 
 class TypeWarning extends Diagnostic {
-  TypeWarning(MessageKind kind, [Map arguments = const {}])
-    : super(kind, arguments);
+  TypeWarning(MessageKind kind, Map arguments, bool terse)
+    : super(kind, arguments, terse);
 }
 
 class ResolutionWarning extends Diagnostic {
-  ResolutionWarning(MessageKind kind, [Map arguments = const {}])
-    : super(kind, arguments);
+  ResolutionWarning(MessageKind kind, Map arguments, bool terse)
+    : super(kind, arguments, terse);
 }
 
 class CompileTimeConstantError extends Diagnostic {
-  CompileTimeConstantError(MessageKind kind, [Map arguments = const {}])
-    : super(kind, arguments);
+  CompileTimeConstantError(MessageKind kind, Map arguments, bool terse)
+    : super(kind, arguments, terse);
 }
 
 class CompilationError extends Diagnostic {
-  CompilationError(MessageKind kind, [Map arguments = const {}])
-    : super(kind, arguments);
+  CompilationError(MessageKind kind, Map arguments, bool terse)
+    : super(kind, arguments, terse);
 }
diff --git a/sdk/lib/_internal/lib/core_patch.dart b/sdk/lib/_internal/lib/core_patch.dart
index 9d44abf..b256d0f 100644
--- a/sdk/lib/_internal/lib/core_patch.dart
+++ b/sdk/lib/_internal/lib/core_patch.dart
@@ -310,3 +310,7 @@
     }
   }
 }
+
+patch class Uri {
+  patch static bool get _isWindows => false;
+}
diff --git a/sdk/lib/_internal/lib/io_patch.dart b/sdk/lib/_internal/lib/io_patch.dart
index d5e55c6..5725d1e 100644
--- a/sdk/lib/_internal/lib/io_patch.dart
+++ b/sdk/lib/_internal/lib/io_patch.dart
@@ -162,6 +162,9 @@
   patch static _localHostname() {
     throw new UnsupportedError("Platform._localHostname");
   }
+  patch static _executable() {
+    throw new UnsupportedError("Platform_Executable");
+  }
   patch static _environment() {
     throw new UnsupportedError("Platform._environment");
   }
diff --git a/sdk/lib/_internal/pub/lib/src/dart.dart b/sdk/lib/_internal/pub/lib/src/dart.dart
index c912fab..ce4d59d 100644
--- a/sdk/lib/_internal/pub/lib/src/dart.dart
+++ b/sdk/lib/_internal/pub/lib/src/dart.dart
@@ -66,6 +66,6 @@
   // but it parts in another file that does.
   return dart.declarations.any((node) {
     return node is FunctionDeclaration && node.name.name == "main" &&
-        node.functionExpression.parameters.elements.isEmpty;
+        node.functionExpression.parameters.parameters.isEmpty;
   });
 }
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index 70888bc..b382b44 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -270,10 +270,15 @@
 
     return git.isInstalled.then((gitInstalled) {
       if (dirExists(path.join(root.dir, '.git')) && gitInstalled) {
+        // Later versions of git do not allow a path for ls-files that appears
+        // to be outside of the repo, so make sure we give it a relative path.
+        var relativeBeneath = path.relative(beneath, from: root.dir);
+
         // List all files that aren't gitignored, including those not checked
         // in to Git.
         return git.run(
-            ["ls-files", "--cached", "--others", "--exclude-standard", beneath],
+            ["ls-files", "--cached", "--others", "--exclude-standard",
+             relativeBeneath],
             workingDir: root.dir).then((files) {
           // Git always prints files relative to the project root, but we want
           // them relative to the working directory. It also prints forward
diff --git a/sdk/lib/convert/convert.dart b/sdk/lib/convert/convert.dart
index 6c76db0..4003684 100644
--- a/sdk/lib/convert/convert.dart
+++ b/sdk/lib/convert/convert.dart
@@ -13,5 +13,6 @@
 part 'converter.dart';
 part 'encoding.dart';
 part 'json.dart';
+part 'line_splitter.dart';
 part 'string_conversion.dart';
 part 'utf.dart';
diff --git a/sdk/lib/convert/convert_sources.gypi b/sdk/lib/convert/convert_sources.gypi
index 295451f..eaf9952 100644
--- a/sdk/lib/convert/convert_sources.gypi
+++ b/sdk/lib/convert/convert_sources.gypi
@@ -13,6 +13,7 @@
     'converter.dart',
     'encoding.dart',
     'json.dart',
+    'line_splitter.dart',
     'string_conversion.dart',
     'utf.dart',
   ],
diff --git a/sdk/lib/convert/line_splitter.dart b/sdk/lib/convert/line_splitter.dart
new file mode 100644
index 0000000..cc9ad94
--- /dev/null
+++ b/sdk/lib/convert/line_splitter.dart
@@ -0,0 +1,90 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart.convert;
+
+/**
+ * This class splits [String] values into individual lines.
+ */
+class LineSplitter extends Converter<String, List<String>> {
+  List<String> convert(String data) {
+    var lines = new List<String>();
+
+    _LineSplitterSink._addSlice(data, 0, data.length, true, lines.add);
+
+    return lines;
+  }
+
+  StringConversionSink startChunkedConversion(
+    ChunkedConversionSink<String> sink) {
+
+    if (sink is! StringConversionSink) {
+      sink = new StringConversionSink.from(sink);
+    }
+    return new _LineSplitterSink(sink);
+  }
+}
+
+// TODO(floitsch): deal with utf8.
+class _LineSplitterSink extends StringConversionSinkBase {
+  static const int _LF = 10;
+  static const int _CR = 13;
+
+  final StringConversionSink _sink;
+
+  String _carry;
+
+  _LineSplitterSink(this._sink);
+
+  void addSlice(String chunk, int start, int end, bool isLast) {
+    if(_carry != null) {
+      chunk = _carry + chunk.substring(start, end);
+      start = 0;
+      end = chunk.length;
+      _carry = null;
+    }
+    _carry = _addSlice(chunk, start, end, isLast, _sink.add);
+    if(isLast) _sink.close();
+  }
+
+  void close() {
+    addSlice('', 0, 0, true);
+  }
+
+  static String _addSlice(String chunk, int start, int end, bool isLast, void adder(String val)) {
+    int pos = start;
+    while (pos < end) {
+      int skip = 0;
+      int char = chunk.codeUnitAt(pos);
+      if (char == _LF) {
+        skip = 1;
+      } else if (char == _CR) {
+        skip = 1;
+        if (pos + 1 < end) {
+          if (chunk.codeUnitAt(pos + 1) == _LF) {
+            skip = 2;
+          }
+        } else if (!isLast) {
+          return chunk.substring(start, end);
+        }
+      }
+      if (skip > 0) {
+        adder(chunk.substring(start, pos));
+        start = pos = pos + skip;
+      } else {
+        pos++;
+      }
+    }
+    if (pos != start) {
+      var carry = chunk.substring(start, pos);
+      if(isLast) {
+        // Add remaining
+        adder(carry);
+      } else {
+        return carry;
+      }
+    }
+    return null;
+  }
+}
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 73ce45b..02573c2 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -263,6 +263,175 @@
   }
 
   /**
+   * Creates a new file URI from an absolute or relative file path.
+   *
+   * The file path is passed in [path].
+   *
+   * This path is interpreted using either Windows or non-Windows
+   * semantics.
+   *
+   * With non-Windows semantics the slash ("/") is used to separate
+   * path segments.
+   *
+   * With Windows semantics, backslash ("\") and forward-slash ("/")
+   * are used to separate path segments, except if the path starts
+   * with "\\?\" in which case, only backslash ("\") separates path
+   * segments.
+   *
+   * If the path starts with a path separator an absolute URI is
+   * created. Otherwise a relative URI is created. One exception from
+   * this rule is that when Windows semantics is used and the path
+   * starts with a drive letter followed by a colon (":") and a
+   * path separator then an absolute URI is created.
+   *
+   * The default for whether to use Windows or non-Windows semantics
+   * determined from the platform Dart is running on. When running in
+   * the standalone VM this is detected by the VM based on the
+   * operating system. When running in a browser non-Windows semantics
+   * is always used.
+   *
+   * To override the automatic detection of which semantics to use pass
+   * a value for [windows]. Passing `true` will use Windows
+   * semantics and passing `false` will use non-Windows semantics.
+   *
+   * Examples using non-Windows semantics (resulting URI in comment):
+   *
+   *     new Uri.file("xxx/yyy");  // xxx/yyy
+   *     new Uri.file("xxx/yyy/");  // xxx/yyy/
+   *     new Uri.file("/xxx/yyy");  // file:///xxx/yyy
+   *     new Uri.file("/xxx/yyy/");  // file:///xxx/yyy/
+   *     new Uri.file("C:");  // C:
+   *
+   * Examples using Windows semantics (resulting URI in comment):
+   *
+   *     new Uri.file(r"xxx\yyy");  // xxx/yyy
+   *     new Uri.file(r"xxx\yyy\");  // xxx/yyy/
+   *     new Uri.file(r"\xxx\yyy");  // file:///xxx/yyy
+   *     new Uri.file(r"\xxx\yyy/");  // file:///xxx/yyy/
+   *     new Uri.file(r"C:\xxx\yyy");  // file:///C:/xxx/yyy
+   *     new Uri.file(r"C:xxx\yyy");  // Throws as path with drive letter
+   *                                  // is not absolute.
+   *     new Uri.file(r"\\server\share\file");  // file://server/share/file
+   *     new Uri.file(r"C:");  // Throws as path with drive letter
+   *                           // is not absolute.
+   *
+   * If the path passed is not a legal file path [ArgumentError] is thrown.
+   */
+  factory Uri.file(String path, {bool windows}) {
+    windows = windows == null ? Uri._isWindows : windows;
+    return windows ? _makeWindowsFileUrl(path) : _makeFileUri(path);
+  }
+
+  external static bool get _isWindows;
+
+  static _checkNonWindowsPathReservedCharacters(List<String> segments,
+                                                bool argumentError) {
+    segments.forEach((segment) {
+      if (segment.contains("/")) {
+        if (argumentError) {
+          throw new ArgumentError("Illegal path character $segment");
+        } else {
+          throw new UnsupportedError("Illegal path character $segment");
+        }
+      }
+    });
+  }
+
+  static _checkWindowsPathReservedCharacters(List<String> segments,
+                                             bool argumentError,
+                                             [int firstSegment = 0]) {
+    segments.skip(firstSegment).forEach((segment) {
+      if (segment.contains(new RegExp(r'["*/:<>?\\|]'))) {
+        if (argumentError) {
+          throw new ArgumentError("Illegal character in path}");
+        } else {
+          throw new UnsupportedError("Illegal character in path}");
+        }
+      }
+    });
+  }
+
+  static _checkWindowsDriveLetter(int charCode, bool argumentError) {
+    if ((_UPPER_CASE_A <= charCode && charCode <= _UPPER_CASE_Z) ||
+        (_LOWER_CASE_A <= charCode && charCode <= _LOWER_CASE_Z)) {
+      return;
+    }
+    if (argumentError) {
+      throw new ArgumentError("Illegal drive letter " +
+                              new String.fromCharCode(charCode));
+    } else {
+      throw new UnsupportedError("Illegal drive letter " +
+                              new String.fromCharCode(charCode));
+    }
+  }
+
+  static _makeFileUri(String path) {
+    String sep = "/";
+    if (path.length > 0 && path[0] == sep) {
+      // Absolute file:// URI.
+      return new Uri(scheme: "file", pathSegments: path.split(sep));
+    } else {
+      // Relative URI.
+      return new Uri(pathSegments: path.split(sep));
+    }
+  }
+
+  static _makeWindowsFileUrl(String path) {
+    if (path.startsWith("\\\\?\\")) {
+      if (path.startsWith("\\\\?\\UNC\\")) {
+        path = "\\${path.substring(7)}";
+      } else {
+        path = path.substring(4);
+        if (path.length < 3 ||
+            path.codeUnitAt(1) != _COLON ||
+            path.codeUnitAt(2) != _BACKSLASH) {
+          throw new ArgumentError(
+              "Windows paths with \\\\?\\ prefix must be absolute");
+        }
+      }
+    } else {
+      path = path.replaceAll("/", "\\");
+    }
+    String sep = "\\";
+    if (path.length > 1 && path[1] == ":") {
+      _checkWindowsDriveLetter(path.codeUnitAt(0), true);
+      if (path.length == 2 || path.codeUnitAt(2) != _BACKSLASH) {
+        throw new ArgumentError(
+            "Windows paths with drive letter must be absolute");
+      }
+      // Absolute file://C:/ URI.
+      var pathSegments = path.split(sep);
+      _checkWindowsPathReservedCharacters(pathSegments, true, 1);
+      return new Uri(scheme: "file", pathSegments: pathSegments);
+    }
+
+    if (path.length > 0 && path[0] == sep) {
+      if (path.length > 1 && path[1] == sep) {
+        // Absolute file:// URI with host.
+        int pathStart = path.indexOf("\\", 2);
+        String hostPart =
+            pathStart == -1 ? path.substring(2) : path.substring(2, pathStart);
+        String pathPart =
+            pathStart == -1 ? "" : path.substring(pathStart + 1);
+        var pathSegments = pathPart.split(sep);
+        _checkWindowsPathReservedCharacters(pathSegments, true);
+        return new Uri(
+            scheme: "file", host: hostPart, pathSegments: pathSegments);
+      } else {
+        // Absolute file:// URI.
+        var pathSegments = path.split(sep);
+        _checkWindowsPathReservedCharacters(pathSegments, true);
+        return new Uri(scheme: "file", pathSegments: pathSegments);
+      }
+    } else {
+      // Relative URI.
+      var pathSegments = path.split(sep);
+      _checkWindowsPathReservedCharacters(pathSegments, true);
+      return new Uri(pathSegments: 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. A leading slash `/` does
@@ -651,6 +820,127 @@
     return "$scheme://$host:$port";
   }
 
+  /**
+   * Returns the file path from a file URI.
+   *
+   * The returned path has either Windows or non-Windows
+   * semantics.
+   *
+   * For non-Windows semantics the slash ("/") is used to separate
+   * path segments.
+   *
+   * For Windows semantics the backslash ("\") separator is used to
+   * separate path segments.
+   *
+   * If the URI is absolute the path starts with a path separator
+   * unless Windows semantics is used and the first path segment is a
+   * drive letter. When Windows semantics is used a host component in
+   * the uri in interpreted as a file server and a UNC path is
+   * returned.
+   *
+   * The default for whether to use Windows or non-Windows semantics
+   * determined from the platform Dart is running on. When running in
+   * the standalone VM this is detected by the VM based on the
+   * operating system. When running in a browser non-Windows semantics
+   * is always used.
+   *
+   * To override the automatic detection of which semantics to use pass
+   * a value for [windows]. Passing `true` will use Windows
+   * semantics and passing `false` will use non-Windows semantics.
+   *
+   * If the URI ends with a slash (i.e. the last path component is
+   * empty) the returned file path will also end with a slash.
+   *
+   * With Windows semantics URIs starting with a drive letter cannot
+   * be relative to the current drive on the designated drive. That is
+   * for the URI `file:///c:abc` calling `toFilePath` will throw as a
+   * path segment cannot contain colon on Windows.
+   *
+   * Examples using non-Windows semantics (resulting of calling
+   * toFilePath in comment):
+   *
+   *     Uri.parse("xxx/yyy");  // xxx/yyy
+   *     Uri.parse("xxx/yyy/");  // xxx/yyy/
+   *     Uri.parse("file:///xxx/yyy");  // /xxx/yyy
+   *     Uri.parse("file:///xxx/yyy/");  // /xxx/yyy/
+   *     Uri.parse("file:///C:");  // /C:
+   *     Uri.parse("file:///C:a");  // /C:a
+   *
+   * Examples using Windows semantics (resulting URI in comment):
+   *
+   *     Uri.parse("xxx/yyy");  // xxx\yyy
+   *     Uri.parse("xxx/yyy/");  // xxx\yyy\
+   *     Uri.parse("file:///xxx/yyy");  // \xxx\yyy
+   *     Uri.parse("file:///xxx/yyy/");  // \xxx\yyy/
+   *     Uri.parse("file:///C:/xxx/yyy");  // C:\xxx\yyy
+   *     Uri.parse("file:C:xxx/yyy");  // Throws as a path segment
+   *                                   // cannot contain colon on Windows.
+   *     Uri.parse("file://server/share/file");  // \\server\share\file
+   *
+   * If the URI is not a file URI calling this throws
+   * [UnsupportedError].
+   *
+   * If the URI cannot be converted to a file path calling this throws
+   * [UnsupportedError].
+   */
+  String toFilePath({bool windows}) {
+    if (scheme != "" && scheme != "file") {
+      throw new UnsupportedError(
+          "Cannot extract a file path from a $scheme URI");
+    }
+    if (scheme != "" && scheme != "file") {
+      throw new UnsupportedError(
+          "Cannot extract a file path from a $scheme URI");
+    }
+    if (query != "") {
+      throw new UnsupportedError(
+          "Cannot extract a file path from a URI with a query component");
+    }
+    if (fragment != "") {
+      throw new UnsupportedError(
+          "Cannot extract a file path from a URI with a fragment component");
+    }
+    if (windows == null) windows = _isWindows;
+    return windows ? _toWindowsFilePath() : _toFilePath();
+  }
+
+  String _toFilePath() {
+    if (host != "") {
+      throw new UnsupportedError(
+          "Cannot extract a non-Windows file path from a file URI "
+          "with an authority");
+    }
+    _checkNonWindowsPathReservedCharacters(pathSegments, false);
+    var result = new StringBuffer();
+    if (isAbsolute) result.write("/");
+    result.writeAll(pathSegments, "/");
+    return result.toString();
+  }
+
+  String _toWindowsFilePath() {
+    bool hasDriveLetter = false;
+    var segments = pathSegments;
+    if (segments.length > 0 &&
+        segments[0].length == 2 &&
+        segments[0].codeUnitAt(1) == _COLON) {
+      _checkWindowsDriveLetter(segments[0].codeUnitAt(0), false);
+      _checkWindowsPathReservedCharacters(segments, false, 1);
+      hasDriveLetter = true;
+    } else {
+      _checkWindowsPathReservedCharacters(segments, false);
+    }
+    var result = new StringBuffer();
+    if (isAbsolute && !hasDriveLetter) result.write("\\");
+    if (host != "") {
+      result.write("\\");
+      result.write(host);
+      result.write("\\");
+    }
+    result.writeAll(segments, "\\");
+    if (hasDriveLetter && segments.length == 1) result.write("\\");
+    return result.toString();
+  }
+
   void _writeAuthority(StringSink ss) {
     _addIfNonEmpty(ss, userInfo, userInfo, "@");
     ss.write(host == null ? "null" :
@@ -840,17 +1130,26 @@
   }
 
   // Frequently used character codes.
+  static const int _DOUBLE_QUOTE = 0x22;
   static const int _PERCENT = 0x25;
+  static const int _ASTERISK = 0x2A;
   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;
+  static const int _LESS = 0x3C;
+  static const int _GREATER = 0x3E;
+  static const int _QUESTION = 0x3F;
   static const int _AT_SIGN = 0x40;
   static const int _UPPER_CASE_A = 0x41;
   static const int _UPPER_CASE_F = 0x46;
+  static const int _UPPER_CASE_Z = 0x5A;
+  static const int _BACKSLASH = 0x5C;
   static const int _LOWER_CASE_A = 0x61;
   static const int _LOWER_CASE_F = 0x66;
+  static const int _LOWER_CASE_Z = 0x7A;
+  static const int _BAR = 0x7C;
 
   /**
    * This is the internal implementation of JavaScript's encodeURI function.
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 76a9830..dfaa5ed 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -81,16 +81,14 @@
 
 Future<SendPort> spawnDomFunction(Function f) =>
   new Future.value(IsolateNatives.spawnDomFunction(f));
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
 @DocsEditable()
 @DomName('AbstractWorker')
-class AbstractWorker extends EventTarget native "AbstractWorker" {
-  // To suppress missing implicit constructor warnings.
-  factory AbstractWorker._() { throw new UnsupportedError("Not supported"); }
+class AbstractWorker extends Interceptor implements EventTarget native "AbstractWorker" {
 
   @DomName('AbstractWorker.errorEvent')
   @DocsEditable()
@@ -106,6 +104,55 @@
 
 
 @DocsEditable()
+@DomName('AesCbcParams')
+@Experimental() // untriaged
+class AesCbcParams extends Algorithm native "AesCbcParams" {
+  // To suppress missing implicit constructor warnings.
+  factory AesCbcParams._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AesCbcParams.iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Uint8List iv;
+}
+// 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('AesKeyGenParams')
+@Experimental() // untriaged
+class AesKeyGenParams extends Algorithm native "AesKeyGenParams" {
+  // To suppress missing implicit constructor warnings.
+  factory AesKeyGenParams._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AesKeyGenParams.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int length;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
+@DomName('Algorithm')
+@Experimental() // untriaged
+class Algorithm extends Interceptor native "Algorithm" {
+
+  @DomName('Algorithm.name')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final 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
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
 @DomName('HTMLAnchorElement')
 class AnchorElement extends _HTMLElement native "HTMLAnchorElement" {
   // To suppress missing implicit constructor warnings.
@@ -299,20 +346,6 @@
   @DocsEditable()
   void abort() native;
 
-  @JSName('addEventListener')
-  @DomName('DOMApplicationCache.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
-  @DomName('DOMApplicationCache.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native;
-
-  @JSName('removeEventListener')
-  @DomName('DOMApplicationCache.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('DOMApplicationCache.swapCache')
   @DocsEditable()
   void swapCache() native;
@@ -321,6 +354,22 @@
   @DocsEditable()
   void update() native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('DOMApplicationCache.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('DOMApplicationCache.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('DOMApplicationCache.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('DOMApplicationCache.oncached')
   @DocsEditable()
   Stream<Event> get onCached => cachedEvent.forTarget(this);
@@ -645,51 +694,51 @@
 
   @DomName('HTMLBodyElement.onblur')
   @DocsEditable()
-  Stream<Event> get onBlur => blurEvent.forTarget(this);
+  ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onerror')
   @DocsEditable()
-  Stream<Event> get onError => errorEvent.forTarget(this);
+  ElementStream<Event> get onError => errorEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onfocus')
   @DocsEditable()
-  Stream<Event> get onFocus => focusEvent.forTarget(this);
+  ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onhashchange')
   @DocsEditable()
-  Stream<Event> get onHashChange => hashChangeEvent.forTarget(this);
+  ElementStream<Event> get onHashChange => hashChangeEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onload')
   @DocsEditable()
-  Stream<Event> get onLoad => loadEvent.forTarget(this);
+  ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onmessage')
   @DocsEditable()
-  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
+  ElementStream<MessageEvent> get onMessage => messageEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onoffline')
   @DocsEditable()
-  Stream<Event> get onOffline => offlineEvent.forTarget(this);
+  ElementStream<Event> get onOffline => offlineEvent.forElement(this);
 
   @DomName('HTMLBodyElement.ononline')
   @DocsEditable()
-  Stream<Event> get onOnline => onlineEvent.forTarget(this);
+  ElementStream<Event> get onOnline => onlineEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onpopstate')
   @DocsEditable()
-  Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
+  ElementStream<PopStateEvent> get onPopState => popStateEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onresize')
   @DocsEditable()
-  Stream<Event> get onResize => resizeEvent.forTarget(this);
+  ElementStream<Event> get onResize => resizeEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onstorage')
   @DocsEditable()
-  Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);
+  ElementStream<StorageEvent> get onStorage => storageEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onunload')
   @DocsEditable()
-  Stream<Event> get onUnload => unloadEvent.forTarget(this);
+  ElementStream<Event> get onUnload => unloadEvent.forElement(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -907,11 +956,11 @@
 
   @DomName('HTMLCanvasElement.onwebglcontextlost')
   @DocsEditable()
-  Stream<gl.ContextEvent> get onWebGlContextLost => webGlContextLostEvent.forTarget(this);
+  ElementStream<gl.ContextEvent> get onWebGlContextLost => webGlContextLostEvent.forElement(this);
 
   @DomName('HTMLCanvasElement.onwebglcontextrestored')
   @DocsEditable()
-  Stream<gl.ContextEvent> get onWebGlContextRestored => webGlContextRestoredEvent.forTarget(this);
+  ElementStream<gl.ContextEvent> get onWebGlContextRestored => webGlContextRestoredEvent.forElement(this);
 
   /** An API for drawing on this canvas. */
   CanvasRenderingContext2D get context2D =>
@@ -1734,13 +1783,19 @@
 @Experimental()
 class Composition extends Interceptor native "Composition" {
 
-  @DomName('Composition.caret')
+  @DomName('Composition.selectionEnd')
   @DocsEditable()
-  final Range caret;
+  @Experimental() // untriaged
+  final int selectionEnd;
+
+  @DomName('Composition.selectionStart')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int selectionStart;
 
   @DomName('Composition.text')
   @DocsEditable()
-  final Node text;
+  final String text;
 }
 // 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
@@ -1982,6 +2037,43 @@
 
 
 @DocsEditable()
+@DomName('CryptoOperation')
+@Experimental() // untriaged
+class CryptoOperation extends Interceptor native "CryptoOperation" {
+
+  @DomName('CryptoOperation.algorithm')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Algorithm algorithm;
+
+  @DomName('CryptoOperation.abort')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object abort() native;
+
+  @DomName('CryptoOperation.finish')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object finish() native;
+
+  @JSName('process')
+  @DomName('CryptoOperation.process')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation processByteBuffer(ByteBuffer data) native;
+
+  @JSName('process')
+  @DomName('CryptoOperation.process')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation processTypedData(TypedData data) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
 @DomName('CSS')
 // http://www.w3.org/TR/css3-conditional/#the-css-interface
 @Experimental() // None
@@ -2654,6 +2746,12 @@
   @DocsEditable()
   final CssRule parentRule;
 
+  @JSName('var')
+  @DomName('CSSStyleDeclaration.var')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final CssVariablesMap _var;
+
   @DomName('CSSStyleDeclaration.__setter__')
   @DocsEditable()
   void __setter__(String propertyName, String propertyValue) native;
@@ -6090,6 +6188,46 @@
 
 
 @DocsEditable()
+@DomName('CSSVariablesMap')
+@Experimental() // untriaged
+class CssVariablesMap extends Interceptor native "CSSVariablesMap" {
+
+  @DomName('CSSVariablesMap.size')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int size;
+
+  @DomName('CSSVariablesMap.clear')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clear() native;
+
+  @DomName('CSSVariablesMap.delete')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool delete(String name) native;
+
+  @DomName('CSSVariablesMap.get')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get(String name) native;
+
+  @DomName('CSSVariablesMap.has')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool has(String name) native;
+
+  @DomName('CSSVariablesMap.set')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set(String name, String value) native;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
 @DomName('CSSViewportRule')
 @Experimental() // untriaged
 class CssViewportRule extends CssRule native "CSSViewportRule" {
@@ -6340,6 +6478,33 @@
 
 
 @DocsEditable()
+@DomName('DedicatedWorkerGlobalScope')
+@Experimental() // untriaged
+class DedicatedWorkerGlobalScope extends WorkerGlobalScope native "DedicatedWorkerGlobalScope" {
+  // To suppress missing implicit constructor warnings.
+  factory DedicatedWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('DedicatedWorkerGlobalScope.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
+  @DomName('DedicatedWorkerGlobalScope.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void postMessage(Object message, [List messagePorts]) native;
+
+  @DomName('DedicatedWorkerGlobalScope.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
 @DomName('HTMLDetailsElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -6493,9 +6658,14 @@
   @DocsEditable()
   bool open;
 
+  @DomName('HTMLDialogElement.returnValue')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String returnValue;
+
   @DomName('HTMLDialogElement.close')
   @DocsEditable()
-  void close() native;
+  void close(String returnValue) native;
 
   @DomName('HTMLDialogElement.show')
   @DocsEditable()
@@ -7293,6 +7463,16 @@
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
+  @DomName('Document.onmouseenter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent.forTarget(this);
+
+  @DomName('Document.onmouseleave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent.forTarget(this);
+
   @DomName('Document.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
@@ -8053,6 +8233,234 @@
    */
   @Experimental()
   CssRect get marginEdge;
+
+  @DomName('Element.onabort')
+  @DocsEditable()
+  ElementStream<Event> get onAbort;
+
+  @DomName('Element.onbeforecopy')
+  @DocsEditable()
+  ElementStream<Event> get onBeforeCopy;
+
+  @DomName('Element.onbeforecut')
+  @DocsEditable()
+  ElementStream<Event> get onBeforeCut;
+
+  @DomName('Element.onbeforepaste')
+  @DocsEditable()
+  ElementStream<Event> get onBeforePaste;
+
+  @DomName('Element.onblur')
+  @DocsEditable()
+  ElementStream<Event> get onBlur;
+
+  @DomName('Element.onchange')
+  @DocsEditable()
+  ElementStream<Event> get onChange;
+
+  @DomName('Element.onclick')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onClick;
+
+  @DomName('Element.oncontextmenu')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onContextMenu;
+
+  @DomName('Element.oncopy')
+  @DocsEditable()
+  ElementStream<Event> get onCopy;
+
+  @DomName('Element.oncut')
+  @DocsEditable()
+  ElementStream<Event> get onCut;
+
+  @DomName('Element.ondblclick')
+  @DocsEditable()
+  ElementStream<Event> get onDoubleClick;
+
+  @DomName('Element.ondrag')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDrag;
+
+  @DomName('Element.ondragend')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragEnd;
+
+  @DomName('Element.ondragenter')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragEnter;
+
+  @DomName('Element.ondragleave')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragLeave;
+
+  @DomName('Element.ondragover')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragOver;
+
+  @DomName('Element.ondragstart')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragStart;
+
+  @DomName('Element.ondrop')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDrop;
+
+  @DomName('Element.onerror')
+  @DocsEditable()
+  ElementStream<Event> get onError;
+
+  @DomName('Element.onfocus')
+  @DocsEditable()
+  ElementStream<Event> get onFocus;
+
+  @DomName('Element.oninput')
+  @DocsEditable()
+  ElementStream<Event> get onInput;
+
+  @DomName('Element.oninvalid')
+  @DocsEditable()
+  ElementStream<Event> get onInvalid;
+
+  @DomName('Element.onkeydown')
+  @DocsEditable()
+  ElementStream<KeyboardEvent> get onKeyDown;
+
+  @DomName('Element.onkeypress')
+  @DocsEditable()
+  ElementStream<KeyboardEvent> get onKeyPress;
+
+  @DomName('Element.onkeyup')
+  @DocsEditable()
+  ElementStream<KeyboardEvent> get onKeyUp;
+
+  @DomName('Element.onload')
+  @DocsEditable()
+  ElementStream<Event> get onLoad;
+
+  @DomName('Element.onmousedown')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseDown;
+
+  @DomName('Element.onmouseenter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<MouseEvent> get onMouseEnter;
+
+  @DomName('Element.onmouseleave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<MouseEvent> get onMouseLeave;
+
+  @DomName('Element.onmousemove')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseMove;
+
+  @DomName('Element.onmouseout')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseOut;
+
+  @DomName('Element.onmouseover')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseOver;
+
+  @DomName('Element.onmouseup')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseUp;
+
+  @DomName('Element.onmousewheel')
+  @DocsEditable()
+  // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
+  @Experimental() // non-standard
+  ElementStream<WheelEvent> get onMouseWheel;
+
+  @DomName('Element.onpaste')
+  @DocsEditable()
+  ElementStream<Event> get onPaste;
+
+  @DomName('Element.onreset')
+  @DocsEditable()
+  ElementStream<Event> get onReset;
+
+  @DomName('Element.onscroll')
+  @DocsEditable()
+  ElementStream<Event> get onScroll;
+
+  @DomName('Element.onsearch')
+  @DocsEditable()
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental()
+  ElementStream<Event> get onSearch;
+
+  @DomName('Element.onselect')
+  @DocsEditable()
+  ElementStream<Event> get onSelect;
+
+  @DomName('Element.onselectstart')
+  @DocsEditable()
+  @Experimental() // nonstandard
+  ElementStream<Event> get onSelectStart;
+
+  @DomName('Element.onsubmit')
+  @DocsEditable()
+  ElementStream<Event> get onSubmit;
+
+  @DomName('Element.ontouchcancel')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchCancel;
+
+  @DomName('Element.ontouchend')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchEnd;
+
+  @DomName('Element.ontouchenter')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchEnter;
+
+  @DomName('Element.ontouchleave')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchLeave;
+
+  @DomName('Element.ontouchmove')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchMove;
+
+  @DomName('Element.ontouchstart')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchStart;
+
+  @DomName('Element.ontransitionend')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.FIREFOX)
+  @SupportedBrowser(SupportedBrowser.IE, '10')
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  ElementStream<TransitionEvent> get onTransitionEnd;
+
+  @DomName('Element.onwebkitfullscreenchange')
+  @DocsEditable()
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental()
+  ElementStream<Event> get onFullscreenChange;
+
+  @DomName('Element.onwebkitfullscreenerror')
+  @DocsEditable()
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental()
+  ElementStream<Event> get onFullscreenError;
+ 
 }
 
 // TODO(jacobr): this is an inefficient implementation but it is hard to see
@@ -8106,6 +8514,234 @@
   CssRect get borderEdge => _elementList.first.borderEdge;
 
   CssRect get marginEdge => _elementList.first.marginEdge;
+
+  @DomName('Element.onabort')
+  @DocsEditable()
+  ElementStream<Event> get onAbort => Element.abortEvent._forElementList(this);
+
+  @DomName('Element.onbeforecopy')
+  @DocsEditable()
+  ElementStream<Event> get onBeforeCopy => Element.beforeCopyEvent._forElementList(this);
+
+  @DomName('Element.onbeforecut')
+  @DocsEditable()
+  ElementStream<Event> get onBeforeCut => Element.beforeCutEvent._forElementList(this);
+
+  @DomName('Element.onbeforepaste')
+  @DocsEditable()
+  ElementStream<Event> get onBeforePaste => Element.beforePasteEvent._forElementList(this);
+
+  @DomName('Element.onblur')
+  @DocsEditable()
+  ElementStream<Event> get onBlur => Element.blurEvent._forElementList(this);
+
+  @DomName('Element.onchange')
+  @DocsEditable()
+  ElementStream<Event> get onChange => Element.changeEvent._forElementList(this);
+
+  @DomName('Element.onclick')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onClick => Element.clickEvent._forElementList(this);
+
+  @DomName('Element.oncontextmenu')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onContextMenu => Element.contextMenuEvent._forElementList(this);
+
+  @DomName('Element.oncopy')
+  @DocsEditable()
+  ElementStream<Event> get onCopy => Element.copyEvent._forElementList(this);
+
+  @DomName('Element.oncut')
+  @DocsEditable()
+  ElementStream<Event> get onCut => Element.cutEvent._forElementList(this);
+
+  @DomName('Element.ondblclick')
+  @DocsEditable()
+  ElementStream<Event> get onDoubleClick => Element.doubleClickEvent._forElementList(this);
+
+  @DomName('Element.ondrag')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDrag => Element.dragEvent._forElementList(this);
+
+  @DomName('Element.ondragend')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragEnd => Element.dragEndEvent._forElementList(this);
+
+  @DomName('Element.ondragenter')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragEnter => Element.dragEnterEvent._forElementList(this);
+
+  @DomName('Element.ondragleave')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragLeave => Element.dragLeaveEvent._forElementList(this);
+
+  @DomName('Element.ondragover')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragOver => Element.dragOverEvent._forElementList(this);
+
+  @DomName('Element.ondragstart')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragStart => Element.dragStartEvent._forElementList(this);
+
+  @DomName('Element.ondrop')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDrop => Element.dropEvent._forElementList(this);
+
+  @DomName('Element.onerror')
+  @DocsEditable()
+  ElementStream<Event> get onError => Element.errorEvent._forElementList(this);
+
+  @DomName('Element.onfocus')
+  @DocsEditable()
+  ElementStream<Event> get onFocus => Element.focusEvent._forElementList(this);
+
+  @DomName('Element.oninput')
+  @DocsEditable()
+  ElementStream<Event> get onInput => Element.inputEvent._forElementList(this);
+
+  @DomName('Element.oninvalid')
+  @DocsEditable()
+  ElementStream<Event> get onInvalid => Element.invalidEvent._forElementList(this);
+
+  @DomName('Element.onkeydown')
+  @DocsEditable()
+  ElementStream<KeyboardEvent> get onKeyDown => Element.keyDownEvent._forElementList(this);
+
+  @DomName('Element.onkeypress')
+  @DocsEditable()
+  ElementStream<KeyboardEvent> get onKeyPress => Element.keyPressEvent._forElementList(this);
+
+  @DomName('Element.onkeyup')
+  @DocsEditable()
+  ElementStream<KeyboardEvent> get onKeyUp => Element.keyUpEvent._forElementList(this);
+
+  @DomName('Element.onload')
+  @DocsEditable()
+  ElementStream<Event> get onLoad => Element.loadEvent._forElementList(this);
+
+  @DomName('Element.onmousedown')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseDown => Element.mouseDownEvent._forElementList(this);
+
+  @DomName('Element.onmouseenter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent._forElementList(this);
+
+  @DomName('Element.onmouseleave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent._forElementList(this);
+
+  @DomName('Element.onmousemove')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseMove => Element.mouseMoveEvent._forElementList(this);
+
+  @DomName('Element.onmouseout')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseOut => Element.mouseOutEvent._forElementList(this);
+
+  @DomName('Element.onmouseover')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseOver => Element.mouseOverEvent._forElementList(this);
+
+  @DomName('Element.onmouseup')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseUp => Element.mouseUpEvent._forElementList(this);
+
+  @DomName('Element.onmousewheel')
+  @DocsEditable()
+  // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
+  @Experimental() // non-standard
+  ElementStream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent._forElementList(this);
+
+  @DomName('Element.onpaste')
+  @DocsEditable()
+  ElementStream<Event> get onPaste => Element.pasteEvent._forElementList(this);
+
+  @DomName('Element.onreset')
+  @DocsEditable()
+  ElementStream<Event> get onReset => Element.resetEvent._forElementList(this);
+
+  @DomName('Element.onscroll')
+  @DocsEditable()
+  ElementStream<Event> get onScroll => Element.scrollEvent._forElementList(this);
+
+  @DomName('Element.onsearch')
+  @DocsEditable()
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental()
+  ElementStream<Event> get onSearch => Element.searchEvent._forElementList(this);
+
+  @DomName('Element.onselect')
+  @DocsEditable()
+  ElementStream<Event> get onSelect => Element.selectEvent._forElementList(this);
+
+  @DomName('Element.onselectstart')
+  @DocsEditable()
+  @Experimental() // nonstandard
+  ElementStream<Event> get onSelectStart => Element.selectStartEvent._forElementList(this);
+
+  @DomName('Element.onsubmit')
+  @DocsEditable()
+  ElementStream<Event> get onSubmit => Element.submitEvent._forElementList(this);
+
+  @DomName('Element.ontouchcancel')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchCancel => Element.touchCancelEvent._forElementList(this);
+
+  @DomName('Element.ontouchend')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchEnd => Element.touchEndEvent._forElementList(this);
+
+  @DomName('Element.ontouchenter')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchEnter => Element.touchEnterEvent._forElementList(this);
+
+  @DomName('Element.ontouchleave')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchLeave => Element.touchLeaveEvent._forElementList(this);
+
+  @DomName('Element.ontouchmove')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchMove => Element.touchMoveEvent._forElementList(this);
+
+  @DomName('Element.ontouchstart')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchStart => Element.touchStartEvent._forElementList(this);
+
+  @DomName('Element.ontransitionend')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.FIREFOX)
+  @SupportedBrowser(SupportedBrowser.IE, '10')
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  ElementStream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent._forElementList(this);
+
+  @DomName('Element.onwebkitfullscreenchange')
+  @DocsEditable()
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental()
+  ElementStream<Event> get onFullscreenChange => Element.fullscreenChangeEvent._forElementList(this);
+
+  @DomName('Element.onwebkitfullscreenerror')
+  @DocsEditable()
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental()
+  ElementStream<Event> get onFullscreenError => Element.fullscreenErrorEvent._forElementList(this);
+
 }
 
 /**
@@ -8680,19 +9316,31 @@
 
   /**
    * Checks if this element matches the CSS selectors.
+   *
+   * If `includeAncestors` is true, we examine all of this element's parent
+   * elements and also return true if any of its parent elements matches
+   * `selectors`.
    */
   @Experimental()
-  bool matches(String selectors) {
-    if (JS('bool', '!!#.matches', this)) {
-      return JS('bool', '#.matches(#)', this, selectors);
-    } else if (JS('bool', '!!#.webkitMatchesSelector', this)) {
-      return JS('bool', '#.webkitMatchesSelector(#)', this, selectors);
-    } else if (JS('bool', '!!#.mozMatchesSelector', this)) {
-      return JS('bool', '#.mozMatchesSelector(#)', this, selectors);
-    } else if (JS('bool', '!!#.msMatchesSelector', this)) {
-      return JS('bool', '#.msMatchesSelector(#)', this, selectors);
-    }
-    throw new UnsupportedError("Not supported on this platform");
+  bool matches(String selectors, [includeAncestors = false]) {
+    var elem = this;
+    do {
+      bool matches = false;
+      if (JS('bool', '!!#.matches', elem)) {
+        matches = JS('bool', '#.matches(#)', elem, selectors);
+      } else if (JS('bool', '!!#.webkitMatchesSelector', elem)) {
+        matches = JS('bool', '#.webkitMatchesSelector(#)', elem, selectors);
+      } else if (JS('bool', '!!#.mozMatchesSelector', elem)) {
+        matches = JS('bool', '#.mozMatchesSelector(#)', elem, selectors);
+      } else if (JS('bool', '!!#.msMatchesSelector', elem)) {
+        matches = JS('bool', '#.msMatchesSelector(#)', elem, selectors);
+      } else {
+        throw new UnsupportedError("Not supported on this platform");
+      }
+      if (matches) return true;
+      elem = elem.parent;
+    } while(includeAncestors && elem != null);
+    return false;
   }
 
   @Creates('Null')  // Set from Dart code; does not instantiate a native type.
@@ -8704,6 +9352,15 @@
 
   bool _templateIsDecorated;
 
+  @DomName('Element.createShadowRoot')
+  @SupportedBrowser(SupportedBrowser.CHROME, '25')
+  @Experimental()
+  ShadowRoot createShadowRoot() {
+    return JS('ShadowRoot',
+      '(#.createShadowRoot || #.webkitCreateShadowRoot).call(#)',
+      this, this, this);
+  }
+
 
   /**
    * Gets the template this node refers to.
@@ -9055,6 +9712,16 @@
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
 
+  @DomName('Element.mouseenterEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
+
+  @DomName('Element.mouseleaveEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
+
   @DomName('Element.mousemoveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
@@ -9282,6 +9949,11 @@
   @DocsEditable()
   final int offsetWidth;
 
+  @DomName('Element.pseudo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String pseudo;
+
   @DomName('Element.scrollHeight')
   @DocsEditable()
   final int scrollHeight;
@@ -9298,6 +9970,12 @@
   @DocsEditable()
   final int scrollWidth;
 
+  @DomName('Element.shadowRoot')
+  @DocsEditable()
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
+  @Experimental()
+  final ShadowRoot shadowRoot;
+
   @DomName('Element.style')
   @DocsEditable()
   final CssStyleDeclaration style;
@@ -9306,15 +9984,6 @@
   @DocsEditable()
   final String tagName;
 
-  @JSName('webkitPseudo')
-  @DomName('Element.webkitPseudo')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  @Experimental() // nonstandard
-  String pseudo;
-
   @JSName('webkitRegionOverset')
   @DomName('Element.webkitRegionOverset')
   @DocsEditable()
@@ -9324,15 +9993,6 @@
   // http://dev.w3.org/csswg/css-regions/#dom-region-regionoverset
   final String regionOverset;
 
-  @JSName('webkitShadowRoot')
-  @DomName('Element.webkitShadowRoot')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
-  final ShadowRoot shadowRoot;
-
   @DomName('Element.blur')
   @DocsEditable()
   void blur() native;
@@ -9453,14 +10113,6 @@
   @DocsEditable()
   void $dom_setAttributeNS(String namespaceURI, String qualifiedName, String value) native;
 
-  @JSName('webkitCreateShadowRoot')
-  @DomName('Element.webkitCreateShadowRoot')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME, '25')
-  @Experimental()
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
-  ShadowRoot createShadowRoot() native;
-
   @JSName('webkitGetRegionFlowRanges')
   @DomName('Element.webkitGetRegionFlowRanges')
   @DocsEditable()
@@ -9532,200 +10184,210 @@
 
   @DomName('Element.onabort')
   @DocsEditable()
-  Stream<Event> get onAbort => abortEvent.forTarget(this);
+  ElementStream<Event> get onAbort => abortEvent.forElement(this);
 
   @DomName('Element.onbeforecopy')
   @DocsEditable()
-  Stream<Event> get onBeforeCopy => beforeCopyEvent.forTarget(this);
+  ElementStream<Event> get onBeforeCopy => beforeCopyEvent.forElement(this);
 
   @DomName('Element.onbeforecut')
   @DocsEditable()
-  Stream<Event> get onBeforeCut => beforeCutEvent.forTarget(this);
+  ElementStream<Event> get onBeforeCut => beforeCutEvent.forElement(this);
 
   @DomName('Element.onbeforepaste')
   @DocsEditable()
-  Stream<Event> get onBeforePaste => beforePasteEvent.forTarget(this);
+  ElementStream<Event> get onBeforePaste => beforePasteEvent.forElement(this);
 
   @DomName('Element.onblur')
   @DocsEditable()
-  Stream<Event> get onBlur => blurEvent.forTarget(this);
+  ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
   @DomName('Element.onchange')
   @DocsEditable()
-  Stream<Event> get onChange => changeEvent.forTarget(this);
+  ElementStream<Event> get onChange => changeEvent.forElement(this);
 
   @DomName('Element.onclick')
   @DocsEditable()
-  Stream<MouseEvent> get onClick => clickEvent.forTarget(this);
+  ElementStream<MouseEvent> get onClick => clickEvent.forElement(this);
 
   @DomName('Element.oncontextmenu')
   @DocsEditable()
-  Stream<MouseEvent> get onContextMenu => contextMenuEvent.forTarget(this);
+  ElementStream<MouseEvent> get onContextMenu => contextMenuEvent.forElement(this);
 
   @DomName('Element.oncopy')
   @DocsEditable()
-  Stream<Event> get onCopy => copyEvent.forTarget(this);
+  ElementStream<Event> get onCopy => copyEvent.forElement(this);
 
   @DomName('Element.oncut')
   @DocsEditable()
-  Stream<Event> get onCut => cutEvent.forTarget(this);
+  ElementStream<Event> get onCut => cutEvent.forElement(this);
 
   @DomName('Element.ondblclick')
   @DocsEditable()
-  Stream<Event> get onDoubleClick => doubleClickEvent.forTarget(this);
+  ElementStream<Event> get onDoubleClick => doubleClickEvent.forElement(this);
 
   @DomName('Element.ondrag')
   @DocsEditable()
-  Stream<MouseEvent> get onDrag => dragEvent.forTarget(this);
+  ElementStream<MouseEvent> get onDrag => dragEvent.forElement(this);
 
   @DomName('Element.ondragend')
   @DocsEditable()
-  Stream<MouseEvent> get onDragEnd => dragEndEvent.forTarget(this);
+  ElementStream<MouseEvent> get onDragEnd => dragEndEvent.forElement(this);
 
   @DomName('Element.ondragenter')
   @DocsEditable()
-  Stream<MouseEvent> get onDragEnter => dragEnterEvent.forTarget(this);
+  ElementStream<MouseEvent> get onDragEnter => dragEnterEvent.forElement(this);
 
   @DomName('Element.ondragleave')
   @DocsEditable()
-  Stream<MouseEvent> get onDragLeave => dragLeaveEvent.forTarget(this);
+  ElementStream<MouseEvent> get onDragLeave => dragLeaveEvent.forElement(this);
 
   @DomName('Element.ondragover')
   @DocsEditable()
-  Stream<MouseEvent> get onDragOver => dragOverEvent.forTarget(this);
+  ElementStream<MouseEvent> get onDragOver => dragOverEvent.forElement(this);
 
   @DomName('Element.ondragstart')
   @DocsEditable()
-  Stream<MouseEvent> get onDragStart => dragStartEvent.forTarget(this);
+  ElementStream<MouseEvent> get onDragStart => dragStartEvent.forElement(this);
 
   @DomName('Element.ondrop')
   @DocsEditable()
-  Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
+  ElementStream<MouseEvent> get onDrop => dropEvent.forElement(this);
 
   @DomName('Element.onerror')
   @DocsEditable()
-  Stream<Event> get onError => errorEvent.forTarget(this);
+  ElementStream<Event> get onError => errorEvent.forElement(this);
 
   @DomName('Element.onfocus')
   @DocsEditable()
-  Stream<Event> get onFocus => focusEvent.forTarget(this);
+  ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
   @DomName('Element.oninput')
   @DocsEditable()
-  Stream<Event> get onInput => inputEvent.forTarget(this);
+  ElementStream<Event> get onInput => inputEvent.forElement(this);
 
   @DomName('Element.oninvalid')
   @DocsEditable()
-  Stream<Event> get onInvalid => invalidEvent.forTarget(this);
+  ElementStream<Event> get onInvalid => invalidEvent.forElement(this);
 
   @DomName('Element.onkeydown')
   @DocsEditable()
-  Stream<KeyboardEvent> get onKeyDown => keyDownEvent.forTarget(this);
+  ElementStream<KeyboardEvent> get onKeyDown => keyDownEvent.forElement(this);
 
   @DomName('Element.onkeypress')
   @DocsEditable()
-  Stream<KeyboardEvent> get onKeyPress => keyPressEvent.forTarget(this);
+  ElementStream<KeyboardEvent> get onKeyPress => keyPressEvent.forElement(this);
 
   @DomName('Element.onkeyup')
   @DocsEditable()
-  Stream<KeyboardEvent> get onKeyUp => keyUpEvent.forTarget(this);
+  ElementStream<KeyboardEvent> get onKeyUp => keyUpEvent.forElement(this);
 
   @DomName('Element.onload')
   @DocsEditable()
-  Stream<Event> get onLoad => loadEvent.forTarget(this);
+  ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
   @DomName('Element.onmousedown')
   @DocsEditable()
-  Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
+  ElementStream<MouseEvent> get onMouseDown => mouseDownEvent.forElement(this);
+
+  @DomName('Element.onmouseenter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<MouseEvent> get onMouseEnter => mouseEnterEvent.forElement(this);
+
+  @DomName('Element.onmouseleave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forElement(this);
 
   @DomName('Element.onmousemove')
   @DocsEditable()
-  Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
+  ElementStream<MouseEvent> get onMouseMove => mouseMoveEvent.forElement(this);
 
   @DomName('Element.onmouseout')
   @DocsEditable()
-  Stream<MouseEvent> get onMouseOut => mouseOutEvent.forTarget(this);
+  ElementStream<MouseEvent> get onMouseOut => mouseOutEvent.forElement(this);
 
   @DomName('Element.onmouseover')
   @DocsEditable()
-  Stream<MouseEvent> get onMouseOver => mouseOverEvent.forTarget(this);
+  ElementStream<MouseEvent> get onMouseOver => mouseOverEvent.forElement(this);
 
   @DomName('Element.onmouseup')
   @DocsEditable()
-  Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);
+  ElementStream<MouseEvent> get onMouseUp => mouseUpEvent.forElement(this);
 
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
-  Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
+  ElementStream<WheelEvent> get onMouseWheel => mouseWheelEvent.forElement(this);
 
   @DomName('Element.onpaste')
   @DocsEditable()
-  Stream<Event> get onPaste => pasteEvent.forTarget(this);
+  ElementStream<Event> get onPaste => pasteEvent.forElement(this);
 
   @DomName('Element.onreset')
   @DocsEditable()
-  Stream<Event> get onReset => resetEvent.forTarget(this);
+  ElementStream<Event> get onReset => resetEvent.forElement(this);
 
   @DomName('Element.onscroll')
   @DocsEditable()
-  Stream<Event> get onScroll => scrollEvent.forTarget(this);
+  ElementStream<Event> get onScroll => scrollEvent.forElement(this);
 
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  Stream<Event> get onSearch => searchEvent.forTarget(this);
+  ElementStream<Event> get onSearch => searchEvent.forElement(this);
 
   @DomName('Element.onselect')
   @DocsEditable()
-  Stream<Event> get onSelect => selectEvent.forTarget(this);
+  ElementStream<Event> get onSelect => selectEvent.forElement(this);
 
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
-  Stream<Event> get onSelectStart => selectStartEvent.forTarget(this);
+  ElementStream<Event> get onSelectStart => selectStartEvent.forElement(this);
 
   @DomName('Element.onsubmit')
   @DocsEditable()
-  Stream<Event> get onSubmit => submitEvent.forTarget(this);
+  ElementStream<Event> get onSubmit => submitEvent.forElement(this);
 
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchCancel => touchCancelEvent.forTarget(this);
+  ElementStream<TouchEvent> get onTouchCancel => touchCancelEvent.forElement(this);
 
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchEnd => touchEndEvent.forTarget(this);
+  ElementStream<TouchEvent> get onTouchEnd => touchEndEvent.forElement(this);
 
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchEnter => touchEnterEvent.forTarget(this);
+  ElementStream<TouchEvent> get onTouchEnter => touchEnterEvent.forElement(this);
 
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchLeave => touchLeaveEvent.forTarget(this);
+  ElementStream<TouchEvent> get onTouchLeave => touchLeaveEvent.forElement(this);
 
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchMove => touchMoveEvent.forTarget(this);
+  ElementStream<TouchEvent> get onTouchMove => touchMoveEvent.forElement(this);
 
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchStart => touchStartEvent.forTarget(this);
+  ElementStream<TouchEvent> get onTouchStart => touchStartEvent.forElement(this);
 
   @DomName('Element.ontransitionend')
   @DocsEditable()
@@ -9733,23 +10395,22 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  Stream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forTarget(this);
+  ElementStream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forElement(this);
 
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
-  Stream<Event> get onFullscreenChange => fullscreenChangeEvent.forTarget(this);
+  ElementStream<Event> get onFullscreenChange => fullscreenChangeEvent.forElement(this);
 
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
-  Stream<Event> get onFullscreenError => fullscreenErrorEvent.forTarget(this);
+  ElementStream<Event> get onFullscreenError => fullscreenErrorEvent.forElement(this);
 
 }
 
-
 final _START_TAG_REGEXP = new RegExp('<(\\w+)');
 class _ElementFactoryProvider {
   static const _CUSTOM_PARENT_TAG_MAP = const {
@@ -9894,24 +10555,6 @@
 
 
 @DocsEditable()
-@DomName('ElementTimeControl')
-@Unstable()
-abstract class ElementTimeControl extends Interceptor {
-
-  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('HTMLEmbedElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE)
@@ -10431,18 +11074,20 @@
   @DocsEditable()
   final bool withCredentials;
 
+  @DomName('EventSource.close')
+  @DocsEditable()
+  void close() native;
+
+  // From EventTarget
+
   @JSName('addEventListener')
   @DomName('EventSource.addEventListener')
   @DocsEditable()
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  @DomName('EventSource.close')
-  @DocsEditable()
-  void close() native;
-
   @DomName('EventSource.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native;
+  bool dispatchEvent(Event event) native;
 
   @JSName('removeEventListener')
   @DomName('EventSource.removeEventListener')
@@ -10757,81 +11402,6 @@
 
 
 @DocsEditable()
-@DomName('FileException')
-// http://dev.w3.org/2009/dap/file-system/pub/FileSystem/
-@Experimental()
-class FileException extends Interceptor native "FileException" {
-
-  @DomName('FileException.ABORT_ERR')
-  @DocsEditable()
-  static const int ABORT_ERR = 3;
-
-  @DomName('FileException.ENCODING_ERR')
-  @DocsEditable()
-  static const int ENCODING_ERR = 5;
-
-  @DomName('FileException.INVALID_MODIFICATION_ERR')
-  @DocsEditable()
-  static const int INVALID_MODIFICATION_ERR = 9;
-
-  @DomName('FileException.INVALID_STATE_ERR')
-  @DocsEditable()
-  static const int INVALID_STATE_ERR = 7;
-
-  @DomName('FileException.NOT_FOUND_ERR')
-  @DocsEditable()
-  static const int NOT_FOUND_ERR = 1;
-
-  @DomName('FileException.NOT_READABLE_ERR')
-  @DocsEditable()
-  static const int NOT_READABLE_ERR = 4;
-
-  @DomName('FileException.NO_MODIFICATION_ALLOWED_ERR')
-  @DocsEditable()
-  static const int NO_MODIFICATION_ALLOWED_ERR = 6;
-
-  @DomName('FileException.PATH_EXISTS_ERR')
-  @DocsEditable()
-  static const int PATH_EXISTS_ERR = 12;
-
-  @DomName('FileException.QUOTA_EXCEEDED_ERR')
-  @DocsEditable()
-  static const int QUOTA_EXCEEDED_ERR = 10;
-
-  @DomName('FileException.SECURITY_ERR')
-  @DocsEditable()
-  static const int SECURITY_ERR = 2;
-
-  @DomName('FileException.SYNTAX_ERR')
-  @DocsEditable()
-  static const int SYNTAX_ERR = 8;
-
-  @DomName('FileException.TYPE_MISMATCH_ERR')
-  @DocsEditable()
-  static const int TYPE_MISMATCH_ERR = 11;
-
-  @DomName('FileException.code')
-  @DocsEditable()
-  final int code;
-
-  @DomName('FileException.message')
-  @DocsEditable()
-  final String message;
-
-  @DomName('FileException.name')
-  @DocsEditable()
-  final String name;
-
-  @DomName('FileException.toString')
-  @DocsEditable()
-  String toString() native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable()
 @DomName('FileList')
 class FileList extends Interceptor with ListMixin<File>, ImmutableListMixin<File> implements JavaScriptIndexingBehavior, List<File> native "FileList" {
 
@@ -10958,15 +11528,6 @@
   @DocsEditable()
   void abort() native;
 
-  @JSName('addEventListener')
-  @DomName('FileReader.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
-  @DomName('FileReader.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native;
-
   @DomName('FileReader.readAsArrayBuffer')
   @DocsEditable()
   void readAsArrayBuffer(Blob blob) native;
@@ -10986,6 +11547,17 @@
   @DocsEditable()
   void readAsText(Blob blob, [String encoding]) native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('FileReader.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('FileReader.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
   @JSName('removeEventListener')
   @DomName('FileReader.removeEventListener')
   @DocsEditable()
@@ -11133,20 +11705,6 @@
   @DocsEditable()
   void abort() native;
 
-  @JSName('addEventListener')
-  @DomName('FileWriter.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
-  @DomName('FileWriter.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native;
-
-  @JSName('removeEventListener')
-  @DomName('FileWriter.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('FileWriter.seek')
   @DocsEditable()
   void seek(int position) native;
@@ -11159,6 +11717,22 @@
   @DocsEditable()
   void write(Blob data) native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('FileWriter.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('FileWriter.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('FileWriter.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('FileWriter.onabort')
   @DocsEditable()
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
@@ -11249,19 +11823,10 @@
   @DocsEditable()
   final bool loading;
 
-  @JSName('addEventListener')
-  @DomName('FontLoader.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('FontLoader.checkFont')
   @DocsEditable()
   bool checkFont(String font, String text) native;
 
-  @DomName('FontLoader.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native;
-
   @DomName('FontLoader.loadFont')
   @DocsEditable()
   void loadFont(Map params) {
@@ -11278,6 +11843,17 @@
   @DocsEditable()
   void notifyWhenFontsReady(VoidCallback callback) native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('FontLoader.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('FontLoader.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
   @JSName('removeEventListener')
   @DomName('FontLoader.removeEventListener')
   @DocsEditable()
@@ -11434,13 +12010,13 @@
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
-  Stream<Event> get onAutocomplete => autocompleteEvent.forTarget(this);
+  ElementStream<Event> get onAutocomplete => autocompleteEvent.forElement(this);
 
   @DomName('HTMLFormElement.onautocompleteerror')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
-  Stream<AutocompleteErrorEvent> get onAutocompleteError => autocompleteErrorEvent.forTarget(this);
+  ElementStream<AutocompleteErrorEvent> get onAutocompleteError => autocompleteErrorEvent.forElement(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -11782,6 +12358,23 @@
 
 
 @DocsEditable()
+@DomName('HmacParams')
+@Experimental() // untriaged
+class HmacParams extends Algorithm native "HmacParams" {
+  // To suppress missing implicit constructor warnings.
+  factory HmacParams._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('HmacParams.hash')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Algorithm hash;
+}
+// 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('HTMLAllCollection')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dom-document-all
 @deprecated // deprecated
@@ -12186,6 +12779,40 @@
   }
 
   /**
+   * Makes a server POST request with the specified data encoded as form data.
+   *
+   * This is similar to sending a FormData object with broader browser
+   * support but limited to string values.
+   *
+   * See also:
+   *
+   * * [request]
+   */
+  static Future<HttpRequest> postFormData(String url, Map<String, String> data,
+      {bool withCredentials, String responseType,
+      Map<String, String> requestHeaders,
+      void onProgress(ProgressEvent e)}) {
+
+    var parts = [];
+    data.forEach((key, value) {
+      parts.add('${Uri.encodeQueryComponent(key)}='
+          '${Uri.encodeQueryComponent(value)}');
+    });
+    var formData = parts.join('&');
+
+    if (requestHeaders == null) {
+      requestHeaders = <String, String>{};
+    }
+    requestHeaders.putIfAbsent('Content-Type',
+        () => 'application/x-www-form-urlencoded; charset=UTF-8');
+
+    return request(url, method: 'POST', withCredentials: withCredentials,
+        responseType: responseType,
+        requestHeaders: requestHeaders, sendData: formData,
+        onProgress: onProgress);
+  }
+
+  /**
    * Creates a URL request for the specified [url].
    *
    * By default this will do an HTTP GET request, this can be overridden with
@@ -12343,7 +12970,7 @@
    *
    *     var request = new HttpRequest();
    *     request.open('GET', 'http://dartlang.org')
-   *     request.onLoad.add((event) => print('Request complete'));
+   *     request.onLoad.listen((event) => print('Request complete'));
    *
    * is the (more verbose) equivalent of
    *
@@ -12513,15 +13140,6 @@
   @DocsEditable()
   void abort() native;
 
-  @JSName('addEventListener')
-  @DomName('XMLHttpRequest.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
-  @DomName('XMLHttpRequest.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native;
-
   /**
    * Retrieve all the response headers from a request.
    *
@@ -12576,11 +13194,6 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   void overrideMimeType(String override) native;
 
-  @JSName('removeEventListener')
-  @DomName('XMLHttpRequest.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   /**
    * Send the request with any given `data`.
    *
@@ -12597,6 +13210,22 @@
   @DocsEditable()
   void setRequestHeader(String header, String value) native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('XMLHttpRequest.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('XMLHttpRequest.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('XMLHttpRequest.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   /**
    * Event listeners to be notified when request has been aborted,
    * generally due to calling `httpRequest.abort()`.
@@ -12728,6 +13357,8 @@
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> progressEvent = const EventStreamProvider<ProgressEvent>('progress');
 
+  // From EventTarget
+
   @JSName('addEventListener')
   @DomName('XMLHttpRequestUpload.addEventListener')
   @DocsEditable()
@@ -12735,7 +13366,7 @@
 
   @DomName('XMLHttpRequestUpload.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native;
+  bool dispatchEvent(Event event) native;
 
   @JSName('removeEventListener')
   @DomName('XMLHttpRequestUpload.removeEventListener')
@@ -12817,6 +13448,36 @@
   @DocsEditable()
   String width;
 }
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
+@DomName('ImageBitmap')
+@Experimental() // untriaged
+class ImageBitmap extends Interceptor native "ImageBitmap" {
+
+  @DomName('ImageBitmap.height')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int height;
+
+  @DomName('ImageBitmap.width')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int width;
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DomName('ImageBitmapCallback')
+@Experimental() // untriaged
+typedef void ImageBitmapCallback(ImageBitmap bitmap);
 // 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.
@@ -13051,6 +13712,11 @@
   @DocsEditable()
   bool indeterminate;
 
+  @DomName('HTMLInputElement.inputMode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String inputMode;
+
   @DomName('HTMLInputElement.labels')
   @DocsEditable()
   @Returns('NodeList')
@@ -13241,7 +13907,7 @@
   @DocsEditable()
   // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#extending_html_elements
   @Experimental()
-  Stream<Event> get onSpeechChange => speechChangeEvent.forTarget(this);
+  ElementStream<Event> get onSpeechChange => speechChangeEvent.forElement(this);
 
 }
 
@@ -13815,22 +14481,19 @@
   @DocsEditable()
   final Composition composition;
 
-  @DomName('InputMethodContext.enabled')
-  @DocsEditable()
-  bool enabled;
-
   @DomName('InputMethodContext.locale')
   @DocsEditable()
   final String locale;
 
+  @DomName('InputMethodContext.target')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Element target;
+
   @DomName('InputMethodContext.confirmComposition')
   @DocsEditable()
   void confirmComposition() native;
 
-  @DomName('InputMethodContext.open')
-  @DocsEditable()
-  bool open() native;
-
   @DomName('InputMethodContext.setCaretRectangle')
   @DocsEditable()
   void setCaretRectangle(Node anchor, int x, int y, int w, int h) native;
@@ -13844,6 +14507,36 @@
 // BSD-style license that can be found in the LICENSE file.
 
 
+@DocsEditable()
+@DomName('Key')
+@Experimental() // untriaged
+class Key extends Interceptor native "Key" {
+
+  @DomName('Key.algorithm')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final Algorithm algorithm;
+
+  @DomName('Key.extractable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final bool extractable;
+
+  @DomName('Key.type')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final String type;
+
+  @DomName('Key.usages')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final List<String> usages;
+}
+// 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.
+
+
 /**
  * An event that describes user interaction with the keyboard.
  *
@@ -14225,7 +14918,7 @@
 
 @DomName('MIDISuccessCallback')
 @Experimental() // untriaged
-typedef void MidiSuccessCallback(MidiAccess access, bool sysexEnabled);
+typedef void MidiSuccessCallback(MidiAccess access, bool sysex);
 // 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.
@@ -14313,15 +15006,6 @@
   @DocsEditable()
   num volume;
 
-  @JSName('addEventListener')
-  @DomName('MediaController.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
-  @DomName('MediaController.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native;
-
   @DomName('MediaController.pause')
   @DocsEditable()
   void pause() native;
@@ -14330,14 +15014,25 @@
   @DocsEditable()
   void play() native;
 
+  @DomName('MediaController.unpause')
+  @DocsEditable()
+  void unpause() native;
+
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('MediaController.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('MediaController.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
   @JSName('removeEventListener')
   @DomName('MediaController.removeEventListener')
   @DocsEditable()
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
-  @DomName('MediaController.unpause')
-  @DocsEditable()
-  void unpause() 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
@@ -14721,113 +15416,113 @@
 
   @DomName('HTMLMediaElement.oncanplay')
   @DocsEditable()
-  Stream<Event> get onCanPlay => canPlayEvent.forTarget(this);
+  ElementStream<Event> get onCanPlay => canPlayEvent.forElement(this);
 
   @DomName('HTMLMediaElement.oncanplaythrough')
   @DocsEditable()
-  Stream<Event> get onCanPlayThrough => canPlayThroughEvent.forTarget(this);
+  ElementStream<Event> get onCanPlayThrough => canPlayThroughEvent.forElement(this);
 
   @DomName('HTMLMediaElement.ondurationchange')
   @DocsEditable()
-  Stream<Event> get onDurationChange => durationChangeEvent.forTarget(this);
+  ElementStream<Event> get onDurationChange => durationChangeEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onemptied')
   @DocsEditable()
-  Stream<Event> get onEmptied => emptiedEvent.forTarget(this);
+  ElementStream<Event> get onEmptied => emptiedEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onended')
   @DocsEditable()
-  Stream<Event> get onEnded => endedEvent.forTarget(this);
+  ElementStream<Event> get onEnded => endedEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onloadeddata')
   @DocsEditable()
-  Stream<Event> get onLoadedData => loadedDataEvent.forTarget(this);
+  ElementStream<Event> get onLoadedData => loadedDataEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onloadedmetadata')
   @DocsEditable()
-  Stream<Event> get onLoadedMetadata => loadedMetadataEvent.forTarget(this);
+  ElementStream<Event> get onLoadedMetadata => loadedMetadataEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onloadstart')
   @DocsEditable()
-  Stream<Event> get onLoadStart => loadStartEvent.forTarget(this);
+  ElementStream<Event> get onLoadStart => loadStartEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onpause')
   @DocsEditable()
-  Stream<Event> get onPause => pauseEvent.forTarget(this);
+  ElementStream<Event> get onPause => pauseEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onplay')
   @DocsEditable()
-  Stream<Event> get onPlay => playEvent.forTarget(this);
+  ElementStream<Event> get onPlay => playEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onplaying')
   @DocsEditable()
-  Stream<Event> get onPlaying => playingEvent.forTarget(this);
+  ElementStream<Event> get onPlaying => playingEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onprogress')
   @DocsEditable()
-  Stream<Event> get onProgress => progressEvent.forTarget(this);
+  ElementStream<Event> get onProgress => progressEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onratechange')
   @DocsEditable()
-  Stream<Event> get onRateChange => rateChangeEvent.forTarget(this);
+  ElementStream<Event> get onRateChange => rateChangeEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onseeked')
   @DocsEditable()
-  Stream<Event> get onSeeked => seekedEvent.forTarget(this);
+  ElementStream<Event> get onSeeked => seekedEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onseeking')
   @DocsEditable()
-  Stream<Event> get onSeeking => seekingEvent.forTarget(this);
+  ElementStream<Event> get onSeeking => seekingEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onshow')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
   @Experimental()
-  Stream<Event> get onShow => showEvent.forTarget(this);
+  ElementStream<Event> get onShow => showEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onstalled')
   @DocsEditable()
-  Stream<Event> get onStalled => stalledEvent.forTarget(this);
+  ElementStream<Event> get onStalled => stalledEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onsuspend')
   @DocsEditable()
-  Stream<Event> get onSuspend => suspendEvent.forTarget(this);
+  ElementStream<Event> get onSuspend => suspendEvent.forElement(this);
 
   @DomName('HTMLMediaElement.ontimeupdate')
   @DocsEditable()
-  Stream<Event> get onTimeUpdate => timeUpdateEvent.forTarget(this);
+  ElementStream<Event> get onTimeUpdate => timeUpdateEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onvolumechange')
   @DocsEditable()
-  Stream<Event> get onVolumeChange => volumeChangeEvent.forTarget(this);
+  ElementStream<Event> get onVolumeChange => volumeChangeEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onwaiting')
   @DocsEditable()
-  Stream<Event> get onWaiting => waitingEvent.forTarget(this);
+  ElementStream<Event> get onWaiting => waitingEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onwebkitkeyadded')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
-  Stream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forTarget(this);
+  ElementStream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onwebkitkeyerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
-  Stream<MediaKeyEvent> get onKeyError => keyErrorEvent.forTarget(this);
+  ElementStream<MediaKeyEvent> get onKeyError => keyErrorEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onwebkitkeymessage')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
-  Stream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forTarget(this);
+  ElementStream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onwebkitneedkey')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
-  Stream<MediaKeyEvent> get onNeedKey => needKeyEvent.forTarget(this);
+  ElementStream<MediaKeyEvent> get onNeedKey => needKeyEvent.forElement(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -15036,28 +15731,30 @@
   @DocsEditable()
   final String sessionId;
 
+  @DomName('MediaKeySession.close')
+  @DocsEditable()
+  void close() native;
+
+  @DomName('MediaKeySession.update')
+  @DocsEditable()
+  void update(Uint8List key) native;
+
+  // From EventTarget
+
   @JSName('addEventListener')
   @DomName('MediaKeySession.addEventListener')
   @DocsEditable()
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  @DomName('MediaKeySession.close')
-  @DocsEditable()
-  void close() native;
-
   @DomName('MediaKeySession.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native;
+  bool dispatchEvent(Event event) native;
 
   @JSName('removeEventListener')
   @DomName('MediaKeySession.removeEventListener')
   @DocsEditable()
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  @DomName('MediaKeySession.update')
-  @DocsEditable()
-  void update(Uint8List key) native;
-
   @DomName('MediaKeySession.onwebkitkeyadded')
   @DocsEditable()
   Stream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forTarget(this);
@@ -15200,19 +15897,10 @@
   @DocsEditable()
   final SourceBufferList sourceBuffers;
 
-  @JSName('addEventListener')
-  @DomName('MediaSource.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('MediaSource.addSourceBuffer')
   @DocsEditable()
   SourceBuffer addSourceBuffer(String type) native;
 
-  @DomName('MediaSource.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native;
-
   @DomName('MediaSource.endOfStream')
   @DocsEditable()
   void endOfStream(String error) native;
@@ -15221,14 +15909,25 @@
   @DocsEditable()
   static bool isTypeSupported(String type) native;
 
+  @DomName('MediaSource.removeSourceBuffer')
+  @DocsEditable()
+  void removeSourceBuffer(SourceBuffer buffer) native;
+
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('MediaSource.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('MediaSource.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
   @JSName('removeEventListener')
   @DomName('MediaSource.removeEventListener')
   @DocsEditable()
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
-  @DomName('MediaSource.removeSourceBuffer')
-  @DocsEditable()
-  void removeSourceBuffer(SourceBuffer buffer) native;
 }
 // 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
@@ -15286,19 +15985,10 @@
   @Experimental() // non-standard
   final String label;
 
-  @JSName('addEventListener')
-  @DomName('MediaStream.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('MediaStream.addTrack')
   @DocsEditable()
   void addTrack(MediaStreamTrack track) native;
 
-  @DomName('MediaStream.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native;
-
   @DomName('MediaStream.getAudioTracks')
   @DocsEditable()
   List<MediaStreamTrack> getAudioTracks() native;
@@ -15311,11 +16001,6 @@
   @DocsEditable()
   List<MediaStreamTrack> getVideoTracks() native;
 
-  @JSName('removeEventListener')
-  @DomName('MediaStream.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('MediaStream.removeTrack')
   @DocsEditable()
   void removeTrack(MediaStreamTrack track) native;
@@ -15324,6 +16009,22 @@
   @DocsEditable()
   void stop() native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('MediaStream.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('MediaStream.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('MediaStream.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('MediaStream.onaddtrack')
   @DocsEditable()
   Stream<Event> get onAddTrack => addTrackEvent.forTarget(this);
@@ -15419,6 +16120,13 @@
   @DocsEditable()
   final String readyState;
 
+  @DomName('MediaStreamTrack.getSources')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static void getSources(MediaStreamTrackSourcesCallback callback) native;
+
+  // From EventTarget
+
   @JSName('addEventListener')
   @DomName('MediaStreamTrack.addEventListener')
   @DocsEditable()
@@ -15428,11 +16136,6 @@
   @DocsEditable()
   bool dispatchEvent(Event event) native;
 
-  @DomName('MediaStreamTrack.getSources')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static void getSources(MediaStreamTrackSourcesCallback callback) native;
-
   @JSName('removeEventListener')
   @DomName('MediaStreamTrack.removeEventListener')
   @DocsEditable()
@@ -15630,19 +16333,10 @@
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
-  @JSName('addEventListener')
-  @DomName('MessagePort.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('MessagePort.close')
   @DocsEditable()
   void close() native;
 
-  @DomName('MessagePort.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native;
-
   @DomName('MessagePort.postMessage')
   @DocsEditable()
   void postMessage(/*any*/ message, [List messagePorts]) {
@@ -15664,15 +16358,26 @@
   @DocsEditable()
   void _postMessage_2(message) native;
 
+  @DomName('MessagePort.start')
+  @DocsEditable()
+  void start() native;
+
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('MessagePort.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('MessagePort.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
   @JSName('removeEventListener')
   @DomName('MessagePort.removeEventListener')
   @DocsEditable()
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  @DomName('MessagePort.start')
-  @DocsEditable()
-  void start() native;
-
   @DomName('MessagePort.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
@@ -15811,6 +16516,16 @@
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
 
+  @DomName('MIDIAccess.inputs')
+  @DocsEditable()
+  List<MidiInput> inputs() native;
+
+  @DomName('MIDIAccess.outputs')
+  @DocsEditable()
+  List<MidiOutput> outputs() native;
+
+  // From EventTarget
+
   @JSName('addEventListener')
   @DomName('MIDIAccess.addEventListener')
   @DocsEditable()
@@ -15820,14 +16535,6 @@
   @DocsEditable()
   bool dispatchEvent(Event event) native;
 
-  @DomName('MIDIAccess.inputs')
-  @DocsEditable()
-  List<MidiInput> inputs() native;
-
-  @DomName('MIDIAccess.outputs')
-  @DocsEditable()
-  List<MidiOutput> outputs() native;
-
   @JSName('removeEventListener')
   @DomName('MIDIAccess.removeEventListener')
   @DocsEditable()
@@ -15882,7 +16589,7 @@
 @DomName('MIDIInput')
 // http://webaudio.github.io/web-midi-api/#idl-def-MIDIInput
 @Experimental()
-class MidiInput extends MidiPort implements EventTarget native "MIDIInput" {
+class MidiInput extends MidiPort native "MIDIInput" {
   // To suppress missing implicit constructor warnings.
   factory MidiInput._() { throw new UnsupportedError("Not supported"); }
 
@@ -15969,6 +16676,8 @@
   @DocsEditable()
   final String version;
 
+  // From EventTarget
+
   @JSName('addEventListener')
   @DomName('MIDIPort.addEventListener')
   @DocsEditable()
@@ -16521,15 +17230,6 @@
   @DocsEditable()
   final bool overset;
 
-  @JSName('addEventListener')
-  @DomName('WebKitNamedFlow.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
-  @DomName('WebKitNamedFlow.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native;
-
   @DomName('WebKitNamedFlow.getContent')
   @DocsEditable()
   @Returns('NodeList')
@@ -16548,6 +17248,17 @@
   @Creates('NodeList')
   List<Node> getRegionsByContent(Node contentNode) native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('WebKitNamedFlow.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('WebKitNamedFlow.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
   @JSName('removeEventListener')
   @DomName('WebKitNamedFlow.removeEventListener')
   @DocsEditable()
@@ -17267,11 +17978,6 @@
   @DocsEditable()
   String text;
 
-  @JSName('addEventListener')
-  @DomName('Node.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @JSName('appendChild')
   /**
    * Adds a node to the end of the child [nodes] list of this node.
@@ -17295,10 +18001,6 @@
   @DocsEditable()
   bool contains(Node other) native;
 
-  @DomName('Node.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native;
-
   @DomName('Node.hasChildNodes')
   @DocsEditable()
   bool hasChildNodes() native;
@@ -17312,16 +18014,27 @@
   @DocsEditable()
   Node $dom_removeChild(Node oldChild) native;
 
-  @JSName('removeEventListener')
-  @DomName('Node.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @JSName('replaceChild')
   @DomName('Node.replaceChild')
   @DocsEditable()
   Node $dom_replaceChild(Node newChild, Node oldChild) native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('Node.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('Node.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('Node.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) 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
@@ -17602,11 +18315,6 @@
   @Experimental() // nonstandard
   String tag;
 
-  @JSName('addEventListener')
-  @DomName('Notification.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('Notification.cancel')
   @DocsEditable()
   @Experimental() // nonstandard
@@ -17616,15 +18324,6 @@
   @DocsEditable()
   void close() native;
 
-  @DomName('Notification.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native;
-
-  @JSName('removeEventListener')
-  @DomName('Notification.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @JSName('requestPermission')
   @DomName('Notification.requestPermission')
   @DocsEditable()
@@ -17645,6 +18344,22 @@
   @Experimental() // nonstandard
   void show() native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('Notification.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('Notification.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('Notification.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('Notification.onclick')
   @DocsEditable()
   Stream<Event> get onClick => clickEvent.forTarget(this);
@@ -18172,17 +18887,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE)
-class Performance extends EventTarget native "Performance" {
-  // To suppress missing implicit constructor warnings.
-  factory Performance._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('Performance.webkitresourcetimingbufferfullEvent')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
-  static const EventStreamProvider<Event> resourceTimingBufferFullEvent = const EventStreamProvider<Event>('webkitresourcetimingbufferfull');
+class Performance extends Interceptor native "Performance" {
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => JS('bool', '!!(window.performance)');
@@ -18263,12 +18968,6 @@
   @Experimental()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
   void setResourceTimingBufferSize(int maxSize) native;
-
-  @DomName('Performance.onwebkitresourcetimingbufferfull')
-  @DocsEditable()
-  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
-  @Experimental()
-  Stream<Event> get onResourceTimingBufferFull => resourceTimingBufferFullEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -18819,6 +19518,36 @@
 @DomName('Promise')
 @Experimental() // untriaged
 class Promise extends Interceptor native "Promise" {
+
+  @DomName('Promise._any')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Promise _any(Object values) native;
+
+  @DomName('Promise.every')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Promise every(Object values) native;
+
+  @DomName('Promise.fulfill')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Promise fulfill(Object value) native;
+
+  @DomName('Promise.reject')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Promise reject(Object value) native;
+
+  @DomName('Promise.resolve')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Promise resolve(Object value) native;
+
+  @DomName('Promise.some')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Promise some(Object values) 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
@@ -18829,6 +19558,21 @@
 @DomName('PromiseResolver')
 @Experimental() // untriaged
 class PromiseResolver extends Interceptor native "PromiseResolver" {
+
+  @DomName('PromiseResolver.fulfill')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void fulfill([Object value]) native;
+
+  @DomName('PromiseResolver.reject')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void reject([Object value]) native;
+
+  @DomName('PromiseResolver.resolve')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void resolve([Object value]) 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
@@ -19148,24 +19892,10 @@
   @DocsEditable()
   final bool reliable;
 
-  @JSName('addEventListener')
-  @DomName('RTCDataChannel.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('RTCDataChannel.close')
   @DocsEditable()
   void close() native;
 
-  @DomName('RTCDataChannel.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native;
-
-  @JSName('removeEventListener')
-  @DomName('RTCDataChannel.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('RTCDataChannel.send')
   @DocsEditable()
   void send(data) native;
@@ -19190,6 +19920,22 @@
   @DocsEditable()
   void sendTypedData(TypedData data) native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('RTCDataChannel.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('RTCDataChannel.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('RTCDataChannel.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('RTCDataChannel.onclose')
   @DocsEditable()
   Stream<Event> get onClose => closeEvent.forTarget(this);
@@ -19261,6 +20007,13 @@
   @DocsEditable()
   final MediaStreamTrack track;
 
+  @JSName('insertDTMF')
+  @DomName('RTCDTMFSender.insertDTMF')
+  @DocsEditable()
+  void insertDtmf(String tones, [int duration, int interToneGap]) native;
+
+  // From EventTarget
+
   @JSName('addEventListener')
   @DomName('RTCDTMFSender.addEventListener')
   @DocsEditable()
@@ -19270,11 +20023,6 @@
   @DocsEditable()
   bool dispatchEvent(Event event) native;
 
-  @JSName('insertDTMF')
-  @DomName('RTCDTMFSender.insertDTMF')
-  @DocsEditable()
-  void insertDtmf(String tones, [int duration, int interToneGap]) native;
-
   @JSName('removeEventListener')
   @DomName('RTCDTMFSender.removeEventListener')
   @DocsEditable()
@@ -19457,11 +20205,6 @@
   @DocsEditable()
   final String signalingState;
 
-  @JSName('addEventListener')
-  @DomName('RTCPeerConnection.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('RTCPeerConnection.addIceCandidate')
   @DocsEditable()
   void addIceCandidate(RtcIceCandidate candidate) native;
@@ -19553,10 +20296,6 @@
   @DocsEditable()
   void _createOffer_2(_RtcSessionDescriptionCallback successCallback, _RtcErrorCallback failureCallback) native;
 
-  @DomName('RTCPeerConnection.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native;
-
   @DomName('RTCPeerConnection.getLocalStreams')
   @DocsEditable()
   List<MediaStream> getLocalStreams() native;
@@ -19573,11 +20312,6 @@
   @DocsEditable()
   MediaStream getStreamById(String streamId) native;
 
-  @JSName('removeEventListener')
-  @DomName('RTCPeerConnection.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('RTCPeerConnection.removeStream')
   @DocsEditable()
   void removeStream(MediaStream stream) native;
@@ -19644,6 +20378,22 @@
   @DocsEditable()
   void _updateIce_3() native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('RTCPeerConnection.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('RTCPeerConnection.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('RTCPeerConnection.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('RTCPeerConnection.onaddstream')
   @DocsEditable()
   Stream<MediaStreamEvent> get onAddStream => addStreamEvent.forTarget(this);
@@ -20002,6 +20752,11 @@
   @DocsEditable()
   final String sourceFile;
 
+  @DomName('SecurityPolicyViolationEvent.statusCode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int statusCode;
+
   @DomName('SecurityPolicyViolationEvent.violatedDirective')
   @DocsEditable()
   final String violatedDirective;
@@ -20349,6 +21104,23 @@
 
 
 @DocsEditable()
+@DomName('SharedWorkerGlobalScope')
+@Experimental() // untriaged
+class SharedWorkerGlobalScope extends WorkerGlobalScope native "SharedWorkerGlobalScope" {
+  // To suppress missing implicit constructor warnings.
+  factory SharedWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('SharedWorkerGlobalScope.name')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final 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
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
 @DomName('SourceBuffer')
 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebuffer
 @Experimental()
@@ -20373,17 +21145,25 @@
   @DocsEditable()
   void abort() native;
 
+  @DomName('SourceBuffer.appendBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void appendBuffer(ByteBuffer data) native;
+
+  @JSName('appendBuffer')
+  @DomName('SourceBuffer.appendBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void appendBufferView(TypedData data) native;
+
+  // From EventTarget
+
   @JSName('addEventListener')
   @DomName('SourceBuffer.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
-  @DomName('SourceBuffer.appendBuffer')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void appendBuffer(data) native;
-
   @DomName('SourceBuffer.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -20456,6 +21236,12 @@
   SourceBuffer elementAt(int index) => this[index];
   // -- end List<SourceBuffer> mixins.
 
+  @DomName('SourceBufferList.item')
+  @DocsEditable()
+  SourceBuffer item(int index) native;
+
+  // From EventTarget
+
   @JSName('addEventListener')
   @DomName('SourceBufferList.addEventListener')
   @DocsEditable()
@@ -20465,10 +21251,6 @@
   @DocsEditable()
   bool dispatchEvent(Event event) native;
 
-  @DomName('SourceBufferList.item')
-  @DocsEditable()
-  SourceBuffer item(int index) native;
-
   @JSName('removeEventListener')
   @DomName('SourceBufferList.removeEventListener')
   @DocsEditable()
@@ -20772,20 +21554,6 @@
   @DocsEditable()
   void abort() native;
 
-  @JSName('addEventListener')
-  @DomName('SpeechRecognition.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
-  @DomName('SpeechRecognition.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native;
-
-  @JSName('removeEventListener')
-  @DomName('SpeechRecognition.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('SpeechRecognition.start')
   @DocsEditable()
   void start() native;
@@ -20794,6 +21562,22 @@
   @DocsEditable()
   void stop() native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('SpeechRecognition.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('SpeechRecognition.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('SpeechRecognition.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('SpeechRecognition.onaudioend')
   @DocsEditable()
   Stream<Event> get onAudioEnd => audioEndEvent.forTarget(this);
@@ -21085,6 +21869,25 @@
   @DocsEditable()
   num volume;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('SpeechSynthesisUtterance.addEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('SpeechSynthesisUtterance.dispatchEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('SpeechSynthesisUtterance.removeEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('SpeechSynthesisUtterance.onboundary')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onBoundary => boundaryEvent.forTarget(this);
@@ -21283,7 +22086,7 @@
 @DomName('StorageErrorCallback')
 // http://www.w3.org/TR/quota-api/#storageerrorcallback-callback
 @Experimental()
-typedef void StorageErrorCallback(DomException error);
+typedef void StorageErrorCallback(DomError error);
 // 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.
@@ -21544,6 +22347,84 @@
 @DomName('SubtleCrypto')
 @Experimental() // untriaged
 class SubtleCrypto extends Interceptor native "SubtleCrypto" {
+
+  @DomName('SubtleCrypto.decrypt')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation decrypt(Map algorithm) {
+    var algorithm_1 = convertDartToNative_Dictionary(algorithm);
+    return _decrypt_1(algorithm_1);
+  }
+  @JSName('decrypt')
+  @DomName('SubtleCrypto.decrypt')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation _decrypt_1(algorithm) native;
+
+  @DomName('SubtleCrypto.digest')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation digest(Map algorithm) {
+    var algorithm_1 = convertDartToNative_Dictionary(algorithm);
+    return _digest_1(algorithm_1);
+  }
+  @JSName('digest')
+  @DomName('SubtleCrypto.digest')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation _digest_1(algorithm) native;
+
+  @DomName('SubtleCrypto.encrypt')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation encrypt(Map algorithm) {
+    var algorithm_1 = convertDartToNative_Dictionary(algorithm);
+    return _encrypt_1(algorithm_1);
+  }
+  @JSName('encrypt')
+  @DomName('SubtleCrypto.encrypt')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation _encrypt_1(algorithm) native;
+
+  @DomName('SubtleCrypto.importKey')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object importKey(String format, TypedData keyData, Map algorithm, bool extractable, List<String> keyUsages) {
+    var algorithm_1 = convertDartToNative_Dictionary(algorithm);
+    return _importKey_1(format, keyData, algorithm_1, extractable, keyUsages);
+  }
+  @JSName('importKey')
+  @DomName('SubtleCrypto.importKey')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object _importKey_1(format, TypedData keyData, algorithm, extractable, List<String> keyUsages) native;
+
+  @DomName('SubtleCrypto.sign')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation sign(Map algorithm) {
+    var algorithm_1 = convertDartToNative_Dictionary(algorithm);
+    return _sign_1(algorithm_1);
+  }
+  @JSName('sign')
+  @DomName('SubtleCrypto.sign')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation _sign_1(algorithm) native;
+
+  @DomName('SubtleCrypto.verify')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation verify(Map algorithm) {
+    var algorithm_1 = convertDartToNative_Dictionary(algorithm);
+    return _verify_1(algorithm_1);
+  }
+  @JSName('verify')
+  @DomName('SubtleCrypto.verify')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation _verify_1(algorithm) 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
@@ -22182,6 +23063,11 @@
   @DocsEditable()
   final FormElement form;
 
+  @DomName('HTMLTextAreaElement.inputMode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String inputMode;
+
   @DomName('HTMLTextAreaElement.labels')
   @DocsEditable()
   @Unstable()
@@ -22365,6 +23251,12 @@
   @DocsEditable()
   void addCue(TextTrackCue cue) native;
 
+  @DomName('TextTrack.removeCue')
+  @DocsEditable()
+  void removeCue(TextTrackCue cue) native;
+
+  // From EventTarget
+
   @JSName('addEventListener')
   @DomName('TextTrack.addEventListener')
   @DocsEditable()
@@ -22372,11 +23264,7 @@
 
   @DomName('TextTrack.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native;
-
-  @DomName('TextTrack.removeCue')
-  @DocsEditable()
-  void removeCue(TextTrackCue cue) native;
+  bool dispatchEvent(Event event) native;
 
   @JSName('removeEventListener')
   @DomName('TextTrack.removeEventListener')
@@ -22470,6 +23358,14 @@
   @Experimental() // nonstandard
   String vertical;
 
+  @JSName('getCueAsHTML')
+  @DomName('TextTrackCue.getCueAsHTML')
+  @DocsEditable()
+  @Experimental() // nonstandard
+  DocumentFragment getCueAsHtml() native;
+
+  // From EventTarget
+
   @JSName('addEventListener')
   @DomName('TextTrackCue.addEventListener')
   @DocsEditable()
@@ -22477,13 +23373,7 @@
 
   @DomName('TextTrackCue.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native;
-
-  @JSName('getCueAsHTML')
-  @DomName('TextTrackCue.getCueAsHTML')
-  @DocsEditable()
-  @Experimental() // nonstandard
-  DocumentFragment getCueAsHtml() native;
+  bool dispatchEvent(Event event) native;
 
   @JSName('removeEventListener')
   @DomName('TextTrackCue.removeEventListener')
@@ -22630,6 +23520,12 @@
   TextTrack elementAt(int index) => this[index];
   // -- end List<TextTrack> mixins.
 
+  @DomName('TextTrackList.item')
+  @DocsEditable()
+  TextTrack item(int index) native;
+
+  // From EventTarget
+
   @JSName('addEventListener')
   @DomName('TextTrackList.addEventListener')
   @DocsEditable()
@@ -22637,11 +23533,7 @@
 
   @DomName('TextTrackList.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native;
-
-  @DomName('TextTrackList.item')
-  @DocsEditable()
-  TextTrack item(int index) native;
+  bool dispatchEvent(Event event) native;
 
   @JSName('removeEventListener')
   @DomName('TextTrackList.removeEventListener')
@@ -23582,24 +24474,10 @@
   @DocsEditable()
   final String url;
 
-  @JSName('addEventListener')
-  @DomName('WebSocket.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('WebSocket.close')
   @DocsEditable()
   void close([int code, String reason]) native;
 
-  @DomName('WebSocket.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native;
-
-  @JSName('removeEventListener')
-  @DomName('WebSocket.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   /**
    * Transmit data to the server over this connection.
    *
@@ -23659,6 +24537,22 @@
   @DocsEditable()
   void sendTypedData(TypedData data) native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('WebSocket.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('WebSocket.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('WebSocket.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('WebSocket.onclose')
   @DocsEditable()
   Stream<CloseEvent> get onClose => closeEvent.forTarget(this);
@@ -23922,7 +24816,7 @@
 
 
 @DomName('Window')
-class Window extends EventTarget implements WindowBase, WindowTimers native "Window,DOMWindow" {
+class Window extends EventTarget implements WindowBase, WindowTimers, WindowBase64 native "Window,DOMWindow" {
 
   /**
    * Executes a [callback] after the immediate execution stack has completed.
@@ -24506,23 +25400,10 @@
   @Returns('Window|=Object')
   __getter___2(String name) native;
 
-  @JSName('addEventListener')
-  @DomName('Window.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('Window.alert')
   @DocsEditable()
   void alert(String message) native;
 
-  @DomName('Window.atob')
-  @DocsEditable()
-  String atob(String string) native;
-
-  @DomName('Window.btoa')
-  @DocsEditable()
-  String btoa(String string) native;
-
   @DomName('Window.close')
   @DocsEditable()
   void close() native;
@@ -24531,9 +25412,122 @@
   @DocsEditable()
   bool confirm(String message) native;
 
-  @DomName('Window.dispatchEvent')
+  @DomName('Window.createImageBitmap')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native;
+  @Experimental() // untriaged
+  void _createImageBitmap(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, ImageBitmapCallback callback, [int sx, int sy, int sw, int sh]) {
+    if ((bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is ImageElement || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      _createImageBitmap_1(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback);
+      return;
+    }
+    if (sh != null && sw != null && sy != null && sx != null && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is ImageElement || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null)) {
+      _createImageBitmap_2(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is VideoElement || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      _createImageBitmap_3(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback);
+      return;
+    }
+    if (sh != null && sw != null && sy != null && sx != null && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is VideoElement || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null)) {
+      _createImageBitmap_4(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is CanvasRenderingContext2D || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      _createImageBitmap_5(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback);
+      return;
+    }
+    if (sh != null && sw != null && sy != null && sx != null && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is CanvasRenderingContext2D || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null)) {
+      _createImageBitmap_6(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is CanvasElement || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      _createImageBitmap_7(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback);
+      return;
+    }
+    if (sh != null && sw != null && sy != null && sx != null && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is CanvasElement || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null)) {
+      _createImageBitmap_8(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is ImageData || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      var data_1 = convertDartToNative_ImageData(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video);
+      _createImageBitmap_9(data_1, callback);
+      return;
+    }
+    if (sh != null && sw != null && sy != null && sx != null && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is ImageData || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null)) {
+      var data_2 = convertDartToNative_ImageData(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video);
+      _createImageBitmap_10(data_2, callback, sx, sy, sw, sh);
+      return;
+    }
+    if ((bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is ImageBitmap || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      _createImageBitmap_11(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback);
+      return;
+    }
+    if (sh != null && sw != null && sy != null && sx != null && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is ImageBitmap || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null)) {
+      _createImageBitmap_12(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+  @JSName('createImageBitmap')
+  @DomName('Window.createImageBitmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _createImageBitmap_1(ImageElement image, ImageBitmapCallback callback) native;
+  @JSName('createImageBitmap')
+  @DomName('Window.createImageBitmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _createImageBitmap_2(ImageElement image, ImageBitmapCallback callback, sx, sy, sw, sh) native;
+  @JSName('createImageBitmap')
+  @DomName('Window.createImageBitmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _createImageBitmap_3(VideoElement video, ImageBitmapCallback callback) native;
+  @JSName('createImageBitmap')
+  @DomName('Window.createImageBitmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _createImageBitmap_4(VideoElement video, ImageBitmapCallback callback, sx, sy, sw, sh) native;
+  @JSName('createImageBitmap')
+  @DomName('Window.createImageBitmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _createImageBitmap_5(CanvasRenderingContext2D context, ImageBitmapCallback callback) native;
+  @JSName('createImageBitmap')
+  @DomName('Window.createImageBitmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _createImageBitmap_6(CanvasRenderingContext2D context, ImageBitmapCallback callback, sx, sy, sw, sh) native;
+  @JSName('createImageBitmap')
+  @DomName('Window.createImageBitmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _createImageBitmap_7(CanvasElement canvas, ImageBitmapCallback callback) native;
+  @JSName('createImageBitmap')
+  @DomName('Window.createImageBitmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _createImageBitmap_8(CanvasElement canvas, ImageBitmapCallback callback, sx, sy, sw, sh) native;
+  @JSName('createImageBitmap')
+  @DomName('Window.createImageBitmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _createImageBitmap_9(data, ImageBitmapCallback callback) native;
+  @JSName('createImageBitmap')
+  @DomName('Window.createImageBitmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _createImageBitmap_10(data, ImageBitmapCallback callback, sx, sy, sw, sh) native;
+  @JSName('createImageBitmap')
+  @DomName('Window.createImageBitmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _createImageBitmap_11(ImageBitmap bitmap, ImageBitmapCallback callback) native;
+  @JSName('createImageBitmap')
+  @DomName('Window.createImageBitmap')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _createImageBitmap_12(ImageBitmap bitmap, ImageBitmapCallback callback, sx, sy, sw, sh) native;
 
   @DomName('Window.find')
   @DocsEditable()
@@ -24605,11 +25599,6 @@
   @DocsEditable()
   void print() native;
 
-  @JSName('removeEventListener')
-  @DomName('Window.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('Window.resizeBy')
   @DocsEditable()
   void resizeBy(num x, num y) native;
@@ -24705,6 +25694,32 @@
     return completer.future;
   }
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('Window.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('Window.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('Window.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  // From WindowBase64
+
+  @DomName('Window.atob')
+  @DocsEditable()
+  String atob(String string) native;
+
+  @DomName('Window.btoa')
+  @DocsEditable()
+  String btoa(String string) native;
+
   // From WindowTimers
 
   @JSName('clearInterval')
@@ -24839,6 +25854,16 @@
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
+  @DomName('Window.onmouseenter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent.forTarget(this);
+
+  @DomName('Window.onmouseleave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent.forTarget(this);
+
   @DomName('Window.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
@@ -25036,6 +26061,20 @@
 
 
 @DocsEditable()
+@DomName('WindowBase64')
+@Experimental() // untriaged
+abstract class WindowBase64 extends Interceptor {
+
+  String atob(String string);
+
+  String btoa(String string);
+}
+// 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('WindowTimers')
 @Experimental() // untriaged
 abstract class WindowTimers extends Interceptor {
@@ -25092,6 +26131,25 @@
   @DocsEditable()
   void terminate() native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('Worker.addEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('Worker.dispatchEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('Worker.removeEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('Worker.onerror')
   @DocsEditable()
   @Experimental() // untriaged
@@ -25124,11 +26182,212 @@
 
 
 @DocsEditable()
+@DomName('WorkerGlobalScope')
+@Experimental() // untriaged
+class WorkerGlobalScope extends EventTarget implements WindowTimers, WindowBase64 native "WorkerGlobalScope" {
+  // To suppress missing implicit constructor warnings.
+  factory WorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('WorkerGlobalScope.errorEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+
+  @DomName('WorkerGlobalScope.PERSISTENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int PERSISTENT = 1;
+
+  @DomName('WorkerGlobalScope.TEMPORARY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEMPORARY = 0;
+
+  @DomName('WorkerGlobalScope.crypto')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final WorkerCrypto crypto;
+
+  @DomName('WorkerGlobalScope.indexedDB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final IdbFactory indexedDB;
+
+  @DomName('WorkerGlobalScope.location')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _WorkerLocation location;
+
+  @DomName('WorkerGlobalScope.navigator')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final _WorkerNavigator navigator;
+
+  @DomName('WorkerGlobalScope.performance')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final WorkerPerformance performance;
+
+  @DomName('WorkerGlobalScope.self')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final WorkerGlobalScope self;
+
+  @JSName('webkitNotifications')
+  @DomName('WorkerGlobalScope.webkitNotifications')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  @Experimental() // untriaged
+  final NotificationCenter notifications;
+
+  @DomName('WorkerGlobalScope.close')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void close() native;
+
+  @DomName('WorkerGlobalScope.importScripts')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void importScripts() native;
+
+  @DomName('WorkerGlobalScope.openDatabase')
+  @DocsEditable()
+  @Experimental() // untriaged
+  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
+
+  @DomName('WorkerGlobalScope.openDatabaseSync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native;
+
+  @JSName('webkitRequestFileSystem')
+  @DomName('WorkerGlobalScope.webkitRequestFileSystem')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _webkitRequestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) native;
+
+  @JSName('webkitRequestFileSystem')
+  @DomName('WorkerGlobalScope.webkitRequestFileSystem')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future<FileSystem> webkitRequestFileSystem(int type, int size) {
+    var completer = new Completer<FileSystem>();
+    _webkitRequestFileSystem(type, size,
+        (value) { completer.complete(value); },
+        (error) { completer.completeError(error); });
+    return completer.future;
+  }
+
+  @JSName('webkitRequestFileSystemSync')
+  @DomName('WorkerGlobalScope.webkitRequestFileSystemSync')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  @Experimental() // untriaged
+  _DOMFileSystemSync requestFileSystemSync(int type, int size) native;
+
+  @JSName('webkitResolveLocalFileSystemSyncURL')
+  @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemSyncURL')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  @Experimental() // untriaged
+  _EntrySync resolveLocalFileSystemSyncUrl(String url) native;
+
+  @JSName('webkitResolveLocalFileSystemURL')
+  @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemURL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _webkitResolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) native;
+
+  @JSName('webkitResolveLocalFileSystemURL')
+  @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemURL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Future<Entry> webkitResolveLocalFileSystemUrl(String url) {
+    var completer = new Completer<Entry>();
+    _webkitResolveLocalFileSystemUrl(url,
+        (value) { completer.complete(value); },
+        (error) { completer.completeError(error); });
+    return completer.future;
+  }
+
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('WorkerGlobalScope.addEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('WorkerGlobalScope.dispatchEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('WorkerGlobalScope.removeEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  // From WindowBase64
+
+  @DomName('WorkerGlobalScope.atob')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String atob(String string) native;
+
+  @DomName('WorkerGlobalScope.btoa')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String btoa(String string) native;
+
+  // From WindowTimers
+
+  @DomName('WorkerGlobalScope.clearInterval')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearInterval(int handle) native;
+
+  @DomName('WorkerGlobalScope.clearTimeout')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearTimeout(int handle) native;
+
+  @DomName('WorkerGlobalScope.setInterval')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int setInterval(Object handler, int timeout) native;
+
+  @DomName('WorkerGlobalScope.setTimeout')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int setTimeout(Object handler, int timeout) native;
+
+  @DomName('WorkerGlobalScope.onerror')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onError => errorEvent.forTarget(this);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
 @DomName('WorkerPerformance')
 @Experimental() // untriaged
-abstract class WorkerPerformance extends Interceptor {
+class WorkerPerformance extends Interceptor native "WorkerPerformance" {
 
-  num now();
+  @DomName('WorkerPerformance.now')
+  @DocsEditable()
+  @Experimental() // untriaged
+  num now() native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -25770,19 +27029,6 @@
 
 
 @DocsEditable()
-@DomName('DedicatedWorkerContext')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html
-@Experimental()
-abstract class _DedicatedWorkerContext extends _WorkerContext native "DedicatedWorkerContext" {
-  // To suppress missing implicit constructor warnings.
-  factory _DedicatedWorkerContext._() { throw new UnsupportedError("Not supported"); }
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable()
 @DomName('DirectoryEntrySync')
 // http://www.w3.org/TR/file-system-api/#the-directoryentrysync-interface
 @Experimental()
@@ -26345,19 +27591,8 @@
   }
   static _SharedWorker _create_1(scriptURL, name) => JS('_SharedWorker', 'new SharedWorker(#,#)', scriptURL, name);
   static _SharedWorker _create_2(scriptURL) => JS('_SharedWorker', 'new SharedWorker(#)', scriptURL);
-}
-// 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('SharedWorkerContext')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers-and-the-sharedworkerglobalscope-interface
-@Experimental() // nonstandard
-abstract class _SharedWorkerContext extends _WorkerContext native "SharedWorkerContext" {
-  // To suppress missing implicit constructor warnings.
-  factory _SharedWorkerContext._() { throw new UnsupportedError("Not supported"); }
+  // From EventTarget
 }
 // 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
@@ -26568,6 +27803,8 @@
     return _WebKitMediaSource._create_1();
   }
   static _WebKitMediaSource _create_1() => JS('_WebKitMediaSource', 'new WebKitMediaSource()');
+
+  // From EventTarget
 }
 // 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
@@ -26596,19 +27833,8 @@
   @DocsEditable()
   @Experimental() // untriaged
   _WebKitSourceBuffer _item(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
-// BSD-style license that can be found in the LICENSE file.
 
-
-@DocsEditable()
-@DomName('WorkerContext')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#WorkerGlobalScope-partial
-@Experimental() // stable
-abstract class _WorkerContext extends Interceptor implements EventTarget, WindowTimers native "WorkerContext" {
-
-  // From WindowTimers
+  // From EventTarget
 }
 // 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
@@ -27562,6 +28788,123 @@
   }
 }
 
+/** A specialized Stream available to [Element]s to enable event delegation. */
+abstract class ElementStream<T extends Event> implements Stream<T> {
+  /**
+   * Return a stream that only fires when the particular event fires for
+   * elements matching the specified CSS selector.
+   *
+   * This is the Dart equivalent to jQuery's
+   * [delegate](http://api.jquery.com/delegate/).
+   */
+  Stream<T> matches(String selector);
+}
+
+/**
+ * Adapter for exposing DOM Element events as streams, while also allowing
+ * event delegation.
+ */
+class _ElementEventStreamImpl<T extends Event> extends _EventStream<T>
+    implements ElementStream<T> {
+  _ElementEventStreamImpl(target, eventType, useCapture) :
+      super(target, eventType, useCapture);
+
+  Stream<T> matches(String selector) =>
+      this.where((event) => event.target.matches(selector, true));
+}
+
+/**
+ * Adapter for exposing events on a collection of DOM Elements as streams,
+ * while also allowing event delegation.
+ */
+class _ElementListEventStreamImpl<T extends Event> extends Stream<T>
+    implements ElementStream<T> {
+  final _StreamPool _pool;
+  Stream<T> _stream;
+
+  _ElementListEventStreamImpl(targetList, eventType, useCapture) :
+      _pool = new _StreamPool.broadcast() {
+    for (Element target in targetList) {
+      var stream = new _EventStream(target, eventType, useCapture);
+      _pool.add(stream);
+    }
+    _stream = _pool.stream;
+  }
+
+  Stream<T> matches(String selector) =>
+      this.where((event) => event.target.matches(selector, true));
+
+  // Delegate all regular Stream behavor to our wrapped Stream.
+  StreamSubscription<T> listen(void onData(T event),
+      { void onError(error),
+        void onDone(),
+        bool cancelOnError}) =>
+      _stream.listen(onData, onError: onError, onDone: onDone,
+          cancelOnError: cancelOnError);
+  Stream<T> asBroadcastStream({void onListen(StreamSubscription subscription),
+                               void onCancel(StreamSubscription subscription)})
+      => _stream;
+  bool get isBroadcast => true;
+}
+
+/**
+ * A pool of streams whose events are unified and emitted through a central
+ * stream.
+ */
+// TODO (efortuna): Remove this when Issue 12218 is addressed.
+class _StreamPool<T> {
+  StreamController<T> _controller;
+
+  /// Subscriptions to the streams that make up the pool.
+  var _subscriptions = new Map<Stream<T>, StreamSubscription<T>>();
+
+  /**
+   * Creates a new stream pool where [stream] can be listened to more than
+   * once.
+   *
+   * Any events from buffered streams in the pool will be emitted immediately,
+   * regardless of whether [stream] has any subscribers.
+   */
+  _StreamPool.broadcast() {
+    _controller = new StreamController<T>.broadcast(sync: true,
+        onCancel: close);
+  }
+
+  /**
+   * The stream through which all events from streams in the pool are emitted.
+   */
+  Stream<T> get stream => _controller.stream;
+
+  /**
+   * Adds [stream] as a member of this pool.
+   *
+   * Any events from [stream] will be emitted through [this.stream]. If
+   * [stream] is sync, they'll be emitted synchronously; if [stream] is async,
+   * they'll be emitted asynchronously.
+   */
+  void add(Stream<T> stream) {
+    if (_subscriptions.containsKey(stream)) return;
+    _subscriptions[stream] = stream.listen(_controller.add,
+        onError: _controller.addError,
+        onDone: () => remove(stream));
+  }
+
+  /** Removes [stream] as a member of this pool. */
+  void remove(Stream<T> stream) {
+    var subscription = _subscriptions.remove(stream);
+    if (subscription != null) subscription.cancel();
+  }
+
+  /** Removes all streams from this pool and closes [stream]. */
+  void close() {
+    for (var subscription in _subscriptions.values) {
+      subscription.cancel();
+    }
+    _subscriptions.clear();
+    _controller.close();
+  }
+}
+
 class _EventStreamSubscription<T extends Event> extends StreamSubscription<T> {
   int _pauseCount = 0;
   EventTarget _target;
@@ -27639,7 +28982,6 @@
   }
 }
 
-
 /**
  * A factory to expose DOM events as Streams.
  */
@@ -27666,8 +29008,43 @@
    *
    * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
    */
-  Stream<T> forTarget(EventTarget e, {bool useCapture: false}) {
-    return new _EventStream(e, _eventType, useCapture);
+  Stream<T> forTarget(EventTarget e, {bool useCapture: false}) =>
+    new _EventStream(e, _eventType, useCapture);
+
+  /**
+   * Gets an [ElementEventStream] for this event type, on the specified element.
+   *
+   * This will always return a broadcast stream so multiple listeners can be
+   * used simultaneously.
+   *
+   * This may be used to capture DOM events:
+   *
+   *     Element.keyDownEvent.forElement(element, useCapture: true).listen(...);
+   *
+   * See also:
+   *
+   * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+   */
+  ElementStream<T> forElement(Element e, {bool useCapture: false}) {
+    return new _ElementEventStreamImpl(e, _eventType, useCapture);
+  }
+
+  /**
+   * Gets an [ElementEventStream] for this event type, on the list of elements.
+   *
+   * This will always return a broadcast stream so multiple listeners can be
+   * used simultaneously.
+   *
+   * This may be used to capture DOM events:
+   *
+   *     Element.keyDownEvent._forElementList(element, useCapture: true).listen(...);
+   *
+   * See also:
+   *
+   * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+   */
+  ElementStream<T> _forElementList(ElementList e, {bool useCapture: false}) {
+    return new _ElementListEventStreamImpl(e, _eventType, useCapture);
   }
 
   /**
@@ -27696,6 +29073,15 @@
     return new _EventStream(e, _eventTypeGetter(e), useCapture);
   }
 
+  ElementStream<T> forElement(Element e, {bool useCapture: false}) {
+    return new _ElementEventStreamImpl(e, _eventTypeGetter(e), useCapture);
+  }
+
+  ElementStream<T> _forElementList(ElementList e,
+      {bool useCapture: false}) {
+    return new _ElementListEventStreamImpl(e, _eventTypeGetter(e), useCapture);
+  }
+
   String getEventType(EventTarget target) {
     return _eventTypeGetter(target);
   }
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 3b3637e..1524bc9 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -91,18 +91,14 @@
   _callPortLastResult = null;
   return result;
 }
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
 
 @DocsEditable()
 @DomName('AbstractWorker')
-class AbstractWorker extends EventTarget {
-  // To suppress missing implicit constructor warnings.
-  factory AbstractWorker._() { throw new UnsupportedError("Not supported"); }
+class AbstractWorker extends NativeFieldWrapperClass1 implements EventTarget {
 
   @DomName('AbstractWorker.errorEvent')
   @DocsEditable()
@@ -111,6 +107,63 @@
   @DomName('AbstractWorker.onerror')
   @DocsEditable()
   Stream<ErrorEvent> get onError => errorEvent.forTarget(this);
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('AesCbcParams')
+@Experimental() // untriaged
+class AesCbcParams extends Algorithm {
+  // To suppress missing implicit constructor warnings.
+  factory AesCbcParams._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AesCbcParams.iv')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Uint8List get iv native "AesCbcParams_iv_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('AesKeyGenParams')
+@Experimental() // untriaged
+class AesKeyGenParams extends Algorithm {
+  // To suppress missing implicit constructor warnings.
+  factory AesKeyGenParams._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('AesKeyGenParams.length')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get length native "AesKeyGenParams_length_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('Algorithm')
+@Experimental() // untriaged
+class Algorithm extends NativeFieldWrapperClass1 {
+
+  @DomName('Algorithm.name')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get name native "Algorithm_name_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -384,18 +437,6 @@
   @DocsEditable()
   void abort() native "DOMApplicationCache_abort_Callback";
 
-  @DomName('DOMApplicationCache.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_addEventListener_Callback";
-
-  @DomName('DOMApplicationCache.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native "DOMApplicationCache_dispatchEvent_Callback";
-
-  @DomName('DOMApplicationCache.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_removeEventListener_Callback";
-
   @DomName('DOMApplicationCache.swapCache')
   @DocsEditable()
   void swapCache() native "DOMApplicationCache_swapCache_Callback";
@@ -404,6 +445,18 @@
   @DocsEditable()
   void update() native "DOMApplicationCache_update_Callback";
 
+  @DomName('DOMApplicationCache.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_addEventListener_Callback";
+
+  @DomName('DOMApplicationCache.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "DOMApplicationCache_dispatchEvent_Callback";
+
+  @DomName('DOMApplicationCache.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_removeEventListener_Callback";
+
   @DomName('DOMApplicationCache.oncached')
   @DocsEditable()
   Stream<Event> get onCached => cachedEvent.forTarget(this);
@@ -790,51 +843,51 @@
 
   @DomName('HTMLBodyElement.onblur')
   @DocsEditable()
-  Stream<Event> get onBlur => blurEvent.forTarget(this);
+  ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onerror')
   @DocsEditable()
-  Stream<Event> get onError => errorEvent.forTarget(this);
+  ElementStream<Event> get onError => errorEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onfocus')
   @DocsEditable()
-  Stream<Event> get onFocus => focusEvent.forTarget(this);
+  ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onhashchange')
   @DocsEditable()
-  Stream<Event> get onHashChange => hashChangeEvent.forTarget(this);
+  ElementStream<Event> get onHashChange => hashChangeEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onload')
   @DocsEditable()
-  Stream<Event> get onLoad => loadEvent.forTarget(this);
+  ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onmessage')
   @DocsEditable()
-  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
+  ElementStream<MessageEvent> get onMessage => messageEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onoffline')
   @DocsEditable()
-  Stream<Event> get onOffline => offlineEvent.forTarget(this);
+  ElementStream<Event> get onOffline => offlineEvent.forElement(this);
 
   @DomName('HTMLBodyElement.ononline')
   @DocsEditable()
-  Stream<Event> get onOnline => onlineEvent.forTarget(this);
+  ElementStream<Event> get onOnline => onlineEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onpopstate')
   @DocsEditable()
-  Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
+  ElementStream<PopStateEvent> get onPopState => popStateEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onresize')
   @DocsEditable()
-  Stream<Event> get onResize => resizeEvent.forTarget(this);
+  ElementStream<Event> get onResize => resizeEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onstorage')
   @DocsEditable()
-  Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);
+  ElementStream<StorageEvent> get onStorage => storageEvent.forElement(this);
 
   @DomName('HTMLBodyElement.onunload')
   @DocsEditable()
-  Stream<Event> get onUnload => unloadEvent.forTarget(this);
+  ElementStream<Event> get onUnload => unloadEvent.forElement(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1099,11 +1152,11 @@
 
   @DomName('HTMLCanvasElement.onwebglcontextlost')
   @DocsEditable()
-  Stream<gl.ContextEvent> get onWebGlContextLost => webGlContextLostEvent.forTarget(this);
+  ElementStream<gl.ContextEvent> get onWebGlContextLost => webGlContextLostEvent.forElement(this);
 
   @DomName('HTMLCanvasElement.onwebglcontextrestored')
   @DocsEditable()
-  Stream<gl.ContextEvent> get onWebGlContextRestored => webGlContextRestoredEvent.forTarget(this);
+  ElementStream<gl.ContextEvent> get onWebGlContextRestored => webGlContextRestoredEvent.forElement(this);
 
   /** An API for drawing on this canvas. */
   CanvasRenderingContext2D get context2D => getContext('2d');
@@ -1483,63 +1536,81 @@
   @DocsEditable()
   CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) native "CanvasRenderingContext2D_createRadialGradient_Callback";
 
-  void _drawImage(canvas_OR_image_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) {
-    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _drawImage_1(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
+  void _drawImage(canvas_OR_image_OR_imageBitmap_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) {
+    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
+      _drawImage_1(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
-    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      _drawImage_2(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
+      _drawImage_2(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
-    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null)) {
-      _drawImage_3(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
+      _drawImage_3(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
-    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _drawImage_4(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
+    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
+      _drawImage_4(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
-    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      _drawImage_5(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
+      _drawImage_5(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
-    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null)) {
-      _drawImage_6(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
+      _drawImage_6(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
-    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _drawImage_7(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
+    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
+      _drawImage_7(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
-    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      _drawImage_8(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
+      _drawImage_8(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
-    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null)) {
-      _drawImage_9(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
+      _drawImage_9(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      return;
+    }
+    if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
+      _drawImage_10(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      return;
+    }
+    if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
+      _drawImage_11(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      return;
+    }
+    if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
+      _drawImage_12(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  void _drawImage_1(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_1_Callback";
+  void _drawImage_1(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_1_Callback";
 
-  void _drawImage_2(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_2_Callback";
+  void _drawImage_2(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_2_Callback";
 
-  void _drawImage_3(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_3_Callback";
+  void _drawImage_3(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_3_Callback";
 
-  void _drawImage_4(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_4_Callback";
+  void _drawImage_4(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_4_Callback";
 
-  void _drawImage_5(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_5_Callback";
+  void _drawImage_5(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_5_Callback";
 
-  void _drawImage_6(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_6_Callback";
+  void _drawImage_6(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_6_Callback";
 
-  void _drawImage_7(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_7_Callback";
+  void _drawImage_7(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_7_Callback";
 
-  void _drawImage_8(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_8_Callback";
+  void _drawImage_8(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_8_Callback";
 
-  void _drawImage_9(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_9_Callback";
+  void _drawImage_9(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_9_Callback";
+
+  void _drawImage_10(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D__drawImage_10_Callback";
+
+  void _drawImage_11(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D__drawImage_11_Callback";
+
+  void _drawImage_12(canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D__drawImage_12_Callback";
 
   void fill([String winding]) {
     if (winding != null) {
@@ -2068,13 +2139,19 @@
 @Experimental()
 class Composition extends NativeFieldWrapperClass1 {
 
-  @DomName('Composition.caret')
+  @DomName('Composition.selectionEnd')
   @DocsEditable()
-  Range get caret native "Composition_caret_Getter";
+  @Experimental() // untriaged
+  int get selectionEnd native "Composition_selectionEnd_Getter";
+
+  @DomName('Composition.selectionStart')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get selectionStart native "Composition_selectionStart_Getter";
 
   @DomName('Composition.text')
   @DocsEditable()
-  Node get text native "Composition_text_Getter";
+  String get text native "Composition_text_Getter";
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -2339,6 +2416,44 @@
 
 
 @DocsEditable()
+@DomName('CryptoOperation')
+@Experimental() // untriaged
+class CryptoOperation extends NativeFieldWrapperClass1 {
+
+  @DomName('CryptoOperation.algorithm')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Algorithm get algorithm native "CryptoOperation_algorithm_Getter";
+
+  @DomName('CryptoOperation.abort')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object abort() native "CryptoOperation_abort_Callback";
+
+  @DomName('CryptoOperation.finish')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object finish() native "CryptoOperation_finish_Callback";
+
+  @DomName('CryptoOperation.processByteBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation processByteBuffer(ByteBuffer data) native "CryptoOperation_processByteBuffer_Callback";
+
+  @DomName('CryptoOperation.processTypedData')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation processTypedData(TypedData data) native "CryptoOperation_processTypedData_Callback";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('CSS')
 // http://www.w3.org/TR/css3-conditional/#the-css-interface
 @Experimental() // None
@@ -3139,6 +3254,11 @@
   @DocsEditable()
   CssRule get parentRule native "CSSStyleDeclaration_parentRule_Getter";
 
+  @DomName('CSSStyleDeclaration.var')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CssVariablesMap get _var native "CSSStyleDeclaration_var_Getter";
+
   @DomName('CSSStyleDeclaration.__setter__')
   @DocsEditable()
   void __setter__(String propertyName, String propertyValue) native "CSSStyleDeclaration___setter___Callback";
@@ -6599,6 +6719,49 @@
 
 
 @DocsEditable()
+@DomName('CSSVariablesMap')
+@Experimental() // untriaged
+class CssVariablesMap extends NativeFieldWrapperClass1 {
+
+  @DomName('CSSVariablesMap.size')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get size native "CSSVariablesMap_size_Getter";
+
+  @DomName('CSSVariablesMap.clear')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clear() native "CSSVariablesMap_clear_Callback";
+
+  @DomName('CSSVariablesMap.delete')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool delete(String name) native "CSSVariablesMap_delete_Callback";
+
+  @DomName('CSSVariablesMap.get')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get(String name) native "CSSVariablesMap_get_Callback";
+
+  @DomName('CSSVariablesMap.has')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool has(String name) native "CSSVariablesMap_has_Callback";
+
+  @DomName('CSSVariablesMap.set')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set(String name, String value) native "CSSVariablesMap_set_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('CSSViewportRule')
 @Experimental() // untriaged
 class CssViewportRule extends CssRule {
@@ -6873,6 +7036,36 @@
 
 
 @DocsEditable()
+@DomName('DedicatedWorkerGlobalScope')
+@Experimental() // untriaged
+class DedicatedWorkerGlobalScope extends WorkerGlobalScope {
+  // To suppress missing implicit constructor warnings.
+  factory DedicatedWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('DedicatedWorkerGlobalScope.messageEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
+
+  @DomName('DedicatedWorkerGlobalScope.postMessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void postMessage(Object message, [List messagePorts]) native "DedicatedWorkerGlobalScope_postMessage_Callback";
+
+  @DomName('DedicatedWorkerGlobalScope.onmessage')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('HTMLDetailsElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -7045,9 +7238,19 @@
   @DocsEditable()
   void set open(bool value) native "HTMLDialogElement_open_Setter";
 
+  @DomName('HTMLDialogElement.returnValue')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get returnValue native "HTMLDialogElement_returnValue_Getter";
+
+  @DomName('HTMLDialogElement.returnValue')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set returnValue(String value) native "HTMLDialogElement_returnValue_Setter";
+
   @DomName('HTMLDialogElement.close')
   @DocsEditable()
-  void close() native "HTMLDialogElement_close_Callback";
+  void close(String returnValue) native "HTMLDialogElement_close_Callback";
 
   @DomName('HTMLDialogElement.show')
   @DocsEditable()
@@ -7788,6 +7991,16 @@
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
+  @DomName('Document.onmouseenter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent.forTarget(this);
+
+  @DomName('Document.onmouseleave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent.forTarget(this);
+
   @DomName('Document.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
@@ -8570,6 +8783,234 @@
    */
   @Experimental()
   CssRect get marginEdge;
+
+  @DomName('Element.onabort')
+  @DocsEditable()
+  ElementStream<Event> get onAbort;
+
+  @DomName('Element.onbeforecopy')
+  @DocsEditable()
+  ElementStream<Event> get onBeforeCopy;
+
+  @DomName('Element.onbeforecut')
+  @DocsEditable()
+  ElementStream<Event> get onBeforeCut;
+
+  @DomName('Element.onbeforepaste')
+  @DocsEditable()
+  ElementStream<Event> get onBeforePaste;
+
+  @DomName('Element.onblur')
+  @DocsEditable()
+  ElementStream<Event> get onBlur;
+
+  @DomName('Element.onchange')
+  @DocsEditable()
+  ElementStream<Event> get onChange;
+
+  @DomName('Element.onclick')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onClick;
+
+  @DomName('Element.oncontextmenu')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onContextMenu;
+
+  @DomName('Element.oncopy')
+  @DocsEditable()
+  ElementStream<Event> get onCopy;
+
+  @DomName('Element.oncut')
+  @DocsEditable()
+  ElementStream<Event> get onCut;
+
+  @DomName('Element.ondblclick')
+  @DocsEditable()
+  ElementStream<Event> get onDoubleClick;
+
+  @DomName('Element.ondrag')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDrag;
+
+  @DomName('Element.ondragend')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragEnd;
+
+  @DomName('Element.ondragenter')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragEnter;
+
+  @DomName('Element.ondragleave')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragLeave;
+
+  @DomName('Element.ondragover')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragOver;
+
+  @DomName('Element.ondragstart')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragStart;
+
+  @DomName('Element.ondrop')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDrop;
+
+  @DomName('Element.onerror')
+  @DocsEditable()
+  ElementStream<Event> get onError;
+
+  @DomName('Element.onfocus')
+  @DocsEditable()
+  ElementStream<Event> get onFocus;
+
+  @DomName('Element.oninput')
+  @DocsEditable()
+  ElementStream<Event> get onInput;
+
+  @DomName('Element.oninvalid')
+  @DocsEditable()
+  ElementStream<Event> get onInvalid;
+
+  @DomName('Element.onkeydown')
+  @DocsEditable()
+  ElementStream<KeyboardEvent> get onKeyDown;
+
+  @DomName('Element.onkeypress')
+  @DocsEditable()
+  ElementStream<KeyboardEvent> get onKeyPress;
+
+  @DomName('Element.onkeyup')
+  @DocsEditable()
+  ElementStream<KeyboardEvent> get onKeyUp;
+
+  @DomName('Element.onload')
+  @DocsEditable()
+  ElementStream<Event> get onLoad;
+
+  @DomName('Element.onmousedown')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseDown;
+
+  @DomName('Element.onmouseenter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<MouseEvent> get onMouseEnter;
+
+  @DomName('Element.onmouseleave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<MouseEvent> get onMouseLeave;
+
+  @DomName('Element.onmousemove')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseMove;
+
+  @DomName('Element.onmouseout')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseOut;
+
+  @DomName('Element.onmouseover')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseOver;
+
+  @DomName('Element.onmouseup')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseUp;
+
+  @DomName('Element.onmousewheel')
+  @DocsEditable()
+  // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
+  @Experimental() // non-standard
+  ElementStream<WheelEvent> get onMouseWheel;
+
+  @DomName('Element.onpaste')
+  @DocsEditable()
+  ElementStream<Event> get onPaste;
+
+  @DomName('Element.onreset')
+  @DocsEditable()
+  ElementStream<Event> get onReset;
+
+  @DomName('Element.onscroll')
+  @DocsEditable()
+  ElementStream<Event> get onScroll;
+
+  @DomName('Element.onsearch')
+  @DocsEditable()
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental()
+  ElementStream<Event> get onSearch;
+
+  @DomName('Element.onselect')
+  @DocsEditable()
+  ElementStream<Event> get onSelect;
+
+  @DomName('Element.onselectstart')
+  @DocsEditable()
+  @Experimental() // nonstandard
+  ElementStream<Event> get onSelectStart;
+
+  @DomName('Element.onsubmit')
+  @DocsEditable()
+  ElementStream<Event> get onSubmit;
+
+  @DomName('Element.ontouchcancel')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchCancel;
+
+  @DomName('Element.ontouchend')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchEnd;
+
+  @DomName('Element.ontouchenter')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchEnter;
+
+  @DomName('Element.ontouchleave')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchLeave;
+
+  @DomName('Element.ontouchmove')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchMove;
+
+  @DomName('Element.ontouchstart')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchStart;
+
+  @DomName('Element.ontransitionend')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.FIREFOX)
+  @SupportedBrowser(SupportedBrowser.IE, '10')
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  ElementStream<TransitionEvent> get onTransitionEnd;
+
+  @DomName('Element.onwebkitfullscreenchange')
+  @DocsEditable()
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental()
+  ElementStream<Event> get onFullscreenChange;
+
+  @DomName('Element.onwebkitfullscreenerror')
+  @DocsEditable()
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental()
+  ElementStream<Event> get onFullscreenError;
+ 
 }
 
 // TODO(jacobr): this is an inefficient implementation but it is hard to see
@@ -8623,6 +9064,234 @@
   CssRect get borderEdge => _elementList.first.borderEdge;
 
   CssRect get marginEdge => _elementList.first.marginEdge;
+
+  @DomName('Element.onabort')
+  @DocsEditable()
+  ElementStream<Event> get onAbort => Element.abortEvent._forElementList(this);
+
+  @DomName('Element.onbeforecopy')
+  @DocsEditable()
+  ElementStream<Event> get onBeforeCopy => Element.beforeCopyEvent._forElementList(this);
+
+  @DomName('Element.onbeforecut')
+  @DocsEditable()
+  ElementStream<Event> get onBeforeCut => Element.beforeCutEvent._forElementList(this);
+
+  @DomName('Element.onbeforepaste')
+  @DocsEditable()
+  ElementStream<Event> get onBeforePaste => Element.beforePasteEvent._forElementList(this);
+
+  @DomName('Element.onblur')
+  @DocsEditable()
+  ElementStream<Event> get onBlur => Element.blurEvent._forElementList(this);
+
+  @DomName('Element.onchange')
+  @DocsEditable()
+  ElementStream<Event> get onChange => Element.changeEvent._forElementList(this);
+
+  @DomName('Element.onclick')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onClick => Element.clickEvent._forElementList(this);
+
+  @DomName('Element.oncontextmenu')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onContextMenu => Element.contextMenuEvent._forElementList(this);
+
+  @DomName('Element.oncopy')
+  @DocsEditable()
+  ElementStream<Event> get onCopy => Element.copyEvent._forElementList(this);
+
+  @DomName('Element.oncut')
+  @DocsEditable()
+  ElementStream<Event> get onCut => Element.cutEvent._forElementList(this);
+
+  @DomName('Element.ondblclick')
+  @DocsEditable()
+  ElementStream<Event> get onDoubleClick => Element.doubleClickEvent._forElementList(this);
+
+  @DomName('Element.ondrag')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDrag => Element.dragEvent._forElementList(this);
+
+  @DomName('Element.ondragend')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragEnd => Element.dragEndEvent._forElementList(this);
+
+  @DomName('Element.ondragenter')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragEnter => Element.dragEnterEvent._forElementList(this);
+
+  @DomName('Element.ondragleave')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragLeave => Element.dragLeaveEvent._forElementList(this);
+
+  @DomName('Element.ondragover')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragOver => Element.dragOverEvent._forElementList(this);
+
+  @DomName('Element.ondragstart')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDragStart => Element.dragStartEvent._forElementList(this);
+
+  @DomName('Element.ondrop')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onDrop => Element.dropEvent._forElementList(this);
+
+  @DomName('Element.onerror')
+  @DocsEditable()
+  ElementStream<Event> get onError => Element.errorEvent._forElementList(this);
+
+  @DomName('Element.onfocus')
+  @DocsEditable()
+  ElementStream<Event> get onFocus => Element.focusEvent._forElementList(this);
+
+  @DomName('Element.oninput')
+  @DocsEditable()
+  ElementStream<Event> get onInput => Element.inputEvent._forElementList(this);
+
+  @DomName('Element.oninvalid')
+  @DocsEditable()
+  ElementStream<Event> get onInvalid => Element.invalidEvent._forElementList(this);
+
+  @DomName('Element.onkeydown')
+  @DocsEditable()
+  ElementStream<KeyboardEvent> get onKeyDown => Element.keyDownEvent._forElementList(this);
+
+  @DomName('Element.onkeypress')
+  @DocsEditable()
+  ElementStream<KeyboardEvent> get onKeyPress => Element.keyPressEvent._forElementList(this);
+
+  @DomName('Element.onkeyup')
+  @DocsEditable()
+  ElementStream<KeyboardEvent> get onKeyUp => Element.keyUpEvent._forElementList(this);
+
+  @DomName('Element.onload')
+  @DocsEditable()
+  ElementStream<Event> get onLoad => Element.loadEvent._forElementList(this);
+
+  @DomName('Element.onmousedown')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseDown => Element.mouseDownEvent._forElementList(this);
+
+  @DomName('Element.onmouseenter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent._forElementList(this);
+
+  @DomName('Element.onmouseleave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent._forElementList(this);
+
+  @DomName('Element.onmousemove')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseMove => Element.mouseMoveEvent._forElementList(this);
+
+  @DomName('Element.onmouseout')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseOut => Element.mouseOutEvent._forElementList(this);
+
+  @DomName('Element.onmouseover')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseOver => Element.mouseOverEvent._forElementList(this);
+
+  @DomName('Element.onmouseup')
+  @DocsEditable()
+  ElementStream<MouseEvent> get onMouseUp => Element.mouseUpEvent._forElementList(this);
+
+  @DomName('Element.onmousewheel')
+  @DocsEditable()
+  // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
+  @Experimental() // non-standard
+  ElementStream<WheelEvent> get onMouseWheel => Element.mouseWheelEvent._forElementList(this);
+
+  @DomName('Element.onpaste')
+  @DocsEditable()
+  ElementStream<Event> get onPaste => Element.pasteEvent._forElementList(this);
+
+  @DomName('Element.onreset')
+  @DocsEditable()
+  ElementStream<Event> get onReset => Element.resetEvent._forElementList(this);
+
+  @DomName('Element.onscroll')
+  @DocsEditable()
+  ElementStream<Event> get onScroll => Element.scrollEvent._forElementList(this);
+
+  @DomName('Element.onsearch')
+  @DocsEditable()
+  // http://www.w3.org/TR/html-markup/input.search.html
+  @Experimental()
+  ElementStream<Event> get onSearch => Element.searchEvent._forElementList(this);
+
+  @DomName('Element.onselect')
+  @DocsEditable()
+  ElementStream<Event> get onSelect => Element.selectEvent._forElementList(this);
+
+  @DomName('Element.onselectstart')
+  @DocsEditable()
+  @Experimental() // nonstandard
+  ElementStream<Event> get onSelectStart => Element.selectStartEvent._forElementList(this);
+
+  @DomName('Element.onsubmit')
+  @DocsEditable()
+  ElementStream<Event> get onSubmit => Element.submitEvent._forElementList(this);
+
+  @DomName('Element.ontouchcancel')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchCancel => Element.touchCancelEvent._forElementList(this);
+
+  @DomName('Element.ontouchend')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchEnd => Element.touchEndEvent._forElementList(this);
+
+  @DomName('Element.ontouchenter')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchEnter => Element.touchEnterEvent._forElementList(this);
+
+  @DomName('Element.ontouchleave')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchLeave => Element.touchLeaveEvent._forElementList(this);
+
+  @DomName('Element.ontouchmove')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchMove => Element.touchMoveEvent._forElementList(this);
+
+  @DomName('Element.ontouchstart')
+  @DocsEditable()
+  // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
+  @Experimental()
+  ElementStream<TouchEvent> get onTouchStart => Element.touchStartEvent._forElementList(this);
+
+  @DomName('Element.ontransitionend')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.FIREFOX)
+  @SupportedBrowser(SupportedBrowser.IE, '10')
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  ElementStream<TransitionEvent> get onTransitionEnd => Element.transitionEndEvent._forElementList(this);
+
+  @DomName('Element.onwebkitfullscreenchange')
+  @DocsEditable()
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental()
+  ElementStream<Event> get onFullscreenChange => Element.fullscreenChangeEvent._forElementList(this);
+
+  @DomName('Element.onwebkitfullscreenerror')
+  @DocsEditable()
+  // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
+  @Experimental()
+  ElementStream<Event> get onFullscreenError => Element.fullscreenErrorEvent._forElementList(this);
+
 }
 
 /**
@@ -9073,6 +9742,7 @@
   bool _templateIsDecorated;
 
 
+
   /**
    * Gets the template this node refers to.
    * This is only supported if [isTemplate] is true.
@@ -9423,6 +10093,16 @@
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
 
+  @DomName('Element.mouseenterEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
+
+  @DomName('Element.mouseleaveEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
+
   @DomName('Element.mousemoveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
@@ -9624,6 +10304,16 @@
   @DocsEditable()
   int get offsetWidth native "Element_offsetWidth_Getter";
 
+  @DomName('Element.pseudo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get pseudo native "Element_pseudo_Getter";
+
+  @DomName('Element.pseudo')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set pseudo(String value) native "Element_pseudo_Setter";
+
   @DomName('Element.scrollHeight')
   @DocsEditable()
   int get scrollHeight native "Element_scrollHeight_Getter";
@@ -9648,6 +10338,12 @@
   @DocsEditable()
   int get scrollWidth native "Element_scrollWidth_Getter";
 
+  @DomName('Element.shadowRoot')
+  @DocsEditable()
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
+  @Experimental()
+  ShadowRoot get shadowRoot native "Element_shadowRoot_Getter";
+
   @DomName('Element.style')
   @DocsEditable()
   CssStyleDeclaration get style native "Element_style_Getter";
@@ -9656,22 +10352,6 @@
   @DocsEditable()
   String get tagName native "Element_tagName_Getter";
 
-  @DomName('Element.webkitPseudo')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  @Experimental() // nonstandard
-  String get pseudo native "Element_webkitPseudo_Getter";
-
-  @DomName('Element.webkitPseudo')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  @Experimental() // nonstandard
-  void set pseudo(String value) native "Element_webkitPseudo_Setter";
-
   @DomName('Element.webkitRegionOverset')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -9680,18 +10360,17 @@
   // http://dev.w3.org/csswg/css-regions/#dom-region-regionoverset
   String get regionOverset native "Element_webkitRegionOverset_Getter";
 
-  @DomName('Element.webkitShadowRoot')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
-  ShadowRoot get shadowRoot native "Element_webkitShadowRoot_Getter";
-
   @DomName('Element.blur')
   @DocsEditable()
   void blur() native "Element_blur_Callback";
 
+  @DomName('Element.createShadowRoot')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME, '25')
+  @Experimental()
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
+  ShadowRoot createShadowRoot() native "Element_createShadowRoot_Callback";
+
   @DomName('Element.focus')
   @DocsEditable()
   void focus() native "Element_focus_Callback";
@@ -9803,13 +10482,6 @@
   @DocsEditable()
   void $dom_setAttributeNS(String namespaceURI, String qualifiedName, String value) native "Element_setAttributeNS_Callback";
 
-  @DomName('Element.webkitCreateShadowRoot')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME, '25')
-  @Experimental()
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
-  ShadowRoot createShadowRoot() native "Element_webkitCreateShadowRoot_Callback";
-
   @DomName('Element.webkitGetRegionFlowRanges')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -9879,200 +10551,210 @@
 
   @DomName('Element.onabort')
   @DocsEditable()
-  Stream<Event> get onAbort => abortEvent.forTarget(this);
+  ElementStream<Event> get onAbort => abortEvent.forElement(this);
 
   @DomName('Element.onbeforecopy')
   @DocsEditable()
-  Stream<Event> get onBeforeCopy => beforeCopyEvent.forTarget(this);
+  ElementStream<Event> get onBeforeCopy => beforeCopyEvent.forElement(this);
 
   @DomName('Element.onbeforecut')
   @DocsEditable()
-  Stream<Event> get onBeforeCut => beforeCutEvent.forTarget(this);
+  ElementStream<Event> get onBeforeCut => beforeCutEvent.forElement(this);
 
   @DomName('Element.onbeforepaste')
   @DocsEditable()
-  Stream<Event> get onBeforePaste => beforePasteEvent.forTarget(this);
+  ElementStream<Event> get onBeforePaste => beforePasteEvent.forElement(this);
 
   @DomName('Element.onblur')
   @DocsEditable()
-  Stream<Event> get onBlur => blurEvent.forTarget(this);
+  ElementStream<Event> get onBlur => blurEvent.forElement(this);
 
   @DomName('Element.onchange')
   @DocsEditable()
-  Stream<Event> get onChange => changeEvent.forTarget(this);
+  ElementStream<Event> get onChange => changeEvent.forElement(this);
 
   @DomName('Element.onclick')
   @DocsEditable()
-  Stream<MouseEvent> get onClick => clickEvent.forTarget(this);
+  ElementStream<MouseEvent> get onClick => clickEvent.forElement(this);
 
   @DomName('Element.oncontextmenu')
   @DocsEditable()
-  Stream<MouseEvent> get onContextMenu => contextMenuEvent.forTarget(this);
+  ElementStream<MouseEvent> get onContextMenu => contextMenuEvent.forElement(this);
 
   @DomName('Element.oncopy')
   @DocsEditable()
-  Stream<Event> get onCopy => copyEvent.forTarget(this);
+  ElementStream<Event> get onCopy => copyEvent.forElement(this);
 
   @DomName('Element.oncut')
   @DocsEditable()
-  Stream<Event> get onCut => cutEvent.forTarget(this);
+  ElementStream<Event> get onCut => cutEvent.forElement(this);
 
   @DomName('Element.ondblclick')
   @DocsEditable()
-  Stream<Event> get onDoubleClick => doubleClickEvent.forTarget(this);
+  ElementStream<Event> get onDoubleClick => doubleClickEvent.forElement(this);
 
   @DomName('Element.ondrag')
   @DocsEditable()
-  Stream<MouseEvent> get onDrag => dragEvent.forTarget(this);
+  ElementStream<MouseEvent> get onDrag => dragEvent.forElement(this);
 
   @DomName('Element.ondragend')
   @DocsEditable()
-  Stream<MouseEvent> get onDragEnd => dragEndEvent.forTarget(this);
+  ElementStream<MouseEvent> get onDragEnd => dragEndEvent.forElement(this);
 
   @DomName('Element.ondragenter')
   @DocsEditable()
-  Stream<MouseEvent> get onDragEnter => dragEnterEvent.forTarget(this);
+  ElementStream<MouseEvent> get onDragEnter => dragEnterEvent.forElement(this);
 
   @DomName('Element.ondragleave')
   @DocsEditable()
-  Stream<MouseEvent> get onDragLeave => dragLeaveEvent.forTarget(this);
+  ElementStream<MouseEvent> get onDragLeave => dragLeaveEvent.forElement(this);
 
   @DomName('Element.ondragover')
   @DocsEditable()
-  Stream<MouseEvent> get onDragOver => dragOverEvent.forTarget(this);
+  ElementStream<MouseEvent> get onDragOver => dragOverEvent.forElement(this);
 
   @DomName('Element.ondragstart')
   @DocsEditable()
-  Stream<MouseEvent> get onDragStart => dragStartEvent.forTarget(this);
+  ElementStream<MouseEvent> get onDragStart => dragStartEvent.forElement(this);
 
   @DomName('Element.ondrop')
   @DocsEditable()
-  Stream<MouseEvent> get onDrop => dropEvent.forTarget(this);
+  ElementStream<MouseEvent> get onDrop => dropEvent.forElement(this);
 
   @DomName('Element.onerror')
   @DocsEditable()
-  Stream<Event> get onError => errorEvent.forTarget(this);
+  ElementStream<Event> get onError => errorEvent.forElement(this);
 
   @DomName('Element.onfocus')
   @DocsEditable()
-  Stream<Event> get onFocus => focusEvent.forTarget(this);
+  ElementStream<Event> get onFocus => focusEvent.forElement(this);
 
   @DomName('Element.oninput')
   @DocsEditable()
-  Stream<Event> get onInput => inputEvent.forTarget(this);
+  ElementStream<Event> get onInput => inputEvent.forElement(this);
 
   @DomName('Element.oninvalid')
   @DocsEditable()
-  Stream<Event> get onInvalid => invalidEvent.forTarget(this);
+  ElementStream<Event> get onInvalid => invalidEvent.forElement(this);
 
   @DomName('Element.onkeydown')
   @DocsEditable()
-  Stream<KeyboardEvent> get onKeyDown => keyDownEvent.forTarget(this);
+  ElementStream<KeyboardEvent> get onKeyDown => keyDownEvent.forElement(this);
 
   @DomName('Element.onkeypress')
   @DocsEditable()
-  Stream<KeyboardEvent> get onKeyPress => keyPressEvent.forTarget(this);
+  ElementStream<KeyboardEvent> get onKeyPress => keyPressEvent.forElement(this);
 
   @DomName('Element.onkeyup')
   @DocsEditable()
-  Stream<KeyboardEvent> get onKeyUp => keyUpEvent.forTarget(this);
+  ElementStream<KeyboardEvent> get onKeyUp => keyUpEvent.forElement(this);
 
   @DomName('Element.onload')
   @DocsEditable()
-  Stream<Event> get onLoad => loadEvent.forTarget(this);
+  ElementStream<Event> get onLoad => loadEvent.forElement(this);
 
   @DomName('Element.onmousedown')
   @DocsEditable()
-  Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
+  ElementStream<MouseEvent> get onMouseDown => mouseDownEvent.forElement(this);
+
+  @DomName('Element.onmouseenter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<MouseEvent> get onMouseEnter => mouseEnterEvent.forElement(this);
+
+  @DomName('Element.onmouseleave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  ElementStream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forElement(this);
 
   @DomName('Element.onmousemove')
   @DocsEditable()
-  Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
+  ElementStream<MouseEvent> get onMouseMove => mouseMoveEvent.forElement(this);
 
   @DomName('Element.onmouseout')
   @DocsEditable()
-  Stream<MouseEvent> get onMouseOut => mouseOutEvent.forTarget(this);
+  ElementStream<MouseEvent> get onMouseOut => mouseOutEvent.forElement(this);
 
   @DomName('Element.onmouseover')
   @DocsEditable()
-  Stream<MouseEvent> get onMouseOver => mouseOverEvent.forTarget(this);
+  ElementStream<MouseEvent> get onMouseOver => mouseOverEvent.forElement(this);
 
   @DomName('Element.onmouseup')
   @DocsEditable()
-  Stream<MouseEvent> get onMouseUp => mouseUpEvent.forTarget(this);
+  ElementStream<MouseEvent> get onMouseUp => mouseUpEvent.forElement(this);
 
   @DomName('Element.onmousewheel')
   @DocsEditable()
   // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents
   @Experimental() // non-standard
-  Stream<WheelEvent> get onMouseWheel => mouseWheelEvent.forTarget(this);
+  ElementStream<WheelEvent> get onMouseWheel => mouseWheelEvent.forElement(this);
 
   @DomName('Element.onpaste')
   @DocsEditable()
-  Stream<Event> get onPaste => pasteEvent.forTarget(this);
+  ElementStream<Event> get onPaste => pasteEvent.forElement(this);
 
   @DomName('Element.onreset')
   @DocsEditable()
-  Stream<Event> get onReset => resetEvent.forTarget(this);
+  ElementStream<Event> get onReset => resetEvent.forElement(this);
 
   @DomName('Element.onscroll')
   @DocsEditable()
-  Stream<Event> get onScroll => scrollEvent.forTarget(this);
+  ElementStream<Event> get onScroll => scrollEvent.forElement(this);
 
   @DomName('Element.onsearch')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  Stream<Event> get onSearch => searchEvent.forTarget(this);
+  ElementStream<Event> get onSearch => searchEvent.forElement(this);
 
   @DomName('Element.onselect')
   @DocsEditable()
-  Stream<Event> get onSelect => selectEvent.forTarget(this);
+  ElementStream<Event> get onSelect => selectEvent.forElement(this);
 
   @DomName('Element.onselectstart')
   @DocsEditable()
   @Experimental() // nonstandard
-  Stream<Event> get onSelectStart => selectStartEvent.forTarget(this);
+  ElementStream<Event> get onSelectStart => selectStartEvent.forElement(this);
 
   @DomName('Element.onsubmit')
   @DocsEditable()
-  Stream<Event> get onSubmit => submitEvent.forTarget(this);
+  ElementStream<Event> get onSubmit => submitEvent.forElement(this);
 
   @DomName('Element.ontouchcancel')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchCancel => touchCancelEvent.forTarget(this);
+  ElementStream<TouchEvent> get onTouchCancel => touchCancelEvent.forElement(this);
 
   @DomName('Element.ontouchend')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchEnd => touchEndEvent.forTarget(this);
+  ElementStream<TouchEvent> get onTouchEnd => touchEndEvent.forElement(this);
 
   @DomName('Element.ontouchenter')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchEnter => touchEnterEvent.forTarget(this);
+  ElementStream<TouchEvent> get onTouchEnter => touchEnterEvent.forElement(this);
 
   @DomName('Element.ontouchleave')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchLeave => touchLeaveEvent.forTarget(this);
+  ElementStream<TouchEvent> get onTouchLeave => touchLeaveEvent.forElement(this);
 
   @DomName('Element.ontouchmove')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchMove => touchMoveEvent.forTarget(this);
+  ElementStream<TouchEvent> get onTouchMove => touchMoveEvent.forElement(this);
 
   @DomName('Element.ontouchstart')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Stream<TouchEvent> get onTouchStart => touchStartEvent.forTarget(this);
+  ElementStream<TouchEvent> get onTouchStart => touchStartEvent.forElement(this);
 
   @DomName('Element.ontransitionend')
   @DocsEditable()
@@ -10080,23 +10762,22 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  Stream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forTarget(this);
+  ElementStream<TransitionEvent> get onTransitionEnd => transitionEndEvent.forElement(this);
 
   @DomName('Element.onwebkitfullscreenchange')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
-  Stream<Event> get onFullscreenChange => fullscreenChangeEvent.forTarget(this);
+  ElementStream<Event> get onFullscreenChange => fullscreenChangeEvent.forElement(this);
 
   @DomName('Element.onwebkitfullscreenerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   @Experimental()
-  Stream<Event> get onFullscreenError => fullscreenErrorEvent.forTarget(this);
+  ElementStream<Event> get onFullscreenError => fullscreenErrorEvent.forElement(this);
 
 }
 
-
 final _START_TAG_REGEXP = new RegExp('<(\\w+)');
 class _ElementFactoryProvider {
   static const _CUSTOM_PARENT_TAG_MAP = const {
@@ -10240,35 +10921,6 @@
 
 
 @DocsEditable()
-@DomName('ElementTimeControl')
-@Unstable()
-abstract class ElementTimeControl extends NativeFieldWrapperClass1 {
-
-  @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('HTMLEmbedElement')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.IE)
@@ -10811,17 +11463,17 @@
   @DocsEditable()
   bool get withCredentials native "EventSource_withCredentials_Getter";
 
-  @DomName('EventSource.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_addEventListener_Callback";
-
   @DomName('EventSource.close')
   @DocsEditable()
   void close() native "EventSource_close_Callback";
 
+  @DomName('EventSource.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_addEventListener_Callback";
+
   @DomName('EventSource.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native "EventSource_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) native "EventSource_dispatchEvent_Callback";
 
   @DomName('EventSource.removeEventListener')
   @DocsEditable()
@@ -11143,84 +11795,6 @@
 
 
 @DocsEditable()
-@DomName('FileException')
-// http://dev.w3.org/2009/dap/file-system/pub/FileSystem/
-@Experimental()
-class FileException extends NativeFieldWrapperClass1 {
-
-  @DomName('FileException.ABORT_ERR')
-  @DocsEditable()
-  static const int ABORT_ERR = 3;
-
-  @DomName('FileException.ENCODING_ERR')
-  @DocsEditable()
-  static const int ENCODING_ERR = 5;
-
-  @DomName('FileException.INVALID_MODIFICATION_ERR')
-  @DocsEditable()
-  static const int INVALID_MODIFICATION_ERR = 9;
-
-  @DomName('FileException.INVALID_STATE_ERR')
-  @DocsEditable()
-  static const int INVALID_STATE_ERR = 7;
-
-  @DomName('FileException.NOT_FOUND_ERR')
-  @DocsEditable()
-  static const int NOT_FOUND_ERR = 1;
-
-  @DomName('FileException.NOT_READABLE_ERR')
-  @DocsEditable()
-  static const int NOT_READABLE_ERR = 4;
-
-  @DomName('FileException.NO_MODIFICATION_ALLOWED_ERR')
-  @DocsEditable()
-  static const int NO_MODIFICATION_ALLOWED_ERR = 6;
-
-  @DomName('FileException.PATH_EXISTS_ERR')
-  @DocsEditable()
-  static const int PATH_EXISTS_ERR = 12;
-
-  @DomName('FileException.QUOTA_EXCEEDED_ERR')
-  @DocsEditable()
-  static const int QUOTA_EXCEEDED_ERR = 10;
-
-  @DomName('FileException.SECURITY_ERR')
-  @DocsEditable()
-  static const int SECURITY_ERR = 2;
-
-  @DomName('FileException.SYNTAX_ERR')
-  @DocsEditable()
-  static const int SYNTAX_ERR = 8;
-
-  @DomName('FileException.TYPE_MISMATCH_ERR')
-  @DocsEditable()
-  static const int TYPE_MISMATCH_ERR = 11;
-
-  @DomName('FileException.code')
-  @DocsEditable()
-  int get code native "FileException_code_Getter";
-
-  @DomName('FileException.message')
-  @DocsEditable()
-  String get message native "FileException_message_Getter";
-
-  @DomName('FileException.name')
-  @DocsEditable()
-  String get name native "FileException_name_Getter";
-
-  @DomName('FileException.toString')
-  @DocsEditable()
-  String toString() native "FileException_toString_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('FileList')
 class FileList extends NativeFieldWrapperClass1 with ListMixin<File>, ImmutableListMixin<File> implements List<File> {
 
@@ -11352,14 +11926,6 @@
   @DocsEditable()
   void abort() native "FileReader_abort_Callback";
 
-  @DomName('FileReader.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_addEventListener_Callback";
-
-  @DomName('FileReader.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native "FileReader_dispatchEvent_Callback";
-
   @DomName('FileReader.readAsArrayBuffer')
   @DocsEditable()
   void readAsArrayBuffer(Blob blob) native "FileReader_readAsArrayBuffer_Callback";
@@ -11387,6 +11953,14 @@
 
   void _readAsText_2(blob) native "FileReader__readAsText_2_Callback";
 
+  @DomName('FileReader.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_addEventListener_Callback";
+
+  @DomName('FileReader.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "FileReader_dispatchEvent_Callback";
+
   @DomName('FileReader.removeEventListener')
   @DocsEditable()
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_removeEventListener_Callback";
@@ -11542,18 +12116,6 @@
   @DocsEditable()
   void abort() native "FileWriter_abort_Callback";
 
-  @DomName('FileWriter.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_addEventListener_Callback";
-
-  @DomName('FileWriter.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native "FileWriter_dispatchEvent_Callback";
-
-  @DomName('FileWriter.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_removeEventListener_Callback";
-
   @DomName('FileWriter.seek')
   @DocsEditable()
   void seek(int position) native "FileWriter_seek_Callback";
@@ -11566,6 +12128,18 @@
   @DocsEditable()
   void write(Blob data) native "FileWriter_write_Callback";
 
+  @DomName('FileWriter.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_addEventListener_Callback";
+
+  @DomName('FileWriter.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "FileWriter_dispatchEvent_Callback";
+
+  @DomName('FileWriter.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_removeEventListener_Callback";
+
   @DomName('FileWriter.onabort')
   @DocsEditable()
   Stream<ProgressEvent> get onAbort => abortEvent.forTarget(this);
@@ -11659,18 +12233,10 @@
   @DocsEditable()
   bool get loading native "FontLoader_loading_Getter";
 
-  @DomName('FontLoader.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FontLoader_addEventListener_Callback";
-
   @DomName('FontLoader.checkFont')
   @DocsEditable()
   bool checkFont(String font, String text) native "FontLoader_checkFont_Callback";
 
-  @DomName('FontLoader.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native "FontLoader_dispatchEvent_Callback";
-
   @DomName('FontLoader.loadFont')
   @DocsEditable()
   void loadFont(Map params) native "FontLoader_loadFont_Callback";
@@ -11679,6 +12245,14 @@
   @DocsEditable()
   void notifyWhenFontsReady(VoidCallback callback) native "FontLoader_notifyWhenFontsReady_Callback";
 
+  @DomName('FontLoader.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FontLoader_addEventListener_Callback";
+
+  @DomName('FontLoader.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "FontLoader_dispatchEvent_Callback";
+
   @DomName('FontLoader.removeEventListener')
   @DocsEditable()
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "FontLoader_removeEventListener_Callback";
@@ -11873,13 +12447,13 @@
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
-  Stream<Event> get onAutocomplete => autocompleteEvent.forTarget(this);
+  ElementStream<Event> get onAutocomplete => autocompleteEvent.forElement(this);
 
   @DomName('HTMLFormElement.onautocompleteerror')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
-  Stream<AutocompleteErrorEvent> get onAutocompleteError => autocompleteErrorEvent.forTarget(this);
+  ElementStream<AutocompleteErrorEvent> get onAutocompleteError => autocompleteErrorEvent.forElement(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12211,6 +12785,26 @@
 
 
 @DocsEditable()
+@DomName('HmacParams')
+@Experimental() // untriaged
+class HmacParams extends Algorithm {
+  // To suppress missing implicit constructor warnings.
+  factory HmacParams._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('HmacParams.hash')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Algorithm get hash native "HmacParams_hash_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('HTMLAllCollection')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dom-document-all
 @deprecated // deprecated
@@ -12631,6 +13225,40 @@
   }
 
   /**
+   * Makes a server POST request with the specified data encoded as form data.
+   *
+   * This is similar to sending a FormData object with broader browser
+   * support but limited to string values.
+   *
+   * See also:
+   *
+   * * [request]
+   */
+  static Future<HttpRequest> postFormData(String url, Map<String, String> data,
+      {bool withCredentials, String responseType,
+      Map<String, String> requestHeaders,
+      void onProgress(ProgressEvent e)}) {
+
+    var parts = [];
+    data.forEach((key, value) {
+      parts.add('${Uri.encodeQueryComponent(key)}='
+          '${Uri.encodeQueryComponent(value)}');
+    });
+    var formData = parts.join('&');
+
+    if (requestHeaders == null) {
+      requestHeaders = <String, String>{};
+    }
+    requestHeaders.putIfAbsent('Content-Type',
+        () => 'application/x-www-form-urlencoded; charset=UTF-8');
+
+    return request(url, method: 'POST', withCredentials: withCredentials,
+        responseType: responseType,
+        requestHeaders: requestHeaders, sendData: formData,
+        onProgress: onProgress);
+  }
+
+  /**
    * Creates a URL request for the specified [url].
    *
    * By default this will do an HTTP GET request, this can be overridden with
@@ -12784,7 +13412,7 @@
    *
    *     var request = new HttpRequest();
    *     request.open('GET', 'http://dartlang.org')
-   *     request.onLoad.add((event) => print('Request complete'));
+   *     request.onLoad.listen((event) => print('Request complete'));
    *
    * is the (more verbose) equivalent of
    *
@@ -12981,14 +13609,6 @@
   @DocsEditable()
   void abort() native "XMLHttpRequest_abort_Callback";
 
-  @DomName('XMLHttpRequest.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_addEventListener_Callback";
-
-  @DomName('XMLHttpRequest.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native "XMLHttpRequest_dispatchEvent_Callback";
-
   /**
    * Retrieve all the response headers from a request.
    *
@@ -13043,10 +13663,6 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   void overrideMimeType(String override) native "XMLHttpRequest_overrideMimeType_Callback";
 
-  @DomName('XMLHttpRequest.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_removeEventListener_Callback";
-
   /**
    * Send the request with any given `data`.
    *
@@ -13063,6 +13679,18 @@
   @DocsEditable()
   void setRequestHeader(String header, String value) native "XMLHttpRequest_setRequestHeader_Callback";
 
+  @DomName('XMLHttpRequest.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_addEventListener_Callback";
+
+  @DomName('XMLHttpRequest.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "XMLHttpRequest_dispatchEvent_Callback";
+
+  @DomName('XMLHttpRequest.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_removeEventListener_Callback";
+
   /**
    * Event listeners to be notified when request has been aborted,
    * generally due to calling `httpRequest.abort()`.
@@ -13205,7 +13833,7 @@
 
   @DomName('XMLHttpRequestUpload.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native "XMLHttpRequestUpload_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) native "XMLHttpRequestUpload_dispatchEvent_Callback";
 
   @DomName('XMLHttpRequestUpload.removeEventListener')
   @DocsEditable()
@@ -13314,6 +13942,39 @@
   void set width(String value) native "HTMLIFrameElement_width_Setter";
 
 }
+// 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('ImageBitmap')
+@Experimental() // untriaged
+class ImageBitmap extends NativeFieldWrapperClass1 {
+
+  @DomName('ImageBitmap.height')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get height native "ImageBitmap_height_Getter";
+
+  @DomName('ImageBitmap.width')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get width native "ImageBitmap_width_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DomName('ImageBitmapCallback')
+@Experimental() // untriaged
+typedef void ImageBitmapCallback(ImageBitmap bitmap);
 // 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.
@@ -13666,6 +14327,16 @@
   @DocsEditable()
   void set indeterminate(bool value) native "HTMLInputElement_indeterminate_Setter";
 
+  @DomName('HTMLInputElement.inputMode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get inputMode native "HTMLInputElement_inputMode_Getter";
+
+  @DomName('HTMLInputElement.inputMode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set inputMode(String value) native "HTMLInputElement_inputMode_Setter";
+
   @DomName('HTMLInputElement.labels')
   @DocsEditable()
   List<Node> get labels native "HTMLInputElement_labels_Getter";
@@ -13985,7 +14656,7 @@
   @DocsEditable()
   // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#extending_html_elements
   @Experimental()
-  Stream<Event> get onSpeechChange => speechChangeEvent.forTarget(this);
+  ElementStream<Event> get onSpeechChange => speechChangeEvent.forElement(this);
 
 }
 
@@ -14561,26 +15232,19 @@
   @DocsEditable()
   Composition get composition native "InputMethodContext_composition_Getter";
 
-  @DomName('InputMethodContext.enabled')
-  @DocsEditable()
-  bool get enabled native "InputMethodContext_enabled_Getter";
-
-  @DomName('InputMethodContext.enabled')
-  @DocsEditable()
-  void set enabled(bool value) native "InputMethodContext_enabled_Setter";
-
   @DomName('InputMethodContext.locale')
   @DocsEditable()
   String get locale native "InputMethodContext_locale_Getter";
 
+  @DomName('InputMethodContext.target')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Element get target native "InputMethodContext_target_Getter";
+
   @DomName('InputMethodContext.confirmComposition')
   @DocsEditable()
   void confirmComposition() native "InputMethodContext_confirmComposition_Callback";
 
-  @DomName('InputMethodContext.open')
-  @DocsEditable()
-  bool open() native "InputMethodContext_open_Callback";
-
   @DomName('InputMethodContext.setCaretRectangle')
   @DocsEditable()
   void setCaretRectangle(Node anchor, int x, int y, int w, int h) native "InputMethodContext_setCaretRectangle_Callback";
@@ -14594,6 +15258,39 @@
 // 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('Key')
+@Experimental() // untriaged
+class Key extends NativeFieldWrapperClass1 {
+
+  @DomName('Key.algorithm')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Algorithm get algorithm native "Key_algorithm_Getter";
+
+  @DomName('Key.extractable')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool get extractable native "Key_extractable_Getter";
+
+  @DomName('Key.type')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get type native "Key_type_Getter";
+
+  @DomName('Key.usages')
+  @DocsEditable()
+  @Experimental() // untriaged
+  List<String> get usages native "Key_usages_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 
 @DomName('KeyboardEvent')
 class KeyboardEvent extends UIEvent {
@@ -15054,7 +15751,7 @@
 
 @DomName('MIDISuccessCallback')
 @Experimental() // untriaged
-typedef void MidiSuccessCallback(MidiAccess access, bool sysexEnabled);
+typedef void MidiSuccessCallback(MidiAccess access, bool sysex);
 // 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.
@@ -15173,14 +15870,6 @@
   @DocsEditable()
   void set volume(num value) native "MediaController_volume_Setter";
 
-  @DomName('MediaController.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_addEventListener_Callback";
-
-  @DomName('MediaController.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native "MediaController_dispatchEvent_Callback";
-
   @DomName('MediaController.pause')
   @DocsEditable()
   void pause() native "MediaController_pause_Callback";
@@ -15189,14 +15878,22 @@
   @DocsEditable()
   void play() native "MediaController_play_Callback";
 
-  @DomName('MediaController.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_removeEventListener_Callback";
-
   @DomName('MediaController.unpause')
   @DocsEditable()
   void unpause() native "MediaController_unpause_Callback";
 
+  @DomName('MediaController.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_addEventListener_Callback";
+
+  @DomName('MediaController.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "MediaController_dispatchEvent_Callback";
+
+  @DomName('MediaController.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_removeEventListener_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
@@ -15668,113 +16365,113 @@
 
   @DomName('HTMLMediaElement.oncanplay')
   @DocsEditable()
-  Stream<Event> get onCanPlay => canPlayEvent.forTarget(this);
+  ElementStream<Event> get onCanPlay => canPlayEvent.forElement(this);
 
   @DomName('HTMLMediaElement.oncanplaythrough')
   @DocsEditable()
-  Stream<Event> get onCanPlayThrough => canPlayThroughEvent.forTarget(this);
+  ElementStream<Event> get onCanPlayThrough => canPlayThroughEvent.forElement(this);
 
   @DomName('HTMLMediaElement.ondurationchange')
   @DocsEditable()
-  Stream<Event> get onDurationChange => durationChangeEvent.forTarget(this);
+  ElementStream<Event> get onDurationChange => durationChangeEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onemptied')
   @DocsEditable()
-  Stream<Event> get onEmptied => emptiedEvent.forTarget(this);
+  ElementStream<Event> get onEmptied => emptiedEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onended')
   @DocsEditable()
-  Stream<Event> get onEnded => endedEvent.forTarget(this);
+  ElementStream<Event> get onEnded => endedEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onloadeddata')
   @DocsEditable()
-  Stream<Event> get onLoadedData => loadedDataEvent.forTarget(this);
+  ElementStream<Event> get onLoadedData => loadedDataEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onloadedmetadata')
   @DocsEditable()
-  Stream<Event> get onLoadedMetadata => loadedMetadataEvent.forTarget(this);
+  ElementStream<Event> get onLoadedMetadata => loadedMetadataEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onloadstart')
   @DocsEditable()
-  Stream<Event> get onLoadStart => loadStartEvent.forTarget(this);
+  ElementStream<Event> get onLoadStart => loadStartEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onpause')
   @DocsEditable()
-  Stream<Event> get onPause => pauseEvent.forTarget(this);
+  ElementStream<Event> get onPause => pauseEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onplay')
   @DocsEditable()
-  Stream<Event> get onPlay => playEvent.forTarget(this);
+  ElementStream<Event> get onPlay => playEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onplaying')
   @DocsEditable()
-  Stream<Event> get onPlaying => playingEvent.forTarget(this);
+  ElementStream<Event> get onPlaying => playingEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onprogress')
   @DocsEditable()
-  Stream<Event> get onProgress => progressEvent.forTarget(this);
+  ElementStream<Event> get onProgress => progressEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onratechange')
   @DocsEditable()
-  Stream<Event> get onRateChange => rateChangeEvent.forTarget(this);
+  ElementStream<Event> get onRateChange => rateChangeEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onseeked')
   @DocsEditable()
-  Stream<Event> get onSeeked => seekedEvent.forTarget(this);
+  ElementStream<Event> get onSeeked => seekedEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onseeking')
   @DocsEditable()
-  Stream<Event> get onSeeking => seekingEvent.forTarget(this);
+  ElementStream<Event> get onSeeking => seekingEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onshow')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#event-media-loadstart
   @Experimental()
-  Stream<Event> get onShow => showEvent.forTarget(this);
+  ElementStream<Event> get onShow => showEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onstalled')
   @DocsEditable()
-  Stream<Event> get onStalled => stalledEvent.forTarget(this);
+  ElementStream<Event> get onStalled => stalledEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onsuspend')
   @DocsEditable()
-  Stream<Event> get onSuspend => suspendEvent.forTarget(this);
+  ElementStream<Event> get onSuspend => suspendEvent.forElement(this);
 
   @DomName('HTMLMediaElement.ontimeupdate')
   @DocsEditable()
-  Stream<Event> get onTimeUpdate => timeUpdateEvent.forTarget(this);
+  ElementStream<Event> get onTimeUpdate => timeUpdateEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onvolumechange')
   @DocsEditable()
-  Stream<Event> get onVolumeChange => volumeChangeEvent.forTarget(this);
+  ElementStream<Event> get onVolumeChange => volumeChangeEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onwaiting')
   @DocsEditable()
-  Stream<Event> get onWaiting => waitingEvent.forTarget(this);
+  ElementStream<Event> get onWaiting => waitingEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onwebkitkeyadded')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
-  Stream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forTarget(this);
+  ElementStream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onwebkitkeyerror')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
-  Stream<MediaKeyEvent> get onKeyError => keyErrorEvent.forTarget(this);
+  ElementStream<MediaKeyEvent> get onKeyError => keyErrorEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onwebkitkeymessage')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
-  Stream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forTarget(this);
+  ElementStream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.forElement(this);
 
   @DomName('HTMLMediaElement.onwebkitneedkey')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
-  Stream<MediaKeyEvent> get onNeedKey => needKeyEvent.forTarget(this);
+  ElementStream<MediaKeyEvent> get onNeedKey => needKeyEvent.forElement(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15999,26 +16696,26 @@
   @DocsEditable()
   String get sessionId native "MediaKeySession_sessionId_Getter";
 
-  @DomName('MediaKeySession.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaKeySession_addEventListener_Callback";
-
   @DomName('MediaKeySession.close')
   @DocsEditable()
   void close() native "MediaKeySession_close_Callback";
 
+  @DomName('MediaKeySession.update')
+  @DocsEditable()
+  void update(Uint8List key) native "MediaKeySession_update_Callback";
+
+  @DomName('MediaKeySession.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaKeySession_addEventListener_Callback";
+
   @DomName('MediaKeySession.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native "MediaKeySession_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) native "MediaKeySession_dispatchEvent_Callback";
 
   @DomName('MediaKeySession.removeEventListener')
   @DocsEditable()
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaKeySession_removeEventListener_Callback";
 
-  @DomName('MediaKeySession.update')
-  @DocsEditable()
-  void update(Uint8List key) native "MediaKeySession_update_Callback";
-
   @DomName('MediaKeySession.onwebkitkeyadded')
   @DocsEditable()
   Stream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forTarget(this);
@@ -16190,18 +16887,10 @@
   @DocsEditable()
   SourceBufferList get sourceBuffers native "MediaSource_sourceBuffers_Getter";
 
-  @DomName('MediaSource.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_addEventListener_Callback";
-
   @DomName('MediaSource.addSourceBuffer')
   @DocsEditable()
   SourceBuffer addSourceBuffer(String type) native "MediaSource_addSourceBuffer_Callback";
 
-  @DomName('MediaSource.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native "MediaSource_dispatchEvent_Callback";
-
   @DomName('MediaSource.endOfStream')
   @DocsEditable()
   void endOfStream(String error) native "MediaSource_endOfStream_Callback";
@@ -16210,14 +16899,22 @@
   @DocsEditable()
   static bool isTypeSupported(String type) native "MediaSource_isTypeSupported_Callback";
 
-  @DomName('MediaSource.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_removeEventListener_Callback";
-
   @DomName('MediaSource.removeSourceBuffer')
   @DocsEditable()
   void removeSourceBuffer(SourceBuffer buffer) native "MediaSource_removeSourceBuffer_Callback";
 
+  @DomName('MediaSource.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_addEventListener_Callback";
+
+  @DomName('MediaSource.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "MediaSource_dispatchEvent_Callback";
+
+  @DomName('MediaSource.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_removeEventListener_Callback";
+
 }
 // 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
@@ -16281,18 +16978,10 @@
   @Experimental() // non-standard
   String get label native "MediaStream_label_Getter";
 
-  @DomName('MediaStream.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_addEventListener_Callback";
-
   @DomName('MediaStream.addTrack')
   @DocsEditable()
   void addTrack(MediaStreamTrack track) native "MediaStream_addTrack_Callback";
 
-  @DomName('MediaStream.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native "MediaStream_dispatchEvent_Callback";
-
   @DomName('MediaStream.getAudioTracks')
   @DocsEditable()
   List<MediaStreamTrack> getAudioTracks() native "MediaStream_getAudioTracks_Callback";
@@ -16305,10 +16994,6 @@
   @DocsEditable()
   List<MediaStreamTrack> getVideoTracks() native "MediaStream_getVideoTracks_Callback";
 
-  @DomName('MediaStream.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_removeEventListener_Callback";
-
   @DomName('MediaStream.removeTrack')
   @DocsEditable()
   void removeTrack(MediaStreamTrack track) native "MediaStream_removeTrack_Callback";
@@ -16317,6 +17002,18 @@
   @DocsEditable()
   void stop() native "MediaStream_stop_Callback";
 
+  @DomName('MediaStream.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_addEventListener_Callback";
+
+  @DomName('MediaStream.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "MediaStream_dispatchEvent_Callback";
+
+  @DomName('MediaStream.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_removeEventListener_Callback";
+
   @DomName('MediaStream.onaddtrack')
   @DocsEditable()
   Stream<Event> get onAddTrack => addTrackEvent.forTarget(this);
@@ -16415,6 +17112,11 @@
   @DocsEditable()
   String get readyState native "MediaStreamTrack_readyState_Getter";
 
+  @DomName('MediaStreamTrack.getSources')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static void getSources(MediaStreamTrackSourcesCallback callback) native "MediaStreamTrack_getSources_Callback";
+
   @DomName('MediaStreamTrack.addEventListener')
   @DocsEditable()
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_addEventListener_Callback";
@@ -16423,11 +17125,6 @@
   @DocsEditable()
   bool dispatchEvent(Event event) native "MediaStreamTrack_dispatchEvent_Callback";
 
-  @DomName('MediaStreamTrack.getSources')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static void getSources(MediaStreamTrackSourcesCallback callback) native "MediaStreamTrack_getSources_Callback";
-
   @DomName('MediaStreamTrack.removeEventListener')
   @DocsEditable()
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_removeEventListener_Callback";
@@ -16629,30 +17326,30 @@
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
-  @DomName('MessagePort.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_addEventListener_Callback";
-
   @DomName('MessagePort.close')
   @DocsEditable()
   void close() native "MessagePort_close_Callback";
 
-  @DomName('MessagePort.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native "MessagePort_dispatchEvent_Callback";
-
   @DomName('MessagePort.postMessage')
   @DocsEditable()
   void postMessage(Object message, [List messagePorts]) native "MessagePort_postMessage_Callback";
 
-  @DomName('MessagePort.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_removeEventListener_Callback";
-
   @DomName('MessagePort.start')
   @DocsEditable()
   void start() native "MessagePort_start_Callback";
 
+  @DomName('MessagePort.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_addEventListener_Callback";
+
+  @DomName('MessagePort.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "MessagePort_dispatchEvent_Callback";
+
+  @DomName('MessagePort.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_removeEventListener_Callback";
+
   @DomName('MessagePort.onmessage')
   @DocsEditable()
   Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
@@ -16834,14 +17531,6 @@
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
 
-  @DomName('MIDIAccess.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIAccess_addEventListener_Callback";
-
-  @DomName('MIDIAccess.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native "MIDIAccess_dispatchEvent_Callback";
-
   @DomName('MIDIAccess.inputs')
   @DocsEditable()
   List<MidiInput> inputs() native "MIDIAccess_inputs_Callback";
@@ -16850,6 +17539,14 @@
   @DocsEditable()
   List<MidiOutput> outputs() native "MIDIAccess_outputs_Callback";
 
+  @DomName('MIDIAccess.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIAccess_addEventListener_Callback";
+
+  @DomName('MIDIAccess.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "MIDIAccess_dispatchEvent_Callback";
+
   @DomName('MIDIAccess.removeEventListener')
   @DocsEditable()
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIAccess_removeEventListener_Callback";
@@ -16912,7 +17609,7 @@
 @DomName('MIDIInput')
 // http://webaudio.github.io/web-midi-api/#idl-def-MIDIInput
 @Experimental()
-class MidiInput extends MidiPort implements EventTarget {
+class MidiInput extends MidiPort {
   // To suppress missing implicit constructor warnings.
   factory MidiInput._() { throw new UnsupportedError("Not supported"); }
 
@@ -17554,14 +18251,6 @@
   @DocsEditable()
   bool get overset native "WebKitNamedFlow_overset_Getter";
 
-  @DomName('WebKitNamedFlow.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_addEventListener_Callback";
-
-  @DomName('WebKitNamedFlow.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native "WebKitNamedFlow_dispatchEvent_Callback";
-
   @DomName('WebKitNamedFlow.getContent')
   @DocsEditable()
   List<Node> getContent() native "WebKitNamedFlow_getContent_Callback";
@@ -17574,6 +18263,14 @@
   @DocsEditable()
   List<Node> getRegionsByContent(Node contentNode) native "WebKitNamedFlow_getRegionsByContent_Callback";
 
+  @DomName('WebKitNamedFlow.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_addEventListener_Callback";
+
+  @DomName('WebKitNamedFlow.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "WebKitNamedFlow_dispatchEvent_Callback";
+
   @DomName('WebKitNamedFlow.removeEventListener')
   @DocsEditable()
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_removeEventListener_Callback";
@@ -18267,10 +18964,6 @@
   @DocsEditable()
   void set text(String value) native "Node_textContent_Setter";
 
-  @DomName('Node.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Node_addEventListener_Callback";
-
   /**
    * Adds a node to the end of the child [nodes] list of this node.
    *
@@ -18292,10 +18985,6 @@
   @DocsEditable()
   bool contains(Node other) native "Node_contains_Callback";
 
-  @DomName('Node.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native "Node_dispatchEvent_Callback";
-
   @DomName('Node.hasChildNodes')
   @DocsEditable()
   bool hasChildNodes() native "Node_hasChildNodes_Callback";
@@ -18308,14 +18997,22 @@
   @DocsEditable()
   Node $dom_removeChild(Node oldChild) native "Node_removeChild_Callback";
 
-  @DomName('Node.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Node_removeEventListener_Callback";
-
   @DomName('Node.replaceChild')
   @DocsEditable()
   Node $dom_replaceChild(Node newChild, Node oldChild) native "Node_replaceChild_Callback";
 
+  @DomName('Node.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Node_addEventListener_Callback";
+
+  @DomName('Node.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "Node_dispatchEvent_Callback";
+
+  @DomName('Node.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Node_removeEventListener_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
@@ -18618,10 +19315,6 @@
   @Experimental() // nonstandard
   void set tag(String value) native "Notification_tag_Setter";
 
-  @DomName('Notification.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_addEventListener_Callback";
-
   @DomName('Notification.cancel')
   @DocsEditable()
   @Experimental() // nonstandard
@@ -18631,14 +19324,6 @@
   @DocsEditable()
   void close() native "Notification_close_Callback";
 
-  @DomName('Notification.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native "Notification_dispatchEvent_Callback";
-
-  @DomName('Notification.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_removeEventListener_Callback";
-
   @DomName('Notification.requestPermission')
   @DocsEditable()
   static void _requestPermission([_NotificationPermissionCallback callback]) native "Notification_requestPermission_Callback";
@@ -18655,6 +19340,18 @@
   @Experimental() // nonstandard
   void show() native "Notification_show_Callback";
 
+  @DomName('Notification.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_addEventListener_Callback";
+
+  @DomName('Notification.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "Notification_dispatchEvent_Callback";
+
+  @DomName('Notification.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_removeEventListener_Callback";
+
   @DomName('Notification.onclick')
   @DocsEditable()
   Stream<Event> get onClick => clickEvent.forTarget(this);
@@ -19307,17 +20004,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.IE)
-class Performance extends EventTarget {
-  // To suppress missing implicit constructor warnings.
-  factory Performance._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('Performance.webkitresourcetimingbufferfullEvent')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
-  static const EventStreamProvider<Event> resourceTimingBufferFullEvent = const EventStreamProvider<Event>('webkitresourcetimingbufferfull');
+class Performance extends NativeFieldWrapperClass1 {
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
@@ -19397,12 +20084,6 @@
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
   void setResourceTimingBufferSize(int maxSize) native "Performance_webkitSetResourceTimingBufferSize_Callback";
 
-  @DomName('Performance.onwebkitresourcetimingbufferfull')
-  @DocsEditable()
-  // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
-  @Experimental()
-  Stream<Event> get onResourceTimingBufferFull => resourceTimingBufferFullEvent.forTarget(this);
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -20011,6 +20692,36 @@
 @Experimental() // untriaged
 class Promise extends NativeFieldWrapperClass1 {
 
+  @DomName('Promise._any')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Promise _any(Object values) native "Promise__any_Callback";
+
+  @DomName('Promise.every')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Promise every(Object values) native "Promise_every_Callback";
+
+  @DomName('Promise.fulfill')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Promise fulfill(Object value) native "Promise_fulfill_Callback";
+
+  @DomName('Promise.reject')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Promise reject(Object value) native "Promise_reject_Callback";
+
+  @DomName('Promise.resolve')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Promise resolve(Object value) native "Promise_resolve_Callback";
+
+  @DomName('Promise.some')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static Promise some(Object values) native "Promise_some_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
@@ -20024,6 +20735,21 @@
 @Experimental() // untriaged
 class PromiseResolver extends NativeFieldWrapperClass1 {
 
+  @DomName('PromiseResolver.fulfill')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void fulfill([Object value]) native "PromiseResolver_fulfill_Callback";
+
+  @DomName('PromiseResolver.reject')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void reject([Object value]) native "PromiseResolver_reject_Callback";
+
+  @DomName('PromiseResolver.resolve')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void resolve([Object value]) native "PromiseResolver_resolve_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
@@ -20356,22 +21082,10 @@
   @DocsEditable()
   bool get reliable native "RTCDataChannel_reliable_Getter";
 
-  @DomName('RTCDataChannel.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_addEventListener_Callback";
-
   @DomName('RTCDataChannel.close')
   @DocsEditable()
   void close() native "RTCDataChannel_close_Callback";
 
-  @DomName('RTCDataChannel.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native "RTCDataChannel_dispatchEvent_Callback";
-
-  @DomName('RTCDataChannel.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_removeEventListener_Callback";
-
   void send(data) {
     if ((data is TypedData || data == null)) {
       _send_1(data);
@@ -20416,6 +21130,18 @@
   @DocsEditable()
   void sendTypedData(TypedData data) native "RTCDataChannel_sendTypedData_Callback";
 
+  @DomName('RTCDataChannel.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_addEventListener_Callback";
+
+  @DomName('RTCDataChannel.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "RTCDataChannel_dispatchEvent_Callback";
+
+  @DomName('RTCDataChannel.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_removeEventListener_Callback";
+
   @DomName('RTCDataChannel.onclose')
   @DocsEditable()
   Stream<Event> get onClose => closeEvent.forTarget(this);
@@ -20492,14 +21218,6 @@
   @DocsEditable()
   MediaStreamTrack get track native "RTCDTMFSender_track_Getter";
 
-  @DomName('RTCDTMFSender.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDTMFSender_addEventListener_Callback";
-
-  @DomName('RTCDTMFSender.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native "RTCDTMFSender_dispatchEvent_Callback";
-
   void insertDtmf(String tones, [int duration, int interToneGap]) {
     if (interToneGap != null) {
       _insertDTMF_1(tones, duration, interToneGap);
@@ -20519,6 +21237,14 @@
 
   void _insertDTMF_3(tones) native "RTCDTMFSender__insertDTMF_3_Callback";
 
+  @DomName('RTCDTMFSender.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDTMFSender_addEventListener_Callback";
+
+  @DomName('RTCDTMFSender.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "RTCDTMFSender_dispatchEvent_Callback";
+
   @DomName('RTCDTMFSender.removeEventListener')
   @DocsEditable()
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDTMFSender_removeEventListener_Callback";
@@ -20695,10 +21421,6 @@
   @DocsEditable()
   String get signalingState native "RTCPeerConnection_signalingState_Getter";
 
-  @DomName('RTCPeerConnection.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_addEventListener_Callback";
-
   @DomName('RTCPeerConnection.addIceCandidate')
   @DocsEditable()
   void addIceCandidate(RtcIceCandidate candidate) native "RTCPeerConnection_addIceCandidate_Callback";
@@ -20727,10 +21449,6 @@
   @DocsEditable()
   void _createOffer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createOffer_Callback";
 
-  @DomName('RTCPeerConnection.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event event) native "RTCPeerConnection_dispatchEvent_Callback";
-
   @DomName('RTCPeerConnection.getLocalStreams')
   @DocsEditable()
   List<MediaStream> getLocalStreams() native "RTCPeerConnection_getLocalStreams_Callback";
@@ -20747,10 +21465,6 @@
   @DocsEditable()
   MediaStream getStreamById(String streamId) native "RTCPeerConnection_getStreamById_Callback";
 
-  @DomName('RTCPeerConnection.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_removeEventListener_Callback";
-
   @DomName('RTCPeerConnection.removeStream')
   @DocsEditable()
   void removeStream(MediaStream stream) native "RTCPeerConnection_removeStream_Callback";
@@ -20783,6 +21497,18 @@
   @DocsEditable()
   void updateIce([Map configuration, Map mediaConstraints]) native "RTCPeerConnection_updateIce_Callback";
 
+  @DomName('RTCPeerConnection.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_addEventListener_Callback";
+
+  @DomName('RTCPeerConnection.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "RTCPeerConnection_dispatchEvent_Callback";
+
+  @DomName('RTCPeerConnection.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_removeEventListener_Callback";
+
   @DomName('RTCPeerConnection.onaddstream')
   @DocsEditable()
   Stream<MediaStreamEvent> get onAddStream => addStreamEvent.forTarget(this);
@@ -21197,6 +21923,11 @@
   @DocsEditable()
   String get sourceFile native "SecurityPolicyViolationEvent_sourceFile_Getter";
 
+  @DomName('SecurityPolicyViolationEvent.statusCode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get statusCode native "SecurityPolicyViolationEvent_statusCode_Getter";
+
   @DomName('SecurityPolicyViolationEvent.violatedDirective')
   @DocsEditable()
   String get violatedDirective native "SecurityPolicyViolationEvent_violatedDirective_Getter";
@@ -21596,6 +22327,26 @@
 
 
 @DocsEditable()
+@DomName('SharedWorkerGlobalScope')
+@Experimental() // untriaged
+class SharedWorkerGlobalScope extends WorkerGlobalScope {
+  // To suppress missing implicit constructor warnings.
+  factory SharedWorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('SharedWorkerGlobalScope.name')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get name native "SharedWorkerGlobalScope_name_Getter";
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('SourceBuffer')
 // https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebuffer
 @Experimental()
@@ -21624,27 +22375,21 @@
   @DocsEditable()
   void abort() native "SourceBuffer_abort_Callback";
 
+  @DomName('SourceBuffer.appendBuffer')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void appendBuffer(ByteBuffer data) native "SourceBuffer_appendBuffer_Callback";
+
+  @DomName('SourceBuffer.appendBufferView')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void appendBufferView(TypedData data) native "SourceBuffer_appendBufferView_Callback";
+
   @DomName('SourceBuffer.addEventListener')
   @DocsEditable()
   @Experimental() // untriaged
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBuffer_addEventListener_Callback";
 
-  void appendBuffer(data) {
-    if ((data is TypedData || data == null)) {
-      _appendBuffer_1(data);
-      return;
-    }
-    if ((data is ByteBuffer || data == null)) {
-      _appendBuffer_2(data);
-      return;
-    }
-    throw new ArgumentError("Incorrect number or type of arguments");
-  }
-
-  void _appendBuffer_1(data) native "SourceBuffer__appendBuffer_1_Callback";
-
-  void _appendBuffer_2(data) native "SourceBuffer__appendBuffer_2_Callback";
-
   @DomName('SourceBuffer.dispatchEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -21720,6 +22465,10 @@
   SourceBuffer elementAt(int index) => this[index];
   // -- end List<SourceBuffer> mixins.
 
+  @DomName('SourceBufferList.item')
+  @DocsEditable()
+  SourceBuffer item(int index) native "SourceBufferList_item_Callback";
+
   @DomName('SourceBufferList.addEventListener')
   @DocsEditable()
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_addEventListener_Callback";
@@ -21728,10 +22477,6 @@
   @DocsEditable()
   bool dispatchEvent(Event event) native "SourceBufferList_dispatchEvent_Callback";
 
-  @DomName('SourceBufferList.item')
-  @DocsEditable()
-  SourceBuffer item(int index) native "SourceBufferList_item_Callback";
-
   @DomName('SourceBufferList.removeEventListener')
   @DocsEditable()
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_removeEventListener_Callback";
@@ -22129,18 +22874,6 @@
   @DocsEditable()
   void abort() native "SpeechRecognition_abort_Callback";
 
-  @DomName('SpeechRecognition.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_addEventListener_Callback";
-
-  @DomName('SpeechRecognition.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native "SpeechRecognition_dispatchEvent_Callback";
-
-  @DomName('SpeechRecognition.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_removeEventListener_Callback";
-
   @DomName('SpeechRecognition.start')
   @DocsEditable()
   void start() native "SpeechRecognition_start_Callback";
@@ -22149,6 +22882,18 @@
   @DocsEditable()
   void stop() native "SpeechRecognition_stop_Callback";
 
+  @DomName('SpeechRecognition.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_addEventListener_Callback";
+
+  @DomName('SpeechRecognition.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "SpeechRecognition_dispatchEvent_Callback";
+
+  @DomName('SpeechRecognition.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_removeEventListener_Callback";
+
   @DomName('SpeechRecognition.onaudioend')
   @DocsEditable()
   Stream<Event> get onAudioEnd => audioEndEvent.forTarget(this);
@@ -22476,6 +23221,21 @@
   @DocsEditable()
   void set volume(num value) native "SpeechSynthesisUtterance_volume_Setter";
 
+  @DomName('SpeechSynthesisUtterance.addEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechSynthesisUtterance_addEventListener_Callback";
+
+  @DomName('SpeechSynthesisUtterance.dispatchEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool dispatchEvent(Event event) native "SpeechSynthesisUtterance_dispatchEvent_Callback";
+
+  @DomName('SpeechSynthesisUtterance.removeEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechSynthesisUtterance_removeEventListener_Callback";
+
   @DomName('SpeechSynthesisUtterance.onboundary')
   @DocsEditable()
   Stream<SpeechSynthesisEvent> get onBoundary => boundaryEvent.forTarget(this);
@@ -22702,7 +23462,7 @@
 @DomName('StorageErrorCallback')
 // http://www.w3.org/TR/quota-api/#storageerrorcallback-callback
 @Experimental()
-typedef void StorageErrorCallback(DomException error);
+typedef void StorageErrorCallback(DomError error);
 // 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.
@@ -22992,6 +23752,36 @@
 @Experimental() // untriaged
 class SubtleCrypto extends NativeFieldWrapperClass1 {
 
+  @DomName('SubtleCrypto.decrypt')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation decrypt(Map algorithm) native "SubtleCrypto_decrypt_Callback";
+
+  @DomName('SubtleCrypto.digest')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation digest(Map algorithm) native "SubtleCrypto_digest_Callback";
+
+  @DomName('SubtleCrypto.encrypt')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation encrypt(Map algorithm) native "SubtleCrypto_encrypt_Callback";
+
+  @DomName('SubtleCrypto.importKey')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Object importKey(String format, TypedData keyData, Map algorithm, bool extractable, List<String> keyUsages) native "SubtleCrypto_importKey_Callback";
+
+  @DomName('SubtleCrypto.sign')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation sign(Map algorithm) native "SubtleCrypto_sign_Callback";
+
+  @DomName('SubtleCrypto.verify')
+  @DocsEditable()
+  @Experimental() // untriaged
+  CryptoOperation verify(Map algorithm) native "SubtleCrypto_verify_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
@@ -23679,6 +24469,16 @@
   @DocsEditable()
   FormElement get form native "HTMLTextAreaElement_form_Getter";
 
+  @DomName('HTMLTextAreaElement.inputMode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get inputMode native "HTMLTextAreaElement_inputMode_Getter";
+
+  @DomName('HTMLTextAreaElement.inputMode')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set inputMode(String value) native "HTMLTextAreaElement_inputMode_Setter";
+
   @DomName('HTMLTextAreaElement.labels')
   @DocsEditable()
   @Unstable()
@@ -23932,17 +24732,17 @@
   @DocsEditable()
   void addCue(TextTrackCue cue) native "TextTrack_addCue_Callback";
 
+  @DomName('TextTrack.removeCue')
+  @DocsEditable()
+  void removeCue(TextTrackCue cue) native "TextTrack_removeCue_Callback";
+
   @DomName('TextTrack.addEventListener')
   @DocsEditable()
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_addEventListener_Callback";
 
   @DomName('TextTrack.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native "TextTrack_dispatchEvent_Callback";
-
-  @DomName('TextTrack.removeCue')
-  @DocsEditable()
-  void removeCue(TextTrackCue cue) native "TextTrack_removeCue_Callback";
+  bool dispatchEvent(Event event) native "TextTrack_dispatchEvent_Callback";
 
   @DomName('TextTrack.removeEventListener')
   @DocsEditable()
@@ -24091,18 +24891,18 @@
   @Experimental() // nonstandard
   void set vertical(String value) native "TextTrackCue_vertical_Setter";
 
+  @DomName('TextTrackCue.getCueAsHTML')
+  @DocsEditable()
+  @Experimental() // nonstandard
+  DocumentFragment getCueAsHtml() native "TextTrackCue_getCueAsHTML_Callback";
+
   @DomName('TextTrackCue.addEventListener')
   @DocsEditable()
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_addEventListener_Callback";
 
   @DomName('TextTrackCue.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native "TextTrackCue_dispatchEvent_Callback";
-
-  @DomName('TextTrackCue.getCueAsHTML')
-  @DocsEditable()
-  @Experimental() // nonstandard
-  DocumentFragment getCueAsHtml() native "TextTrackCue_getCueAsHTML_Callback";
+  bool dispatchEvent(Event event) native "TextTrackCue_dispatchEvent_Callback";
 
   @DomName('TextTrackCue.removeEventListener')
   @DocsEditable()
@@ -24256,17 +25056,17 @@
   TextTrack elementAt(int index) => this[index];
   // -- end List<TextTrack> mixins.
 
+  @DomName('TextTrackList.item')
+  @DocsEditable()
+  TextTrack item(int index) native "TextTrackList_item_Callback";
+
   @DomName('TextTrackList.addEventListener')
   @DocsEditable()
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_addEventListener_Callback";
 
   @DomName('TextTrackList.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native "TextTrackList_dispatchEvent_Callback";
-
-  @DomName('TextTrackList.item')
-  @DocsEditable()
-  TextTrack item(int index) native "TextTrackList_item_Callback";
+  bool dispatchEvent(Event event) native "TextTrackList_dispatchEvent_Callback";
 
   @DomName('TextTrackList.removeEventListener')
   @DocsEditable()
@@ -24908,16 +25708,16 @@
   static String _createObjectUrlFromWebKitSource(_WebKitMediaSource source) native "URL__createObjectUrlFromWebKitSource_Callback";
 
   static String createObjectUrl(blob_OR_source_OR_stream) {
-    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_1(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is _WebKitMediaSource || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_2(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is _WebKitMediaSource || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_3(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
       return _createObjectURL_4(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -25268,10 +26068,6 @@
   @DocsEditable()
   String get url native "WebSocket_url_Getter";
 
-  @DomName('WebSocket.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_addEventListener_Callback";
-
   void close([int code, String reason]) {
     if (reason != null) {
       _close_1(code, reason);
@@ -25291,14 +26087,6 @@
 
   void _close_3() native "WebSocket__close_3_Callback";
 
-  @DomName('WebSocket.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native "WebSocket_dispatchEvent_Callback";
-
-  @DomName('WebSocket.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_removeEventListener_Callback";
-
   /**
    * Transmit data to the server over this connection.
    *
@@ -25326,6 +26114,18 @@
   @DocsEditable()
   void sendTypedData(TypedData data) native "WebSocket_sendTypedData_Callback";
 
+  @DomName('WebSocket.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_addEventListener_Callback";
+
+  @DomName('WebSocket.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "WebSocket_dispatchEvent_Callback";
+
+  @DomName('WebSocket.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_removeEventListener_Callback";
+
   @DomName('WebSocket.onclose')
   @DocsEditable()
   Stream<CloseEvent> get onClose => closeEvent.forTarget(this);
@@ -25452,7 +26252,7 @@
 
 
 @DomName('Window')
-class Window extends EventTarget implements WindowBase, WindowTimers {
+class Window extends EventTarget implements WindowBase, WindowTimers, WindowBase64 {
 
   /**
    * Executes a [callback] after the immediate execution stack has completed.
@@ -25904,22 +26704,10 @@
 
   WindowBase ___getter___2(index_OR_name) native "Window____getter___2_Callback";
 
-  @DomName('Window.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Window_addEventListener_Callback";
-
   @DomName('Window.alert')
   @DocsEditable()
   void alert(String message) native "Window_alert_Callback";
 
-  @DomName('Window.atob')
-  @DocsEditable()
-  String atob(String string) native "Window_atob_Callback";
-
-  @DomName('Window.btoa')
-  @DocsEditable()
-  String btoa(String string) native "Window_btoa_Callback";
-
   @DomName('Window.cancelAnimationFrame')
   @DocsEditable()
   void cancelAnimationFrame(int id) native "Window_cancelAnimationFrame_Callback";
@@ -25932,9 +26720,81 @@
   @DocsEditable()
   bool confirm(String message) native "Window_confirm_Callback";
 
-  @DomName('Window.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native "Window_dispatchEvent_Callback";
+  void _createImageBitmap(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, ImageBitmapCallback callback, [int sx, int sy, int sw, int sh]) {
+    if ((callback is ImageBitmapCallback || callback == null) && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is ImageElement || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      _createImageBitmap_1(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback);
+      return;
+    }
+    if ((sh is int || sh == null) && (sw is int || sw == null) && (sy is int || sy == null) && (sx is int || sx == null) && (callback is ImageBitmapCallback || callback == null) && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is ImageElement || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null)) {
+      _createImageBitmap_2(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh);
+      return;
+    }
+    if ((callback is ImageBitmapCallback || callback == null) && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is VideoElement || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      _createImageBitmap_3(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback);
+      return;
+    }
+    if ((sh is int || sh == null) && (sw is int || sw == null) && (sy is int || sy == null) && (sx is int || sx == null) && (callback is ImageBitmapCallback || callback == null) && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is VideoElement || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null)) {
+      _createImageBitmap_4(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh);
+      return;
+    }
+    if ((callback is ImageBitmapCallback || callback == null) && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is CanvasRenderingContext2D || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      _createImageBitmap_5(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback);
+      return;
+    }
+    if ((sh is int || sh == null) && (sw is int || sw == null) && (sy is int || sy == null) && (sx is int || sx == null) && (callback is ImageBitmapCallback || callback == null) && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is CanvasRenderingContext2D || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null)) {
+      _createImageBitmap_6(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh);
+      return;
+    }
+    if ((callback is ImageBitmapCallback || callback == null) && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is CanvasElement || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      _createImageBitmap_7(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback);
+      return;
+    }
+    if ((sh is int || sh == null) && (sw is int || sw == null) && (sy is int || sy == null) && (sx is int || sx == null) && (callback is ImageBitmapCallback || callback == null) && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is CanvasElement || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null)) {
+      _createImageBitmap_8(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh);
+      return;
+    }
+    if ((callback is ImageBitmapCallback || callback == null) && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is ImageData || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      _createImageBitmap_9(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback);
+      return;
+    }
+    if ((sh is int || sh == null) && (sw is int || sw == null) && (sy is int || sy == null) && (sx is int || sx == null) && (callback is ImageBitmapCallback || callback == null) && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is ImageData || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null)) {
+      _createImageBitmap_10(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh);
+      return;
+    }
+    if ((callback is ImageBitmapCallback || callback == null) && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is ImageBitmap || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null) && sx == null && sy == null && sw == null && sh == null) {
+      _createImageBitmap_11(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback);
+      return;
+    }
+    if ((sh is int || sh == null) && (sw is int || sw == null) && (sy is int || sy == null) && (sx is int || sx == null) && (callback is ImageBitmapCallback || callback == null) && (bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video is ImageBitmap || bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video == null)) {
+      _createImageBitmap_12(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh);
+      return;
+    }
+    throw new ArgumentError("Incorrect number or type of arguments");
+  }
+
+  void _createImageBitmap_1(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback) native "Window__createImageBitmap_1_Callback";
+
+  void _createImageBitmap_2(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh) native "Window__createImageBitmap_2_Callback";
+
+  void _createImageBitmap_3(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback) native "Window__createImageBitmap_3_Callback";
+
+  void _createImageBitmap_4(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh) native "Window__createImageBitmap_4_Callback";
+
+  void _createImageBitmap_5(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback) native "Window__createImageBitmap_5_Callback";
+
+  void _createImageBitmap_6(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh) native "Window__createImageBitmap_6_Callback";
+
+  void _createImageBitmap_7(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback) native "Window__createImageBitmap_7_Callback";
+
+  void _createImageBitmap_8(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh) native "Window__createImageBitmap_8_Callback";
+
+  void _createImageBitmap_9(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback) native "Window__createImageBitmap_9_Callback";
+
+  void _createImageBitmap_10(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh) native "Window__createImageBitmap_10_Callback";
+
+  void _createImageBitmap_11(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback) native "Window__createImageBitmap_11_Callback";
+
+  void _createImageBitmap_12(bitmap_OR_canvas_OR_context_OR_data_OR_image_OR_video, callback, sx, sy, sw, sh) native "Window__createImageBitmap_12_Callback";
 
   @DomName('Window.find')
   @DocsEditable()
@@ -25987,10 +26847,6 @@
   @DocsEditable()
   void print() native "Window_print_Callback";
 
-  @DomName('Window.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Window_removeEventListener_Callback";
-
   @DomName('Window.requestAnimationFrame')
   @DocsEditable()
   int requestAnimationFrame(RequestAnimationFrameCallback callback) native "Window_requestAnimationFrame_Callback";
@@ -26073,6 +26929,26 @@
     return completer.future;
   }
 
+  @DomName('Window.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Window_addEventListener_Callback";
+
+  @DomName('Window.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "Window_dispatchEvent_Callback";
+
+  @DomName('Window.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Window_removeEventListener_Callback";
+
+  @DomName('Window.atob')
+  @DocsEditable()
+  String atob(String string) native "Window_atob_Callback";
+
+  @DomName('Window.btoa')
+  @DocsEditable()
+  String btoa(String string) native "Window_btoa_Callback";
+
   @DomName('Window.clearInterval')
   @DocsEditable()
   void _clearInterval(int handle) native "Window_clearInterval_Callback";
@@ -26201,6 +27077,16 @@
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => Element.mouseDownEvent.forTarget(this);
 
+  @DomName('Window.onmouseenter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MouseEvent> get onMouseEnter => Element.mouseEnterEvent.forTarget(this);
+
+  @DomName('Window.onmouseleave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MouseEvent> get onMouseLeave => Element.mouseLeaveEvent.forTarget(this);
+
   @DomName('Window.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => Element.mouseMoveEvent.forTarget(this);
@@ -26391,6 +27277,29 @@
 
 
 @DocsEditable()
+@DomName('WindowBase64')
+@Experimental() // untriaged
+abstract class WindowBase64 extends NativeFieldWrapperClass1 {
+
+  @DomName('WindowBase64.atob')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String atob(String string) native "WindowBase64_atob_Callback";
+
+  @DomName('WindowBase64.btoa')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String btoa(String string) native "WindowBase64_btoa_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('WindowTimers')
 @Experimental() // untriaged
 abstract class WindowTimers extends NativeFieldWrapperClass1 {
@@ -26464,6 +27373,21 @@
   @DocsEditable()
   void terminate() native "Worker_terminate_Callback";
 
+  @DomName('Worker.addEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Worker_addEventListener_Callback";
+
+  @DomName('Worker.dispatchEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool dispatchEvent(Event event) native "Worker_dispatchEvent_Callback";
+
+  @DomName('Worker.removeEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Worker_removeEventListener_Callback";
+
   @DomName('Worker.onerror')
   @DocsEditable()
   @Experimental() // untriaged
@@ -26500,9 +27424,189 @@
 
 
 @DocsEditable()
+@DomName('WorkerGlobalScope')
+@Experimental() // untriaged
+class WorkerGlobalScope extends EventTarget implements WindowTimers, WindowBase64 {
+  // To suppress missing implicit constructor warnings.
+  factory WorkerGlobalScope._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('WorkerGlobalScope.errorEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
+
+  @DomName('WorkerGlobalScope.PERSISTENT')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int PERSISTENT = 1;
+
+  @DomName('WorkerGlobalScope.TEMPORARY')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const int TEMPORARY = 0;
+
+  @DomName('WorkerGlobalScope.crypto')
+  @DocsEditable()
+  @Experimental() // untriaged
+  WorkerCrypto get crypto native "WorkerGlobalScope_crypto_Getter";
+
+  @DomName('WorkerGlobalScope.indexedDB')
+  @DocsEditable()
+  @Experimental() // untriaged
+  IdbFactory get indexedDB native "WorkerGlobalScope_indexedDB_Getter";
+
+  @DomName('WorkerGlobalScope.location')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _WorkerLocation get location native "WorkerGlobalScope_location_Getter";
+
+  @DomName('WorkerGlobalScope.navigator')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _WorkerNavigator get navigator native "WorkerGlobalScope_navigator_Getter";
+
+  @DomName('WorkerGlobalScope.performance')
+  @DocsEditable()
+  @Experimental() // untriaged
+  WorkerPerformance get performance native "WorkerGlobalScope_performance_Getter";
+
+  @DomName('WorkerGlobalScope.self')
+  @DocsEditable()
+  @Experimental() // untriaged
+  WorkerGlobalScope get self native "WorkerGlobalScope_self_Getter";
+
+  @DomName('WorkerGlobalScope.webkitNotifications')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  @Experimental() // untriaged
+  NotificationCenter get notifications native "WorkerGlobalScope_webkitNotifications_Getter";
+
+  @DomName('WorkerGlobalScope.close')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void close() native "WorkerGlobalScope_close_Callback";
+
+  @DomName('WorkerGlobalScope.importScripts')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void importScripts() native "WorkerGlobalScope_importScripts_Callback";
+
+  @DomName('WorkerGlobalScope.openDatabase')
+  @DocsEditable()
+  @Experimental() // untriaged
+  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerGlobalScope_openDatabase_Callback";
+
+  @DomName('WorkerGlobalScope.openDatabaseSync')
+  @DocsEditable()
+  @Experimental() // untriaged
+  _DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerGlobalScope_openDatabaseSync_Callback";
+
+  @DomName('WorkerGlobalScope.webkitRequestFileSystem')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _webkitRequestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) native "WorkerGlobalScope_webkitRequestFileSystem_Callback";
+
+  Future<FileSystem> webkitRequestFileSystem(int type, int size) {
+    var completer = new Completer<FileSystem>();
+    _webkitRequestFileSystem(type, size,
+        (value) { completer.complete(value); },
+        (error) { completer.completeError(error); });
+    return completer.future;
+  }
+
+  @DomName('WorkerGlobalScope.webkitRequestFileSystemSync')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  @Experimental() // untriaged
+  _DOMFileSystemSync requestFileSystemSync(int type, int size) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback";
+
+  @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemSyncURL')
+  @DocsEditable()
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental()
+  @Experimental() // untriaged
+  _EntrySync resolveLocalFileSystemSyncUrl(String url) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback";
+
+  @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemURL')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void _webkitResolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback";
+
+  Future<Entry> webkitResolveLocalFileSystemUrl(String url) {
+    var completer = new Completer<Entry>();
+    _webkitResolveLocalFileSystemUrl(url,
+        (value) { completer.complete(value); },
+        (error) { completer.completeError(error); });
+    return completer.future;
+  }
+
+  @DomName('WorkerGlobalScope.addEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerGlobalScope_addEventListener_Callback";
+
+  @DomName('WorkerGlobalScope.dispatchEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool dispatchEvent(Event event) native "WorkerGlobalScope_dispatchEvent_Callback";
+
+  @DomName('WorkerGlobalScope.removeEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerGlobalScope_removeEventListener_Callback";
+
+  @DomName('WorkerGlobalScope.atob')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String atob(String string) native "WorkerGlobalScope_atob_Callback";
+
+  @DomName('WorkerGlobalScope.btoa')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String btoa(String string) native "WorkerGlobalScope_btoa_Callback";
+
+  @DomName('WorkerGlobalScope.clearInterval')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearInterval(int handle) native "WorkerGlobalScope_clearInterval_Callback";
+
+  @DomName('WorkerGlobalScope.clearTimeout')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void clearTimeout(int handle) native "WorkerGlobalScope_clearTimeout_Callback";
+
+  @DomName('WorkerGlobalScope.setInterval')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int setInterval(Object handler, int timeout) native "WorkerGlobalScope_setInterval_Callback";
+
+  @DomName('WorkerGlobalScope.setTimeout')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int setTimeout(Object handler, int timeout) native "WorkerGlobalScope_setTimeout_Callback";
+
+  @DomName('WorkerGlobalScope.onerror')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onError => errorEvent.forTarget(this);
+
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('WorkerPerformance')
 @Experimental() // untriaged
-abstract class WorkerPerformance extends NativeFieldWrapperClass1 {
+class WorkerPerformance extends NativeFieldWrapperClass1 {
 
   @DomName('WorkerPerformance.now')
   @DocsEditable()
@@ -27209,22 +28313,6 @@
 
 
 @DocsEditable()
-@DomName('DedicatedWorkerContext')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html
-@Experimental()
-abstract class _DedicatedWorkerContext extends _WorkerContext {
-  // To suppress missing implicit constructor warnings.
-  factory _DedicatedWorkerContext._() { throw new UnsupportedError("Not supported"); }
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('DirectoryEntrySync')
 // http://www.w3.org/TR/file-system-api/#the-directoryentrysync-interface
 @Experimental()
@@ -28031,22 +29119,6 @@
 
 
 @DocsEditable()
-@DomName('SharedWorkerContext')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers-and-the-sharedworkerglobalscope-interface
-@Experimental() // nonstandard
-abstract class _SharedWorkerContext extends _WorkerContext {
-  // To suppress missing implicit constructor warnings.
-  factory _SharedWorkerContext._() { throw new UnsupportedError("Not supported"); }
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('SpeechInputResultList')
 // http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html#speech_input_result_list_interface
 @Experimental()
@@ -28307,20 +29379,6 @@
 
 
 @DocsEditable()
-@DomName('WorkerContext')
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#WorkerGlobalScope-partial
-@Experimental() // stable
-abstract class _WorkerContext extends NativeFieldWrapperClass1 implements EventTarget, WindowTimers {
-
-}
-// 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('WorkerLocation')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workerlocation
 @Experimental()
@@ -29271,6 +30329,123 @@
   }
 }
 
+/** A specialized Stream available to [Element]s to enable event delegation. */
+abstract class ElementStream<T extends Event> implements Stream<T> {
+  /**
+   * Return a stream that only fires when the particular event fires for
+   * elements matching the specified CSS selector.
+   *
+   * This is the Dart equivalent to jQuery's
+   * [delegate](http://api.jquery.com/delegate/).
+   */
+  Stream<T> matches(String selector);
+}
+
+/**
+ * Adapter for exposing DOM Element events as streams, while also allowing
+ * event delegation.
+ */
+class _ElementEventStreamImpl<T extends Event> extends _EventStream<T>
+    implements ElementStream<T> {
+  _ElementEventStreamImpl(target, eventType, useCapture) :
+      super(target, eventType, useCapture);
+
+  Stream<T> matches(String selector) =>
+      this.where((event) => event.target.matches(selector, true));
+}
+
+/**
+ * Adapter for exposing events on a collection of DOM Elements as streams,
+ * while also allowing event delegation.
+ */
+class _ElementListEventStreamImpl<T extends Event> extends Stream<T>
+    implements ElementStream<T> {
+  final _StreamPool _pool;
+  Stream<T> _stream;
+
+  _ElementListEventStreamImpl(targetList, eventType, useCapture) :
+      _pool = new _StreamPool.broadcast() {
+    for (Element target in targetList) {
+      var stream = new _EventStream(target, eventType, useCapture);
+      _pool.add(stream);
+    }
+    _stream = _pool.stream;
+  }
+
+  Stream<T> matches(String selector) =>
+      this.where((event) => event.target.matches(selector, true));
+
+  // Delegate all regular Stream behavor to our wrapped Stream.
+  StreamSubscription<T> listen(void onData(T event),
+      { void onError(error),
+        void onDone(),
+        bool cancelOnError}) =>
+      _stream.listen(onData, onError: onError, onDone: onDone,
+          cancelOnError: cancelOnError);
+  Stream<T> asBroadcastStream({void onListen(StreamSubscription subscription),
+                               void onCancel(StreamSubscription subscription)})
+      => _stream;
+  bool get isBroadcast => true;
+}
+
+/**
+ * A pool of streams whose events are unified and emitted through a central
+ * stream.
+ */
+// TODO (efortuna): Remove this when Issue 12218 is addressed.
+class _StreamPool<T> {
+  StreamController<T> _controller;
+
+  /// Subscriptions to the streams that make up the pool.
+  var _subscriptions = new Map<Stream<T>, StreamSubscription<T>>();
+
+  /**
+   * Creates a new stream pool where [stream] can be listened to more than
+   * once.
+   *
+   * Any events from buffered streams in the pool will be emitted immediately,
+   * regardless of whether [stream] has any subscribers.
+   */
+  _StreamPool.broadcast() {
+    _controller = new StreamController<T>.broadcast(sync: true,
+        onCancel: close);
+  }
+
+  /**
+   * The stream through which all events from streams in the pool are emitted.
+   */
+  Stream<T> get stream => _controller.stream;
+
+  /**
+   * Adds [stream] as a member of this pool.
+   *
+   * Any events from [stream] will be emitted through [this.stream]. If
+   * [stream] is sync, they'll be emitted synchronously; if [stream] is async,
+   * they'll be emitted asynchronously.
+   */
+  void add(Stream<T> stream) {
+    if (_subscriptions.containsKey(stream)) return;
+    _subscriptions[stream] = stream.listen(_controller.add,
+        onError: _controller.addError,
+        onDone: () => remove(stream));
+  }
+
+  /** Removes [stream] as a member of this pool. */
+  void remove(Stream<T> stream) {
+    var subscription = _subscriptions.remove(stream);
+    if (subscription != null) subscription.cancel();
+  }
+
+  /** Removes all streams from this pool and closes [stream]. */
+  void close() {
+    for (var subscription in _subscriptions.values) {
+      subscription.cancel();
+    }
+    _subscriptions.clear();
+    _controller.close();
+  }
+}
+
 class _EventStreamSubscription<T extends Event> extends StreamSubscription<T> {
   int _pauseCount = 0;
   EventTarget _target;
@@ -29348,7 +30523,6 @@
   }
 }
 
-
 /**
  * A factory to expose DOM events as Streams.
  */
@@ -29375,8 +30549,43 @@
    *
    * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
    */
-  Stream<T> forTarget(EventTarget e, {bool useCapture: false}) {
-    return new _EventStream(e, _eventType, useCapture);
+  Stream<T> forTarget(EventTarget e, {bool useCapture: false}) =>
+    new _EventStream(e, _eventType, useCapture);
+
+  /**
+   * Gets an [ElementEventStream] for this event type, on the specified element.
+   *
+   * This will always return a broadcast stream so multiple listeners can be
+   * used simultaneously.
+   *
+   * This may be used to capture DOM events:
+   *
+   *     Element.keyDownEvent.forElement(element, useCapture: true).listen(...);
+   *
+   * See also:
+   *
+   * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+   */
+  ElementStream<T> forElement(Element e, {bool useCapture: false}) {
+    return new _ElementEventStreamImpl(e, _eventType, useCapture);
+  }
+
+  /**
+   * Gets an [ElementEventStream] for this event type, on the list of elements.
+   *
+   * This will always return a broadcast stream so multiple listeners can be
+   * used simultaneously.
+   *
+   * This may be used to capture DOM events:
+   *
+   *     Element.keyDownEvent._forElementList(element, useCapture: true).listen(...);
+   *
+   * See also:
+   *
+   * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+   */
+  ElementStream<T> _forElementList(ElementList e, {bool useCapture: false}) {
+    return new _ElementListEventStreamImpl(e, _eventType, useCapture);
   }
 
   /**
@@ -29405,6 +30614,15 @@
     return new _EventStream(e, _eventTypeGetter(e), useCapture);
   }
 
+  ElementStream<T> forElement(Element e, {bool useCapture: false}) {
+    return new _ElementEventStreamImpl(e, _eventTypeGetter(e), useCapture);
+  }
+
+  ElementStream<T> _forElementList(ElementList e,
+      {bool useCapture: false}) {
+    return new _ElementListEventStreamImpl(e, _eventTypeGetter(e), useCapture);
+  }
+
   String getEventType(EventTarget target) {
     return _eventTypeGetter(target);
   }
@@ -32034,11 +33252,11 @@
 
   static String addTrailingDot(String str) => '${str}.';
 
+  static bool isNoSuchMethodError(obj) => obj is NoSuchMethodError;
+
   // TODO(jacobr): we need a failsafe way to determine that a Node is really a
   // DOM node rather than just a class that extends Node.
   static bool isNode(obj) => obj is Node;
-
-  static bool isNoSuchMethodError(obj) => obj is NoSuchMethodError;
 }
 
 class _NPObject extends NativeFieldWrapperClass1 {
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index 41ec3f4..9304548 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -305,6 +305,12 @@
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  @DomName('IDBDatabase.closeEvent')
+  @DocsEditable()
+  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
+  @Experimental()
+  static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
+
   @DomName('IDBDatabase.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
@@ -329,11 +335,6 @@
   @Returns('int|String|Null')
   final dynamic version;
 
-  @JSName('addEventListener')
-  @DomName('IDBDatabase.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @DomName('IDBDatabase.close')
   @DocsEditable()
   void close() native;
@@ -360,9 +361,16 @@
   @DocsEditable()
   void deleteObjectStore(String name) native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('IDBDatabase.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('IDBDatabase.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native;
+  bool dispatchEvent(Event event) native;
 
   @JSName('removeEventListener')
   @DomName('IDBDatabase.removeEventListener')
@@ -373,6 +381,12 @@
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
+  @DomName('IDBDatabase.onclose')
+  @DocsEditable()
+  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
+  @Experimental()
+  Stream<Event> get onClose => closeEvent.forTarget(this);
+
   @DomName('IDBDatabase.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
@@ -1085,7 +1099,7 @@
 @DocsEditable()
 @DomName('IDBOpenDBRequest')
 @Unstable()
-class OpenDBRequest extends Request implements EventTarget native "IDBOpenDBRequest,IDBVersionChangeRequest" {
+class OpenDBRequest extends Request native "IDBOpenDBRequest,IDBVersionChangeRequest" {
   // To suppress missing implicit constructor warnings.
   factory OpenDBRequest._() { throw new UnsupportedError("Not supported"); }
 
@@ -1149,6 +1163,8 @@
   @DocsEditable()
   final Transaction transaction;
 
+  // From EventTarget
+
   @JSName('addEventListener')
   @DomName('IDBRequest.addEventListener')
   @DocsEditable()
@@ -1156,7 +1172,7 @@
 
   @DomName('IDBRequest.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native;
+  bool dispatchEvent(Event event) native;
 
   @JSName('removeEventListener')
   @DomName('IDBRequest.removeEventListener')
@@ -1236,6 +1252,12 @@
   @DocsEditable()
   void abort() native;
 
+  @DomName('IDBTransaction.objectStore')
+  @DocsEditable()
+  ObjectStore objectStore(String name) native;
+
+  // From EventTarget
+
   @JSName('addEventListener')
   @DomName('IDBTransaction.addEventListener')
   @DocsEditable()
@@ -1243,11 +1265,7 @@
 
   @DomName('IDBTransaction.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native;
-
-  @DomName('IDBTransaction.objectStore')
-  @DocsEditable()
-  ObjectStore objectStore(String name) native;
+  bool dispatchEvent(Event event) native;
 
   @JSName('removeEventListener')
   @DomName('IDBTransaction.removeEventListener')
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index 015c8ee..dc31713 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -149,6 +149,12 @@
   @DocsEditable()
   static const EventStreamProvider<Event> abortEvent = const EventStreamProvider<Event>('abort');
 
+  @DomName('IDBDatabase.closeEvent')
+  @DocsEditable()
+  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
+  @Experimental()
+  static const EventStreamProvider<Event> closeEvent = const EventStreamProvider<Event>('close');
+
   @DomName('IDBDatabase.errorEvent')
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
@@ -169,10 +175,6 @@
   @DocsEditable()
   dynamic get version native "IDBDatabase_version_Getter";
 
-  @DomName('IDBDatabase.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_addEventListener_Callback";
-
   @DomName('IDBDatabase.close')
   @DocsEditable()
   void close() native "IDBDatabase_close_Callback";
@@ -185,14 +187,6 @@
   @DocsEditable()
   void deleteObjectStore(String name) native "IDBDatabase_deleteObjectStore_Callback";
 
-  @DomName('IDBDatabase.dispatchEvent')
-  @DocsEditable()
-  bool dispatchEvent(Event evt) native "IDBDatabase_dispatchEvent_Callback";
-
-  @DomName('IDBDatabase.removeEventListener')
-  @DocsEditable()
-  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_removeEventListener_Callback";
-
   Transaction transaction(storeName_OR_storeNames, String mode) {
     if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
       return _transaction_1(storeName_OR_storeNames, mode);
@@ -224,10 +218,28 @@
   @DocsEditable()
   Transaction transactionStores(List<String> storeNames, String mode) native "IDBDatabase_transactionStores_Callback";
 
+  @DomName('IDBDatabase.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_addEventListener_Callback";
+
+  @DomName('IDBDatabase.dispatchEvent')
+  @DocsEditable()
+  bool dispatchEvent(Event event) native "IDBDatabase_dispatchEvent_Callback";
+
+  @DomName('IDBDatabase.removeEventListener')
+  @DocsEditable()
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_removeEventListener_Callback";
+
   @DomName('IDBDatabase.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
 
+  @DomName('IDBDatabase.onclose')
+  @DocsEditable()
+  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540
+  @Experimental()
+  Stream<Event> get onClose => closeEvent.forTarget(this);
+
   @DomName('IDBDatabase.onerror')
   @DocsEditable()
   Stream<Event> get onError => errorEvent.forTarget(this);
@@ -917,7 +929,7 @@
 @DocsEditable()
 @DomName('IDBOpenDBRequest')
 @Unstable()
-class OpenDBRequest extends Request implements EventTarget {
+class OpenDBRequest extends Request {
   // To suppress missing implicit constructor warnings.
   factory OpenDBRequest._() { throw new UnsupportedError("Not supported"); }
 
@@ -986,7 +998,7 @@
 
   @DomName('IDBRequest.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native "IDBRequest_dispatchEvent_Callback";
+  bool dispatchEvent(Event event) native "IDBRequest_dispatchEvent_Callback";
 
   @DomName('IDBRequest.removeEventListener')
   @DocsEditable()
@@ -1066,17 +1078,17 @@
   @DocsEditable()
   void abort() native "IDBTransaction_abort_Callback";
 
+  @DomName('IDBTransaction.objectStore')
+  @DocsEditable()
+  ObjectStore objectStore(String name) native "IDBTransaction_objectStore_Callback";
+
   @DomName('IDBTransaction.addEventListener')
   @DocsEditable()
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBTransaction_addEventListener_Callback";
 
   @DomName('IDBTransaction.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event evt) native "IDBTransaction_dispatchEvent_Callback";
-
-  @DomName('IDBTransaction.objectStore')
-  @DocsEditable()
-  ObjectStore objectStore(String name) native "IDBTransaction_objectStore_Callback";
+  bool dispatchEvent(Event event) native "IDBTransaction_dispatchEvent_Callback";
 
   @DomName('IDBTransaction.removeEventListener')
   @DocsEditable()
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index 0b41e3b..4f61b2b 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -17,6 +17,7 @@
 import 'dart:collection' show LinkedHashSet,
                               LinkedList,
                               LinkedListEntry;
+import 'dart:convert';
 import 'dart:isolate';
 import 'dart:json' as JSON;
 import 'dart:math';
diff --git a/sdk/lib/io/platform.dart b/sdk/lib/io/platform.dart
index 90fe65a..16b3595 100644
--- a/sdk/lib/io/platform.dart
+++ b/sdk/lib/io/platform.dart
@@ -15,9 +15,6 @@
   static final _localHostname = _Platform.localHostname;
   static final _version = _Platform.version;
 
-  // This executable singleton is written to by the embedder if applicable.
-  static String _nativeExecutable = '';
-
   // This script singleton is written to by the embedder if applicable.
   static String _nativeScript = '';
 
@@ -80,10 +77,12 @@
    * If the execution environment does not support [executable] an empty
    * string is returned.
    */
-  static String get executable => _nativeExecutable;
+  static String get executable => _Platform.executable;
 
   /**
-   * Returns the path of the script being run in this isolate.
+   * Returns the URI (in String form) of the script being run in this
+   * isolate. If the URI is relative it is relative to the file URI of
+   * the working directory of the VM when it was started.
    *
    * If the executable environment does not support [script] an empty
    * string is returned.
diff --git a/sdk/lib/io/platform_impl.dart b/sdk/lib/io/platform_impl.dart
index b9bae78..94d67b6 100644
--- a/sdk/lib/io/platform_impl.dart
+++ b/sdk/lib/io/platform_impl.dart
@@ -9,6 +9,7 @@
   external static String _pathSeparator();
   external static String _operatingSystem();
   external static _localHostname();
+  external static _executable();
   external static _environment();
   external static String _version();
 
@@ -25,6 +26,8 @@
     }
   }
 
+  static String executable = _executable();
+
   static Map<String, String> get environment {
     var env = _environment();
     if (env is OSError) {
diff --git a/sdk/lib/io/string_transformer.dart b/sdk/lib/io/string_transformer.dart
index 4f18b99..56e322c 100644
--- a/sdk/lib/io/string_transformer.dart
+++ b/sdk/lib/io/string_transformer.dart
@@ -259,63 +259,19 @@
   return bytes;
 }
 
+// TODO(floitsch) Remove usage of LineTransformer
+// TODO(kevmoo) Remove usage of LineTransformer
+/**
+ * Use [LineSplitter] from `dart:convert` instead.
+ *
+ * [LineTransformer] will be removed the 28 August 2013.
+ */
+ @deprecated
+ class LineTransformer implements StreamTransformer<String, String> {
+  final _decoder = new LineSplitter();
 
-class LineTransformer extends StreamEventTransformer<String, String> {
-  static const int _LF = 10;
-  static const int _CR = 13;
-
-  StringBuffer _buffer = new StringBuffer();
-  String _carry;
-
-  void _handle(String data, EventSink<String> sink, bool isClosing) {
-    if (_carry != null) {
-      data = _carry + data;
-      _carry = null;
-    }
-    int startPos = 0;
-    int pos = 0;
-    while (pos < data.length) {
-      int skip = 0;
-      int char = data.codeUnitAt(pos);
-      if (char == _LF) {
-        skip = 1;
-      } else if (char == _CR) {
-        skip = 1;
-        if (pos + 1 < data.length) {
-          if (data.codeUnitAt(pos + 1) == _LF) {
-            skip = 2;
-          }
-        } else if (!isClosing) {
-          _carry = data.substring(startPos);
-          return;
-        }
-      }
-      if (skip > 0) {
-        _buffer.write(data.substring(startPos, pos));
-        sink.add(_buffer.toString());
-        _buffer = new StringBuffer();
-        startPos = pos = pos + skip;
-      } else {
-        pos++;
-      }
-    }
-    if (pos != startPos) {
-      // Add remaining
-      _buffer.write(data.substring(startPos, pos));
-    }
-    if (isClosing && !_buffer.isEmpty) {
-      sink.add(_buffer.toString());
-      _buffer = new StringBuffer();
-    }
-  }
-
-  void handleData(String data, EventSink<String> sink) {
-    _handle(data, sink, false);
-  }
-
-  void handleDone(EventSink<String> sink) {
-    _handle("", sink, true);
-    sink.close();
+  Stream<String> bind(Stream<String> stream) {
+    return _decoder.bind(stream);
   }
 }
 
diff --git a/sdk/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart
index f189dc0..c41c6c2 100644
--- a/sdk/lib/mirrors/mirrors.dart
+++ b/sdk/lib/mirrors/mirrors.dart
@@ -118,17 +118,28 @@
 external Future<MirrorSystem> mirrorSystemOf(SendPort port);
 
 /**
- * Returns an [InstanceMirror] for some Dart language object.
+ * Returns an [InstanceMirror] reflecting [reflectee].
+ * If [reflectee] is function or an instance of a class 
+ * that has a [:call:] method, the returned instance mirror
+ * will be a [ClosureMirror].
  *
- * This only works with objects local to the current isolate.
+ * Note that since one cannot obtain an object from
+ * another isolate, this function can only be used to
+ * obtain  mirrors on objects of the current isolate.
  */
 external InstanceMirror reflect(Object reflectee);
 
 /**
- * Returns a [ClassMirror] for the class represented by a Dart
- * Type object.
+ * Let *C* be the original class declaration of the class
+ * represented by [key]. 
+ * This function returns a [ClassMirror] reflecting *C*.
  *
- * This only works with objects local to the current isolate.
+ * If [key] is not an instance of [Type] then this function
+ * throws an [ArgumentError].
+ *
+ * Note that since one cannot obtain a [Type] object from
+ * another isolate, this function can only be used to
+ * obtain class mirrors on classes of the current isolate.
  */
 external ClassMirror reflectClass(Type key);
 
@@ -149,22 +160,27 @@
  */
 abstract class IsolateMirror implements Mirror {
   /**
-   * A unique name used to refer to an isolate in debugging messages.
+   * Returns a unique name used to refer to an isolate 
+   * in debugging messages.
    */
   String get debugName;
 
   /**
-   * Does this mirror reflect the currently running isolate?
+   * Returns [:true:] if and only if this mirror reflects 
+   * the currently running isolate. Otherwise returns
+   * [:false:].
    */
   bool get isCurrent;
 
   /**
-   * A mirror on the root library for this isolate.
+   * Returns a [LibraryMirror] on the root library for this 
+   * isolate.
    */
   LibraryMirror get rootLibrary;
 
   /**
-   * Returns true if this mirror is equal to [other].
+   * Returns [:true:] if this mirror is equal to [other]. 
+   * Otherwise returns [:false:].
    * The equality holds if and only if 
    * (1) [other] is a mirror of the same kind 
    * and
@@ -210,20 +226,28 @@
    * immediately surrounding the reflectee.
    *
    * For a library, the owner is [:null:].
-   * For a class, typedef or top level function or variable, the owner is
-   * the enclosing library. For a method, instance variable or
-   * a static variable, the owner is the immediately enclosing class.
+   * For a class declaration, typedef or top level function 
+   * or variable, the owner is the enclosing library. 
+   * For a mixin application *S with M*, the owner is the owner
+   * of *M*.
+   * For class Null, the owner is the dart:core library.
+   * For a constructor, the owner is the immediately enclosing class.
+   * For a method, instance variable or
+   * a static variable, the owner is the immediately enclosing class,
+   * unless the class is a mixin application *S with M*, in which case 
+   * the owner is *M*. Note that *M* may be an invocation of a generic.
    * For a parameter, local variable or local function the owner is the
    * immediately enclosing function.
    */
   DeclarationMirror get owner;
 
   /**
-   * Is this declaration private?
-   *
-   * A declaration is private if and only if it is considered private
+   * Returns [:true:] if this declaration is considered private
    * according to the Dart language specification.
-   * Note that for libraries, this will be [:false:].
+   * Always returns [: false :] if this declaration
+   * is a library.
+   * Otherwise return [:false:].
+   *
    */
   bool get isPrivate;
 
@@ -452,7 +476,7 @@
    * mirror reflects a simple value.
    *
    * A value is simple if one of the following holds:
-   *  - the value is null
+   *  - the value is [:null:]
    *  - the value is of type [num]
    *  - the value is of type [bool]
    *  - the value is of type [String]
@@ -632,7 +656,8 @@
   Map<Symbol, VariableMirror> get variables;
 
   /**
-   * Returns true if this mirror is equal to [other].
+   * Returns [:true:] if this mirror is equal to [other].
+   * Otherwise returns [:false:].
    *
    * The equality holds if and only if 
    * (1) [other] is a mirror of the same kind
@@ -715,6 +740,11 @@
   /**
    * An immutable map from names to mirrors for all type variables for
    * this type.
+   * If this type is a generic declaration or an invocation of
+   * a generic declaration, the returned map has the names of the formal
+   * type parameters of the original declaration as its keys, and
+   * each such key maps to a TypeVariableMirror on the corresponding
+   * type variable. Otherwise, the returned map is empty.
    *
    * This map preserves the order of declaration of the type variables.
    */
@@ -722,8 +752,15 @@
 
   /**
    * An immutable map from names to mirrors for all type arguments for
-   * this type.
-   *
+   * this type.  The keys of the map are the names of the 
+   * corresponding type variables.
+   * 
+   * If the the reflectee is an invocation of a generic class,
+   * the type arguments are the bindings of its type parameters.
+   * If the reflectee is the original declaration of a generic,
+   * it has no type arguments and this method returns an empty map.
+   * If the reflectee is a not generic, then
+   * it has no type arguments and this method returns an empty map.
    * This map preserves the order of declaration of the type variables.
    */
   Map<Symbol, TypeMirror> get typeArguments;
@@ -821,28 +858,17 @@
                                           [Map<Symbol, dynamic> namedArguments]);
 
   /**
-   * Does this mirror represent a class?
-   *
-   * TODO(turnidge): This functions goes away after the
-   * class/interface changes.
-   */
-  bool get isClass;
-
-  /**
-   * A mirror on the default factory class or null if there is none.
-   *
-   * TODO(turnidge): This functions goes away after the
-   * class/interface changes.
-   */
-  ClassMirror get defaultFactory;
-
-  /**
-   * Returns true if this mirror is equal to [other].
+   * Returns [:true:] if this mirror is equal to [other].
+   * Otherwise returns [:false:].
    *
    * The equality holds if and only if 
    * (1) [other] is a mirror of the same kind
    * and
    * (2) This mirror and [other] reflect the same class.
+   * 
+   * Note that if the reflected class is an invocation of
+   * a generic class,(2) implies that the reflected class 
+   * and [other] have equal type arguments.
    */
    bool operator == (other);
 }
@@ -853,19 +879,17 @@
  */
 abstract class FunctionTypeMirror implements ClassMirror {
   /**
-   * The return type of the reflectee.
+   * Returns the return type of the reflectee.
    */
   TypeMirror get returnType;
 
   /**
-   * A list of the parameter types of the reflectee.
+   * Returns a list of the parameter types of the reflectee.
    */
   List<ParameterMirror> get parameters;
 
   /**
    * A mirror on the [:call:] method for the reflectee.
-   *
-   * TODO(turnidge): What is this and what is it for?
    */
   MethodMirror get callMethod;
 }
@@ -881,7 +905,8 @@
   TypeMirror get upperBound;
 
   /**
-   * Returns true if this mirror is equal to [other].
+   * Returns [:true:] if this mirror is equal to [other].
+   * Otherwise returns [:false:].
    *
    * The equality holds if and only if 
    * (1) [other] is a mirror of the same kind
@@ -1009,12 +1034,13 @@
  */
 abstract class VariableMirror implements DeclarationMirror {
   /**
-   * A mirror on the type of the reflectee.
+   * Returns a mirror on the type of the reflectee.
    */
   TypeMirror get type;
 
   /**
-   * Is the reflectee a static variable?
+   * Returns [:true:] if the reflectee is a static variable.
+   * Otherwise returns [:false:].
    *
    * For the purposes of the mirror library, top-level variables are
    * implicitly declared static.
@@ -1022,7 +1048,8 @@
   bool get isStatic;
 
   /**
-   * Is the reflectee a final variable?
+   * Returns [:true:] if the reflectee is a final variable.
+   * Otherwise returns [:false:].
    */
   bool get isFinal;
 
@@ -1048,17 +1075,20 @@
   TypeMirror get type;
 
   /**
-   * Is this parameter optional?
+   * Returns [:true:] if the reflectee is an optional parameter.
+   * Otherwise returns [:false:].
    */
   bool get isOptional;
 
   /**
-   * Is this parameter named?
+   * Returns [:true:] if the reflectee is a named parameter.
+   * Otherwise returns [:false:].
    */
   bool get isNamed;
 
   /**
-   * Does this parameter have a default value?
+   * Returns [:true:] if the reflectee has a default value.
+   * Otherwise returns [:false:].
    */
   bool get hasDefaultValue;
 
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index ba93b3a..359a71c 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -64,7 +64,7 @@
 @DocsEditable()
 @DomName('SVGAElement')
 @Unstable()
-class AElement extends StyledElement implements Transformable, ExternalResourcesRequired, UriReference, Tests, LangSpace native "SVGAElement" {
+class AElement extends GraphicsElement implements UriReference, ExternalResourcesRequired native "SVGAElement" {
   // To suppress missing implicit constructor warnings.
   factory AElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -82,68 +82,6 @@
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
 
-  // From SVGLangSpace
-
-  @DomName('SVGAElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGAElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGAElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGAElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGAElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGAElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGAElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGAElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTests
-
-  @DomName('SVGAElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGAElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGAElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGAElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGAElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
-
   // From SVGURIReference
 
   @DomName('SVGAElement.href')
@@ -530,7 +468,7 @@
 @DocsEditable()
 @DomName('SVGAnimationElement')
 @Unstable()
-class AnimationElement extends SvgElement implements ExternalResourcesRequired, ElementTimeControl, Tests native "SVGAnimationElement" {
+class AnimationElement extends SvgElement implements ExternalResourcesRequired, Tests native "SVGAnimationElement" {
   // To suppress missing implicit constructor warnings.
   factory AnimationElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -542,20 +480,6 @@
   @DocsEditable()
   final SvgElement targetElement;
 
-  @DomName('SVGAnimationElement.getCurrentTime')
-  @DocsEditable()
-  num getCurrentTime() native;
-
-  @DomName('SVGAnimationElement.getSimpleDuration')
-  @DocsEditable()
-  num getSimpleDuration() native;
-
-  @DomName('SVGAnimationElement.getStartTime')
-  @DocsEditable()
-  num getStartTime() native;
-
-  // From ElementTimeControl
-
   @DomName('SVGAnimationElement.beginElement')
   @DocsEditable()
   void beginElement() native;
@@ -572,6 +496,18 @@
   @DocsEditable()
   void endElementAt(num offset) native;
 
+  @DomName('SVGAnimationElement.getCurrentTime')
+  @DocsEditable()
+  num getCurrentTime() native;
+
+  @DomName('SVGAnimationElement.getSimpleDuration')
+  @DocsEditable()
+  num getSimpleDuration() native;
+
+  @DomName('SVGAnimationElement.getStartTime')
+  @DocsEditable()
+  num getStartTime() native;
+
   // From SVGExternalResourcesRequired
 
   @DomName('SVGAnimationElement.externalResourcesRequired')
@@ -604,7 +540,7 @@
 @DocsEditable()
 @DomName('SVGCircleElement')
 @Unstable()
-class CircleElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace native "SVGCircleElement" {
+class CircleElement extends GraphicsElement implements ExternalResourcesRequired native "SVGCircleElement" {
   // To suppress missing implicit constructor warnings.
   factory CircleElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -629,68 +565,6 @@
   @DomName('SVGCircleElement.externalResourcesRequired')
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  @DomName('SVGCircleElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGCircleElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGCircleElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGCircleElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGCircleElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGCircleElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGCircleElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGCircleElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTests
-
-  @DomName('SVGCircleElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGCircleElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGCircleElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGCircleElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGCircleElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
 }
 // 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
@@ -700,7 +574,7 @@
 @DocsEditable()
 @DomName('SVGClipPathElement')
 @Unstable()
-class ClipPathElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace native "SVGClipPathElement" {
+class ClipPathElement extends GraphicsElement implements ExternalResourcesRequired native "SVGClipPathElement" {
   // To suppress missing implicit constructor warnings.
   factory ClipPathElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -717,68 +591,6 @@
   @DomName('SVGClipPathElement.externalResourcesRequired')
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  @DomName('SVGClipPathElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGClipPathElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGClipPathElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGClipPathElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGClipPathElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGClipPathElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGClipPathElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGClipPathElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTests
-
-  @DomName('SVGClipPathElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGClipPathElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGClipPathElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGClipPathElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGClipPathElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
 }
 // 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
@@ -788,7 +600,7 @@
 @DocsEditable()
 @DomName('SVGDefsElement')
 @Unstable()
-class DefsElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace native "SVGDefsElement" {
+class DefsElement extends GraphicsElement implements ExternalResourcesRequired native "SVGDefsElement" {
   // To suppress missing implicit constructor warnings.
   factory DefsElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -801,68 +613,6 @@
   @DomName('SVGDefsElement.externalResourcesRequired')
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  @DomName('SVGDefsElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGDefsElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGDefsElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGDefsElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGDefsElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGDefsElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGDefsElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGDefsElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTests
-
-  @DomName('SVGDefsElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGDefsElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGDefsElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGDefsElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGDefsElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
 }
 // 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
@@ -872,23 +622,13 @@
 @DocsEditable()
 @DomName('SVGDescElement')
 @Unstable()
-class DescElement extends StyledElement implements LangSpace native "SVGDescElement" {
+class DescElement extends StyledElement native "SVGDescElement" {
   // To suppress missing implicit constructor warnings.
   factory DescElement._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('SVGDescElement.SVGDescElement')
   @DocsEditable()
   factory DescElement() => _SvgElementFactoryProvider.createSvgElement_tag("desc");
-
-  // From SVGLangSpace
-
-  @DomName('SVGDescElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGDescElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
 }
 // 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
@@ -1006,6 +746,16 @@
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
 
+  @DomName('SVGElementInstance.mouseenterEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
+
+  @DomName('SVGElementInstance.mouseleaveEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
+
   @DomName('SVGElementInstance.mousemoveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
@@ -1098,6 +848,25 @@
   @DocsEditable()
   final ElementInstance previousSibling;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('SVGElementInstance.addEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('SVGElementInstance.dispatchEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('SVGElementInstance.removeEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('SVGElementInstance.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
@@ -1202,6 +971,16 @@
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
 
+  @DomName('SVGElementInstance.onmouseenter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MouseEvent> get onMouseEnter => mouseEnterEvent.forTarget(this);
+
+  @DomName('SVGElementInstance.onmouseleave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forTarget(this);
+
   @DomName('SVGElementInstance.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
@@ -1268,7 +1047,7 @@
 @DocsEditable()
 @DomName('SVGEllipseElement')
 @Unstable()
-class EllipseElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace native "SVGEllipseElement" {
+class EllipseElement extends GraphicsElement implements ExternalResourcesRequired native "SVGEllipseElement" {
   // To suppress missing implicit constructor warnings.
   factory EllipseElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -1297,68 +1076,6 @@
   @DomName('SVGEllipseElement.externalResourcesRequired')
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  @DomName('SVGEllipseElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGEllipseElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGEllipseElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGEllipseElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGEllipseElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGEllipseElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGEllipseElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGEllipseElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTests
-
-  @DomName('SVGEllipseElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGEllipseElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGEllipseElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGEllipseElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGEllipseElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
 }
 // 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
@@ -2172,7 +1889,7 @@
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
-class FEImageElement extends StyledElement implements FilterPrimitiveStandardAttributes, UriReference, ExternalResourcesRequired, LangSpace native "SVGFEImageElement" {
+class FEImageElement extends StyledElement implements FilterPrimitiveStandardAttributes, UriReference, ExternalResourcesRequired native "SVGFEImageElement" {
   // To suppress missing implicit constructor warnings.
   factory FEImageElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -2215,16 +1932,6 @@
   @DocsEditable()
   final AnimatedLength y;
 
-  // From SVGLangSpace
-
-  @DomName('SVGFEImageElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGFEImageElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
   // From SVGURIReference
 
   @DomName('SVGFEImageElement.href')
@@ -2735,7 +2442,7 @@
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
-class FilterElement extends StyledElement implements UriReference, ExternalResourcesRequired, LangSpace native "SVGFilterElement" {
+class FilterElement extends StyledElement implements UriReference, ExternalResourcesRequired native "SVGFilterElement" {
   // To suppress missing implicit constructor warnings.
   factory FilterElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -2788,16 +2495,6 @@
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
 
-  // From SVGLangSpace
-
-  @DomName('SVGFilterElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGFilterElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
   // From SVGURIReference
 
   @DomName('SVGFilterElement.href')
@@ -2849,7 +2546,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
-class ForeignObjectElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace native "SVGForeignObjectElement" {
+class ForeignObjectElement extends GraphicsElement implements ExternalResourcesRequired native "SVGForeignObjectElement" {
   // To suppress missing implicit constructor warnings.
   factory ForeignObjectElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -2881,68 +2578,6 @@
   @DomName('SVGForeignObjectElement.externalResourcesRequired')
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  @DomName('SVGForeignObjectElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGForeignObjectElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGForeignObjectElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGForeignObjectElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGForeignObjectElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGForeignObjectElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGForeignObjectElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGForeignObjectElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTests
-
-  @DomName('SVGForeignObjectElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGForeignObjectElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGForeignObjectElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGForeignObjectElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGForeignObjectElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
 }
 // 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
@@ -2952,7 +2587,7 @@
 @DocsEditable()
 @DomName('SVGGElement')
 @Unstable()
-class GElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace native "SVGGElement" {
+class GElement extends GraphicsElement implements ExternalResourcesRequired native "SVGGElement" {
   // To suppress missing implicit constructor warnings.
   factory GElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -2965,68 +2600,77 @@
   @DomName('SVGGElement.externalResourcesRequired')
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
+}
+// 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.
 
-  // From SVGLangSpace
 
-  @DomName('SVGGElement.xmllang')
+@DocsEditable()
+@DomName('SVGGraphicsElement')
+@Experimental() // untriaged
+class GraphicsElement extends StyledElement implements Tests native "SVGGraphicsElement" {
+  // To suppress missing implicit constructor warnings.
+  factory GraphicsElement._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('SVGGraphicsElement.farthestViewportElement')
   @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGGElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGGElement.farthestViewportElement')
-  @DocsEditable()
+  @Experimental() // untriaged
   final SvgElement farthestViewportElement;
 
-  @DomName('SVGGElement.nearestViewportElement')
+  @DomName('SVGGraphicsElement.nearestViewportElement')
   @DocsEditable()
+  @Experimental() // untriaged
   final SvgElement nearestViewportElement;
 
-  @DomName('SVGGElement.getBBox')
+  @DomName('SVGGraphicsElement.transform')
   @DocsEditable()
+  @Experimental() // untriaged
+  final AnimatedTransformList transform;
+
+  @DomName('SVGGraphicsElement.getBBox')
+  @DocsEditable()
+  @Experimental() // untriaged
   Rect getBBox() native;
 
   @JSName('getCTM')
-  @DomName('SVGGElement.getCTM')
+  @DomName('SVGGraphicsElement.getCTM')
   @DocsEditable()
+  @Experimental() // untriaged
   Matrix getCtm() native;
 
   @JSName('getScreenCTM')
-  @DomName('SVGGElement.getScreenCTM')
+  @DomName('SVGGraphicsElement.getScreenCTM')
   @DocsEditable()
+  @Experimental() // untriaged
   Matrix getScreenCtm() native;
 
-  @DomName('SVGGElement.getTransformToElement')
+  @DomName('SVGGraphicsElement.getTransformToElement')
   @DocsEditable()
+  @Experimental() // untriaged
   Matrix getTransformToElement(SvgElement element) native;
 
   // From SVGTests
 
-  @DomName('SVGGElement.requiredExtensions')
+  @DomName('SVGGraphicsElement.requiredExtensions')
   @DocsEditable()
+  @Experimental() // untriaged
   final StringList requiredExtensions;
 
-  @DomName('SVGGElement.requiredFeatures')
+  @DomName('SVGGraphicsElement.requiredFeatures')
   @DocsEditable()
+  @Experimental() // untriaged
   final StringList requiredFeatures;
 
-  @DomName('SVGGElement.systemLanguage')
+  @DomName('SVGGraphicsElement.systemLanguage')
   @DocsEditable()
+  @Experimental() // untriaged
   final StringList systemLanguage;
 
-  @DomName('SVGGElement.hasExtension')
+  @DomName('SVGGraphicsElement.hasExtension')
   @DocsEditable()
+  @Experimental() // untriaged
   bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGGElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
 }
 // 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
@@ -3036,7 +2680,7 @@
 @DocsEditable()
 @DomName('SVGImageElement')
 @Unstable()
-class ImageElement extends StyledElement implements Transformable, ExternalResourcesRequired, UriReference, Tests, LangSpace native "SVGImageElement" {
+class ImageElement extends GraphicsElement implements UriReference, ExternalResourcesRequired native "SVGImageElement" {
   // To suppress missing implicit constructor warnings.
   factory ImageElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -3070,68 +2714,6 @@
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
 
-  // From SVGLangSpace
-
-  @DomName('SVGImageElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGImageElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGImageElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGImageElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGImageElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGImageElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGImageElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGImageElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTests
-
-  @DomName('SVGImageElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGImageElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGImageElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGImageElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGImageElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
-
   // From SVGURIReference
 
   @DomName('SVGImageElement.href')
@@ -3144,23 +2726,6 @@
 
 
 @DocsEditable()
-@DomName('SVGLangSpace')
-@Unstable()
-abstract class LangSpace extends Interceptor {
-
-  /// Checks if this type is supported on the current platform.
-  static bool supported(SvgElement element) => JS('bool', '#.xmlspace !== undefined && #.xmllang !== undefined', element, element);
-
-  String xmllang;
-
-  String xmlspace;
-}
-// 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('SVGLength')
 @Unstable()
 class Length extends Interceptor native "SVGLength" {
@@ -3329,7 +2894,7 @@
 @DocsEditable()
 @DomName('SVGLineElement')
 @Unstable()
-class LineElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace native "SVGLineElement" {
+class LineElement extends GraphicsElement implements ExternalResourcesRequired native "SVGLineElement" {
   // To suppress missing implicit constructor warnings.
   factory LineElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -3358,68 +2923,6 @@
   @DomName('SVGLineElement.externalResourcesRequired')
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  @DomName('SVGLineElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGLineElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGLineElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGLineElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGLineElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGLineElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGLineElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGLineElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTests
-
-  @DomName('SVGLineElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGLineElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGLineElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGLineElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGLineElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
 }
 // 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
@@ -3459,31 +2962,9 @@
 
 
 @DocsEditable()
-@DomName('SVGLocatable')
-@Unstable()
-abstract class Locatable extends Interceptor {
-
-  SvgElement farthestViewportElement;
-
-  SvgElement nearestViewportElement;
-
-  Rect getBBox();
-
-  Matrix getCTM();
-
-  Matrix getScreenCTM();
-
-  Matrix getTransformToElement(SvgElement element);
-}
-// 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('SVGMarkerElement')
 @Unstable()
-class MarkerElement extends StyledElement implements FitToViewBox, ExternalResourcesRequired, LangSpace native "SVGMarkerElement" {
+class MarkerElement extends StyledElement implements FitToViewBox, ExternalResourcesRequired native "SVGMarkerElement" {
   // To suppress missing implicit constructor warnings.
   factory MarkerElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -3566,16 +3047,6 @@
   @DomName('SVGMarkerElement.viewBox')
   @DocsEditable()
   final AnimatedRect viewBox;
-
-  // From SVGLangSpace
-
-  @DomName('SVGMarkerElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGMarkerElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
 }
 // 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
@@ -3585,7 +3056,7 @@
 @DocsEditable()
 @DomName('SVGMaskElement')
 @Unstable()
-class MaskElement extends StyledElement implements ExternalResourcesRequired, Tests, LangSpace native "SVGMaskElement" {
+class MaskElement extends StyledElement implements ExternalResourcesRequired, Tests native "SVGMaskElement" {
   // To suppress missing implicit constructor warnings.
   factory MaskElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -3623,16 +3094,6 @@
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
 
-  // From SVGLangSpace
-
-  @DomName('SVGMaskElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGMaskElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
   // From SVGTests
 
   @DomName('SVGMaskElement.requiredExtensions')
@@ -3851,7 +3312,7 @@
 @DocsEditable()
 @DomName('SVGPathElement')
 @Unstable()
-class PathElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace native "SVGPathElement" {
+class PathElement extends GraphicsElement implements ExternalResourcesRequired native "SVGPathElement" {
   // To suppress missing implicit constructor warnings.
   factory PathElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -3991,68 +3452,6 @@
   @DomName('SVGPathElement.externalResourcesRequired')
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  @DomName('SVGPathElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGPathElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGPathElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGPathElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGPathElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGPathElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGPathElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGPathElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTests
-
-  @DomName('SVGPathElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGPathElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGPathElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGPathElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGPathElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
 }
 // 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
@@ -4708,7 +4107,7 @@
 @DocsEditable()
 @DomName('SVGPatternElement')
 @Unstable()
-class PatternElement extends StyledElement implements FitToViewBox, UriReference, ExternalResourcesRequired, Tests, LangSpace native "SVGPatternElement" {
+class PatternElement extends StyledElement implements FitToViewBox, UriReference, ExternalResourcesRequired, Tests native "SVGPatternElement" {
   // To suppress missing implicit constructor warnings.
   factory PatternElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -4760,16 +4159,6 @@
   @DocsEditable()
   final AnimatedRect viewBox;
 
-  // From SVGLangSpace
-
-  @DomName('SVGPatternElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGPatternElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
   // From SVGTests
 
   @DomName('SVGPatternElement.requiredExtensions')
@@ -4866,7 +4255,7 @@
 @DocsEditable()
 @DomName('SVGPolygonElement')
 @Unstable()
-class PolygonElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace native "SVGPolygonElement" {
+class PolygonElement extends GraphicsElement implements ExternalResourcesRequired native "SVGPolygonElement" {
   // To suppress missing implicit constructor warnings.
   factory PolygonElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -4887,68 +4276,6 @@
   @DomName('SVGPolygonElement.externalResourcesRequired')
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  @DomName('SVGPolygonElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGPolygonElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGPolygonElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGPolygonElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGPolygonElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGPolygonElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGPolygonElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGPolygonElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTests
-
-  @DomName('SVGPolygonElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGPolygonElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGPolygonElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGPolygonElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGPolygonElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
 }
 // 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
@@ -4958,7 +4285,7 @@
 @DocsEditable()
 @DomName('SVGPolylineElement')
 @Unstable()
-class PolylineElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace native "SVGPolylineElement" {
+class PolylineElement extends GraphicsElement implements ExternalResourcesRequired native "SVGPolylineElement" {
   // To suppress missing implicit constructor warnings.
   factory PolylineElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -4979,68 +4306,6 @@
   @DomName('SVGPolylineElement.externalResourcesRequired')
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  @DomName('SVGPolylineElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGPolylineElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGPolylineElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGPolylineElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGPolylineElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGPolylineElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGPolylineElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGPolylineElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTests
-
-  @DomName('SVGPolylineElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGPolylineElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGPolylineElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGPolylineElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGPolylineElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
 }
 // 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
@@ -5190,7 +4455,7 @@
 @DocsEditable()
 @DomName('SVGRectElement')
 @Unstable()
-class RectElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace native "SVGRectElement" {
+class RectElement extends GraphicsElement implements ExternalResourcesRequired native "SVGRectElement" {
   // To suppress missing implicit constructor warnings.
   factory RectElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -5227,68 +4492,6 @@
   @DomName('SVGRectElement.externalResourcesRequired')
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  @DomName('SVGRectElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGRectElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGRectElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGRectElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGRectElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGRectElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGRectElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGRectElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTests
-
-  @DomName('SVGRectElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGRectElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGRectElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGRectElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGRectElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
 }
 // 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
@@ -5496,7 +4699,7 @@
 @DomName('SVGStyleElement')
 // http://www.w3.org/TR/SVG/types.html#InterfaceSVGStylable
 @Experimental() // nonstandard
-class StyleElement extends SvgElement implements LangSpace native "SVGStyleElement" {
+class StyleElement extends SvgElement native "SVGStyleElement" {
   // To suppress missing implicit constructor warnings.
   factory StyleElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -5522,16 +4725,6 @@
   @DomName('SVGStyleElement.type')
   @DocsEditable()
   String type;
-
-  // From SVGLangSpace
-
-  @DomName('SVGStyleElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGStyleElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
 }
 // 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
@@ -5707,6 +4900,16 @@
   @DocsEditable()
   String xmlbase;
 
+  @DomName('SVGElement.xmllang')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String xmllang;
+
+  @DomName('SVGElement.xmlspace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String xmlspace;
+
 }
 // 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
@@ -5715,7 +4918,7 @@
 
 @DomName('SVGSVGElement')
 @Unstable()
-class SvgSvgElement extends StyledElement implements FitToViewBox, Transformable, Tests, ExternalResourcesRequired, ZoomAndPan, LangSpace native "SVGSVGElement" {
+class SvgSvgElement extends GraphicsElement implements FitToViewBox, ExternalResourcesRequired, ZoomAndPan native "SVGSVGElement" {
   factory SvgSvgElement() => _SvgSvgElementFactoryProvider.createSvgSvgElement();
 
   // To suppress missing implicit constructor warnings.
@@ -5901,68 +5104,6 @@
   @DocsEditable()
   final AnimatedRect viewBox;
 
-  // From SVGLangSpace
-
-  @DomName('SVGSVGElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGSVGElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGSVGElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGSVGElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGSVGElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGSVGElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGSVGElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGSVGElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTests
-
-  @DomName('SVGSVGElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGSVGElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGSVGElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGSVGElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGSVGElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
-
   // From SVGZoomAndPan
 
   @DomName('SVGSVGElement.zoomAndPan')
@@ -5978,7 +5119,7 @@
 @DocsEditable()
 @DomName('SVGSwitchElement')
 @Unstable()
-class SwitchElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace native "SVGSwitchElement" {
+class SwitchElement extends GraphicsElement implements ExternalResourcesRequired native "SVGSwitchElement" {
   // To suppress missing implicit constructor warnings.
   factory SwitchElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -5991,68 +5132,6 @@
   @DomName('SVGSwitchElement.externalResourcesRequired')
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  @DomName('SVGSwitchElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGSwitchElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGSwitchElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGSwitchElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGSwitchElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGSwitchElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGSwitchElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGSwitchElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTests
-
-  @DomName('SVGSwitchElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGSwitchElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGSwitchElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGSwitchElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGSwitchElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
 }
 // 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
@@ -6062,7 +5141,7 @@
 @DocsEditable()
 @DomName('SVGSymbolElement')
 @Unstable()
-class SymbolElement extends StyledElement implements FitToViewBox, ExternalResourcesRequired, LangSpace native "SVGSymbolElement" {
+class SymbolElement extends StyledElement implements FitToViewBox, ExternalResourcesRequired native "SVGSymbolElement" {
   // To suppress missing implicit constructor warnings.
   factory SymbolElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6085,16 +5164,6 @@
   @DomName('SVGSymbolElement.viewBox')
   @DocsEditable()
   final AnimatedRect viewBox;
-
-  // From SVGLangSpace
-
-  @DomName('SVGSymbolElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGSymbolElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
 }
 // 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
@@ -6138,7 +5207,7 @@
 @DocsEditable()
 @DomName('SVGTextContentElement')
 @Unstable()
-class TextContentElement extends StyledElement implements ExternalResourcesRequired, Tests, LangSpace native "SVGTextContentElement" {
+class TextContentElement extends GraphicsElement implements ExternalResourcesRequired native "SVGTextContentElement" {
   // To suppress missing implicit constructor warnings.
   factory TextContentElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6203,34 +5272,6 @@
   @DomName('SVGTextContentElement.externalResourcesRequired')
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
-
-  // From SVGLangSpace
-
-  @DomName('SVGTextContentElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGTextContentElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGTests
-
-  @DomName('SVGTextContentElement.requiredExtensions')
-  @DocsEditable()
-  final StringList requiredExtensions;
-
-  @DomName('SVGTextContentElement.requiredFeatures')
-  @DocsEditable()
-  final StringList requiredFeatures;
-
-  @DomName('SVGTextContentElement.systemLanguage')
-  @DocsEditable()
-  final StringList systemLanguage;
-
-  @DomName('SVGTextContentElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) 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
@@ -6240,47 +5281,13 @@
 @DocsEditable()
 @DomName('SVGTextElement')
 @Unstable()
-class TextElement extends TextPositioningElement implements Transformable native "SVGTextElement" {
+class TextElement extends TextPositioningElement native "SVGTextElement" {
   // To suppress missing implicit constructor warnings.
   factory TextElement._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('SVGTextElement.SVGTextElement')
   @DocsEditable()
   factory TextElement() => _SvgElementFactoryProvider.createSvgElement_tag("text");
-
-  // From SVGLocatable
-
-  @DomName('SVGTextElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGTextElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGTextElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGTextElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGTextElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGTextElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
-  // From SVGTransformable
-
-  @DomName('SVGTextElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
 }
 // 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
@@ -6376,23 +5383,13 @@
 @DocsEditable()
 @DomName('SVGTitleElement')
 @Unstable()
-class TitleElement extends StyledElement implements LangSpace native "SVGTitleElement" {
+class TitleElement extends StyledElement native "SVGTitleElement" {
   // To suppress missing implicit constructor warnings.
   factory TitleElement._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('SVGTitleElement.SVGTitleElement')
   @DocsEditable()
   factory TitleElement() => _SvgElementFactoryProvider.createSvgElement_tag("title");
-
-  // From SVGLangSpace
-
-  @DomName('SVGTitleElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGTitleElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
 }
 // 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
@@ -6571,32 +5568,6 @@
 
 
 @DocsEditable()
-@DomName('SVGTransformable')
-@Unstable()
-abstract class Transformable extends Interceptor implements Locatable {
-
-  AnimatedTransformList transform;
-
-  // From SVGLocatable
-
-  SvgElement farthestViewportElement;
-
-  SvgElement nearestViewportElement;
-
-  Rect getBBox();
-
-  Matrix getCTM();
-
-  Matrix getScreenCTM();
-
-  Matrix getTransformToElement(SvgElement element);
-}
-// 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('SVGUnitTypes')
 @Unstable()
 class UnitTypes extends Interceptor native "SVGUnitTypes" {
@@ -6633,7 +5604,7 @@
 @DocsEditable()
 @DomName('SVGUseElement')
 @Unstable()
-class UseElement extends StyledElement implements Transformable, ExternalResourcesRequired, UriReference, Tests, LangSpace native "SVGUseElement" {
+class UseElement extends GraphicsElement implements UriReference, ExternalResourcesRequired, Tests native "SVGUseElement" {
   // To suppress missing implicit constructor warnings.
   factory UseElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6671,44 +5642,6 @@
   @DocsEditable()
   final AnimatedBoolean externalResourcesRequired;
 
-  // From SVGLangSpace
-
-  @DomName('SVGUseElement.xmllang')
-  @DocsEditable()
-  String xmllang;
-
-  @DomName('SVGUseElement.xmlspace')
-  @DocsEditable()
-  String xmlspace;
-
-  // From SVGLocatable
-
-  @DomName('SVGUseElement.farthestViewportElement')
-  @DocsEditable()
-  final SvgElement farthestViewportElement;
-
-  @DomName('SVGUseElement.nearestViewportElement')
-  @DocsEditable()
-  final SvgElement nearestViewportElement;
-
-  @DomName('SVGUseElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native;
-
-  @JSName('getCTM')
-  @DomName('SVGUseElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native;
-
-  @JSName('getScreenCTM')
-  @DomName('SVGUseElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native;
-
-  @DomName('SVGUseElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native;
-
   // From SVGTests
 
   @DomName('SVGUseElement.requiredExtensions')
@@ -6727,12 +5660,6 @@
   @DocsEditable()
   bool hasExtension(String extension) native;
 
-  // From SVGTransformable
-
-  @DomName('SVGUseElement.transform')
-  @DocsEditable()
-  final AnimatedTransformList transform;
-
   // From SVGURIReference
 
   @DomName('SVGUseElement.href')
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index a4bea12..69dc8ab 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -63,7 +63,7 @@
 @DocsEditable()
 @DomName('SVGAElement')
 @Unstable()
-class AElement extends StyledElement implements Transformable, ExternalResourcesRequired, UriReference, Tests, LangSpace {
+class AElement extends GraphicsElement implements UriReference, ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory AElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -79,66 +79,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGAElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGAElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGAElement_xmllang_Getter";
-
-  @DomName('SVGAElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGAElement_xmllang_Setter";
-
-  @DomName('SVGAElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGAElement_xmlspace_Getter";
-
-  @DomName('SVGAElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGAElement_xmlspace_Setter";
-
-  @DomName('SVGAElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGAElement_farthestViewportElement_Getter";
-
-  @DomName('SVGAElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGAElement_nearestViewportElement_Getter";
-
-  @DomName('SVGAElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGAElement_getBBox_Callback";
-
-  @DomName('SVGAElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGAElement_getCTM_Callback";
-
-  @DomName('SVGAElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGAElement_getScreenCTM_Callback";
-
-  @DomName('SVGAElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGAElement_getTransformToElement_Callback";
-
-  @DomName('SVGAElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGAElement_requiredExtensions_Getter";
-
-  @DomName('SVGAElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGAElement_requiredFeatures_Getter";
-
-  @DomName('SVGAElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGAElement_systemLanguage_Getter";
-
-  @DomName('SVGAElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGAElement_hasExtension_Callback";
-
-  @DomName('SVGAElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGAElement_transform_Getter";
-
   @DomName('SVGAElement.href')
   @DocsEditable()
   AnimatedString get href native "SVGAElement_href_Getter";
@@ -615,7 +555,7 @@
 @DocsEditable()
 @DomName('SVGAnimationElement')
 @Unstable()
-class AnimationElement extends SvgElement implements ExternalResourcesRequired, ElementTimeControl, Tests {
+class AnimationElement extends SvgElement implements ExternalResourcesRequired, Tests {
   // To suppress missing implicit constructor warnings.
   factory AnimationElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -627,18 +567,6 @@
   @DocsEditable()
   SvgElement get targetElement native "SVGAnimationElement_targetElement_Getter";
 
-  @DomName('SVGAnimationElement.getCurrentTime')
-  @DocsEditable()
-  num getCurrentTime() native "SVGAnimationElement_getCurrentTime_Callback";
-
-  @DomName('SVGAnimationElement.getSimpleDuration')
-  @DocsEditable()
-  num getSimpleDuration() native "SVGAnimationElement_getSimpleDuration_Callback";
-
-  @DomName('SVGAnimationElement.getStartTime')
-  @DocsEditable()
-  num getStartTime() native "SVGAnimationElement_getStartTime_Callback";
-
   @DomName('SVGAnimationElement.beginElement')
   @DocsEditable()
   void beginElement() native "SVGAnimationElement_beginElement_Callback";
@@ -655,6 +583,18 @@
   @DocsEditable()
   void endElementAt(num offset) native "SVGAnimationElement_endElementAt_Callback";
 
+  @DomName('SVGAnimationElement.getCurrentTime')
+  @DocsEditable()
+  num getCurrentTime() native "SVGAnimationElement_getCurrentTime_Callback";
+
+  @DomName('SVGAnimationElement.getSimpleDuration')
+  @DocsEditable()
+  num getSimpleDuration() native "SVGAnimationElement_getSimpleDuration_Callback";
+
+  @DomName('SVGAnimationElement.getStartTime')
+  @DocsEditable()
+  num getStartTime() native "SVGAnimationElement_getStartTime_Callback";
+
   @DomName('SVGAnimationElement.externalResourcesRequired')
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGAnimationElement_externalResourcesRequired_Getter";
@@ -686,7 +626,7 @@
 @DocsEditable()
 @DomName('SVGCircleElement')
 @Unstable()
-class CircleElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace {
+class CircleElement extends GraphicsElement implements ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory CircleElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -710,66 +650,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGCircleElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGCircleElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGCircleElement_xmllang_Getter";
-
-  @DomName('SVGCircleElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGCircleElement_xmllang_Setter";
-
-  @DomName('SVGCircleElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGCircleElement_xmlspace_Getter";
-
-  @DomName('SVGCircleElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGCircleElement_xmlspace_Setter";
-
-  @DomName('SVGCircleElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGCircleElement_farthestViewportElement_Getter";
-
-  @DomName('SVGCircleElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGCircleElement_nearestViewportElement_Getter";
-
-  @DomName('SVGCircleElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGCircleElement_getBBox_Callback";
-
-  @DomName('SVGCircleElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGCircleElement_getCTM_Callback";
-
-  @DomName('SVGCircleElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGCircleElement_getScreenCTM_Callback";
-
-  @DomName('SVGCircleElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGCircleElement_getTransformToElement_Callback";
-
-  @DomName('SVGCircleElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGCircleElement_requiredExtensions_Getter";
-
-  @DomName('SVGCircleElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGCircleElement_requiredFeatures_Getter";
-
-  @DomName('SVGCircleElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGCircleElement_systemLanguage_Getter";
-
-  @DomName('SVGCircleElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGCircleElement_hasExtension_Callback";
-
-  @DomName('SVGCircleElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGCircleElement_transform_Getter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -781,7 +661,7 @@
 @DocsEditable()
 @DomName('SVGClipPathElement')
 @Unstable()
-class ClipPathElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace {
+class ClipPathElement extends GraphicsElement implements ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory ClipPathElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -797,66 +677,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGClipPathElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGClipPathElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGClipPathElement_xmllang_Getter";
-
-  @DomName('SVGClipPathElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGClipPathElement_xmllang_Setter";
-
-  @DomName('SVGClipPathElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGClipPathElement_xmlspace_Getter";
-
-  @DomName('SVGClipPathElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGClipPathElement_xmlspace_Setter";
-
-  @DomName('SVGClipPathElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGClipPathElement_farthestViewportElement_Getter";
-
-  @DomName('SVGClipPathElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGClipPathElement_nearestViewportElement_Getter";
-
-  @DomName('SVGClipPathElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGClipPathElement_getBBox_Callback";
-
-  @DomName('SVGClipPathElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGClipPathElement_getCTM_Callback";
-
-  @DomName('SVGClipPathElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGClipPathElement_getScreenCTM_Callback";
-
-  @DomName('SVGClipPathElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGClipPathElement_getTransformToElement_Callback";
-
-  @DomName('SVGClipPathElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGClipPathElement_requiredExtensions_Getter";
-
-  @DomName('SVGClipPathElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGClipPathElement_requiredFeatures_Getter";
-
-  @DomName('SVGClipPathElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGClipPathElement_systemLanguage_Getter";
-
-  @DomName('SVGClipPathElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGClipPathElement_hasExtension_Callback";
-
-  @DomName('SVGClipPathElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGClipPathElement_transform_Getter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -868,7 +688,7 @@
 @DocsEditable()
 @DomName('SVGDefsElement')
 @Unstable()
-class DefsElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace {
+class DefsElement extends GraphicsElement implements ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory DefsElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -880,66 +700,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGDefsElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGDefsElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGDefsElement_xmllang_Getter";
-
-  @DomName('SVGDefsElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGDefsElement_xmllang_Setter";
-
-  @DomName('SVGDefsElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGDefsElement_xmlspace_Getter";
-
-  @DomName('SVGDefsElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGDefsElement_xmlspace_Setter";
-
-  @DomName('SVGDefsElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGDefsElement_farthestViewportElement_Getter";
-
-  @DomName('SVGDefsElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGDefsElement_nearestViewportElement_Getter";
-
-  @DomName('SVGDefsElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGDefsElement_getBBox_Callback";
-
-  @DomName('SVGDefsElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGDefsElement_getCTM_Callback";
-
-  @DomName('SVGDefsElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGDefsElement_getScreenCTM_Callback";
-
-  @DomName('SVGDefsElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGDefsElement_getTransformToElement_Callback";
-
-  @DomName('SVGDefsElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGDefsElement_requiredExtensions_Getter";
-
-  @DomName('SVGDefsElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGDefsElement_requiredFeatures_Getter";
-
-  @DomName('SVGDefsElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGDefsElement_systemLanguage_Getter";
-
-  @DomName('SVGDefsElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGDefsElement_hasExtension_Callback";
-
-  @DomName('SVGDefsElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGDefsElement_transform_Getter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -951,7 +711,7 @@
 @DocsEditable()
 @DomName('SVGDescElement')
 @Unstable()
-class DescElement extends StyledElement implements LangSpace {
+class DescElement extends StyledElement {
   // To suppress missing implicit constructor warnings.
   factory DescElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -959,22 +719,6 @@
   @DocsEditable()
   factory DescElement() => _SvgElementFactoryProvider.createSvgElement_tag("desc");
 
-  @DomName('SVGDescElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGDescElement_xmllang_Getter";
-
-  @DomName('SVGDescElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGDescElement_xmllang_Setter";
-
-  @DomName('SVGDescElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGDescElement_xmlspace_Getter";
-
-  @DomName('SVGDescElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGDescElement_xmlspace_Setter";
-
 }
 // 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
@@ -1094,6 +838,16 @@
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseDownEvent = const EventStreamProvider<MouseEvent>('mousedown');
 
+  @DomName('SVGElementInstance.mouseenterEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MouseEvent> mouseEnterEvent = const EventStreamProvider<MouseEvent>('mouseenter');
+
+  @DomName('SVGElementInstance.mouseleaveEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<MouseEvent> mouseLeaveEvent = const EventStreamProvider<MouseEvent>('mouseleave');
+
   @DomName('SVGElementInstance.mousemoveEvent')
   @DocsEditable()
   static const EventStreamProvider<MouseEvent> mouseMoveEvent = const EventStreamProvider<MouseEvent>('mousemove');
@@ -1184,6 +938,21 @@
   @DocsEditable()
   ElementInstance get previousSibling native "SVGElementInstance_previousSibling_Getter";
 
+  @DomName('SVGElementInstance.addEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SVGElementInstance_addEventListener_Callback";
+
+  @DomName('SVGElementInstance.dispatchEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool dispatchEvent(Event event) native "SVGElementInstance_dispatchEvent_Callback";
+
+  @DomName('SVGElementInstance.removeEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SVGElementInstance_removeEventListener_Callback";
+
   @DomName('SVGElementInstance.onabort')
   @DocsEditable()
   Stream<Event> get onAbort => abortEvent.forTarget(this);
@@ -1288,6 +1057,16 @@
   @DocsEditable()
   Stream<MouseEvent> get onMouseDown => mouseDownEvent.forTarget(this);
 
+  @DomName('SVGElementInstance.onmouseenter')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MouseEvent> get onMouseEnter => mouseEnterEvent.forTarget(this);
+
+  @DomName('SVGElementInstance.onmouseleave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<MouseEvent> get onMouseLeave => mouseLeaveEvent.forTarget(this);
+
   @DomName('SVGElementInstance.onmousemove')
   @DocsEditable()
   Stream<MouseEvent> get onMouseMove => mouseMoveEvent.forTarget(this);
@@ -1357,7 +1136,7 @@
 @DocsEditable()
 @DomName('SVGEllipseElement')
 @Unstable()
-class EllipseElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace {
+class EllipseElement extends GraphicsElement implements ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory EllipseElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -1385,66 +1164,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGEllipseElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGEllipseElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGEllipseElement_xmllang_Getter";
-
-  @DomName('SVGEllipseElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGEllipseElement_xmllang_Setter";
-
-  @DomName('SVGEllipseElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGEllipseElement_xmlspace_Getter";
-
-  @DomName('SVGEllipseElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGEllipseElement_xmlspace_Setter";
-
-  @DomName('SVGEllipseElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGEllipseElement_farthestViewportElement_Getter";
-
-  @DomName('SVGEllipseElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGEllipseElement_nearestViewportElement_Getter";
-
-  @DomName('SVGEllipseElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGEllipseElement_getBBox_Callback";
-
-  @DomName('SVGEllipseElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGEllipseElement_getCTM_Callback";
-
-  @DomName('SVGEllipseElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGEllipseElement_getScreenCTM_Callback";
-
-  @DomName('SVGEllipseElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGEllipseElement_getTransformToElement_Callback";
-
-  @DomName('SVGEllipseElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGEllipseElement_requiredExtensions_Getter";
-
-  @DomName('SVGEllipseElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGEllipseElement_requiredFeatures_Getter";
-
-  @DomName('SVGEllipseElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGEllipseElement_systemLanguage_Getter";
-
-  @DomName('SVGEllipseElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGEllipseElement_hasExtension_Callback";
-
-  @DomName('SVGEllipseElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGEllipseElement_transform_Getter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -2289,7 +2008,7 @@
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
-class FEImageElement extends StyledElement implements FilterPrimitiveStandardAttributes, UriReference, ExternalResourcesRequired, LangSpace {
+class FEImageElement extends StyledElement implements FilterPrimitiveStandardAttributes, UriReference, ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory FEImageElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -2328,22 +2047,6 @@
   @DocsEditable()
   AnimatedLength get y native "SVGFEImageElement_y_Getter";
 
-  @DomName('SVGFEImageElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGFEImageElement_xmllang_Getter";
-
-  @DomName('SVGFEImageElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGFEImageElement_xmllang_Setter";
-
-  @DomName('SVGFEImageElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGFEImageElement_xmlspace_Getter";
-
-  @DomName('SVGFEImageElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGFEImageElement_xmlspace_Setter";
-
   @DomName('SVGFEImageElement.href')
   @DocsEditable()
   AnimatedString get href native "SVGFEImageElement_href_Getter";
@@ -2870,7 +2573,7 @@
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
-class FilterElement extends StyledElement implements UriReference, ExternalResourcesRequired, LangSpace {
+class FilterElement extends StyledElement implements UriReference, ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory FilterElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -2921,22 +2624,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGFilterElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGFilterElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGFilterElement_xmllang_Getter";
-
-  @DomName('SVGFilterElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGFilterElement_xmllang_Setter";
-
-  @DomName('SVGFilterElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGFilterElement_xmlspace_Getter";
-
-  @DomName('SVGFilterElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGFilterElement_xmlspace_Setter";
-
   @DomName('SVGFilterElement.href')
   @DocsEditable()
   AnimatedString get href native "SVGFilterElement_href_Getter";
@@ -3009,7 +2696,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Unstable()
-class ForeignObjectElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace {
+class ForeignObjectElement extends GraphicsElement implements ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory ForeignObjectElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -3040,66 +2727,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGForeignObjectElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGForeignObjectElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGForeignObjectElement_xmllang_Getter";
-
-  @DomName('SVGForeignObjectElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGForeignObjectElement_xmllang_Setter";
-
-  @DomName('SVGForeignObjectElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGForeignObjectElement_xmlspace_Getter";
-
-  @DomName('SVGForeignObjectElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGForeignObjectElement_xmlspace_Setter";
-
-  @DomName('SVGForeignObjectElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGForeignObjectElement_farthestViewportElement_Getter";
-
-  @DomName('SVGForeignObjectElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGForeignObjectElement_nearestViewportElement_Getter";
-
-  @DomName('SVGForeignObjectElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGForeignObjectElement_getBBox_Callback";
-
-  @DomName('SVGForeignObjectElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGForeignObjectElement_getCTM_Callback";
-
-  @DomName('SVGForeignObjectElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGForeignObjectElement_getScreenCTM_Callback";
-
-  @DomName('SVGForeignObjectElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGForeignObjectElement_getTransformToElement_Callback";
-
-  @DomName('SVGForeignObjectElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGForeignObjectElement_requiredExtensions_Getter";
-
-  @DomName('SVGForeignObjectElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGForeignObjectElement_requiredFeatures_Getter";
-
-  @DomName('SVGForeignObjectElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGForeignObjectElement_systemLanguage_Getter";
-
-  @DomName('SVGForeignObjectElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGForeignObjectElement_hasExtension_Callback";
-
-  @DomName('SVGForeignObjectElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGForeignObjectElement_transform_Getter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -3111,7 +2738,7 @@
 @DocsEditable()
 @DomName('SVGGElement')
 @Unstable()
-class GElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace {
+class GElement extends GraphicsElement implements ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory GElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -3123,65 +2750,75 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGGElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGGElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGGElement_xmllang_Getter";
+}
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
 
-  @DomName('SVGGElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGGElement_xmllang_Setter";
+// WARNING: Do not edit - generated code.
 
-  @DomName('SVGGElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGGElement_xmlspace_Getter";
 
-  @DomName('SVGGElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGGElement_xmlspace_Setter";
+@DocsEditable()
+@DomName('SVGGraphicsElement')
+@Experimental() // untriaged
+class GraphicsElement extends StyledElement implements Tests {
+  // To suppress missing implicit constructor warnings.
+  factory GraphicsElement._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('SVGGElement.farthestViewportElement')
+  @DomName('SVGGraphicsElement.farthestViewportElement')
   @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGGElement_farthestViewportElement_Getter";
+  @Experimental() // untriaged
+  SvgElement get farthestViewportElement native "SVGGraphicsElement_farthestViewportElement_Getter";
 
-  @DomName('SVGGElement.nearestViewportElement')
+  @DomName('SVGGraphicsElement.nearestViewportElement')
   @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGGElement_nearestViewportElement_Getter";
+  @Experimental() // untriaged
+  SvgElement get nearestViewportElement native "SVGGraphicsElement_nearestViewportElement_Getter";
 
-  @DomName('SVGGElement.getBBox')
+  @DomName('SVGGraphicsElement.transform')
   @DocsEditable()
-  Rect getBBox() native "SVGGElement_getBBox_Callback";
+  @Experimental() // untriaged
+  AnimatedTransformList get transform native "SVGGraphicsElement_transform_Getter";
 
-  @DomName('SVGGElement.getCTM')
+  @DomName('SVGGraphicsElement.getBBox')
   @DocsEditable()
-  Matrix getCtm() native "SVGGElement_getCTM_Callback";
+  @Experimental() // untriaged
+  Rect getBBox() native "SVGGraphicsElement_getBBox_Callback";
 
-  @DomName('SVGGElement.getScreenCTM')
+  @DomName('SVGGraphicsElement.getCTM')
   @DocsEditable()
-  Matrix getScreenCtm() native "SVGGElement_getScreenCTM_Callback";
+  @Experimental() // untriaged
+  Matrix getCtm() native "SVGGraphicsElement_getCTM_Callback";
 
-  @DomName('SVGGElement.getTransformToElement')
+  @DomName('SVGGraphicsElement.getScreenCTM')
   @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGGElement_getTransformToElement_Callback";
+  @Experimental() // untriaged
+  Matrix getScreenCtm() native "SVGGraphicsElement_getScreenCTM_Callback";
 
-  @DomName('SVGGElement.requiredExtensions')
+  @DomName('SVGGraphicsElement.getTransformToElement')
   @DocsEditable()
-  StringList get requiredExtensions native "SVGGElement_requiredExtensions_Getter";
+  @Experimental() // untriaged
+  Matrix getTransformToElement(SvgElement element) native "SVGGraphicsElement_getTransformToElement_Callback";
 
-  @DomName('SVGGElement.requiredFeatures')
+  @DomName('SVGGraphicsElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredFeatures native "SVGGElement_requiredFeatures_Getter";
+  @Experimental() // untriaged
+  StringList get requiredExtensions native "SVGGraphicsElement_requiredExtensions_Getter";
 
-  @DomName('SVGGElement.systemLanguage')
+  @DomName('SVGGraphicsElement.requiredFeatures')
   @DocsEditable()
-  StringList get systemLanguage native "SVGGElement_systemLanguage_Getter";
+  @Experimental() // untriaged
+  StringList get requiredFeatures native "SVGGraphicsElement_requiredFeatures_Getter";
 
-  @DomName('SVGGElement.hasExtension')
+  @DomName('SVGGraphicsElement.systemLanguage')
   @DocsEditable()
-  bool hasExtension(String extension) native "SVGGElement_hasExtension_Callback";
+  @Experimental() // untriaged
+  StringList get systemLanguage native "SVGGraphicsElement_systemLanguage_Getter";
 
-  @DomName('SVGGElement.transform')
+  @DomName('SVGGraphicsElement.hasExtension')
   @DocsEditable()
-  AnimatedTransformList get transform native "SVGGElement_transform_Getter";
+  @Experimental() // untriaged
+  bool hasExtension(String extension) native "SVGGraphicsElement_hasExtension_Callback";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3194,7 +2831,7 @@
 @DocsEditable()
 @DomName('SVGImageElement')
 @Unstable()
-class ImageElement extends StyledElement implements Transformable, ExternalResourcesRequired, UriReference, Tests, LangSpace {
+class ImageElement extends GraphicsElement implements UriReference, ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory ImageElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -3226,66 +2863,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGImageElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGImageElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGImageElement_xmllang_Getter";
-
-  @DomName('SVGImageElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGImageElement_xmllang_Setter";
-
-  @DomName('SVGImageElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGImageElement_xmlspace_Getter";
-
-  @DomName('SVGImageElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGImageElement_xmlspace_Setter";
-
-  @DomName('SVGImageElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGImageElement_farthestViewportElement_Getter";
-
-  @DomName('SVGImageElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGImageElement_nearestViewportElement_Getter";
-
-  @DomName('SVGImageElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGImageElement_getBBox_Callback";
-
-  @DomName('SVGImageElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGImageElement_getCTM_Callback";
-
-  @DomName('SVGImageElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGImageElement_getScreenCTM_Callback";
-
-  @DomName('SVGImageElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGImageElement_getTransformToElement_Callback";
-
-  @DomName('SVGImageElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGImageElement_requiredExtensions_Getter";
-
-  @DomName('SVGImageElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGImageElement_requiredFeatures_Getter";
-
-  @DomName('SVGImageElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGImageElement_systemLanguage_Getter";
-
-  @DomName('SVGImageElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGImageElement_hasExtension_Callback";
-
-  @DomName('SVGImageElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGImageElement_transform_Getter";
-
   @DomName('SVGImageElement.href')
   @DocsEditable()
   AnimatedString get href native "SVGImageElement_href_Getter";
@@ -3299,38 +2876,6 @@
 
 
 @DocsEditable()
-@DomName('SVGLangSpace')
-@Unstable()
-abstract class LangSpace extends NativeFieldWrapperClass1 {
-
-  /// Checks if this type is supported on the current platform.
-  static bool supported(SvgElement element) => true;
-
-  @DomName('SVGLangSpace.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGLangSpace_xmllang_Getter";
-
-  @DomName('SVGLangSpace.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGLangSpace_xmllang_Setter";
-
-  @DomName('SVGLangSpace.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGLangSpace_xmlspace_Getter";
-
-  @DomName('SVGLangSpace.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGLangSpace_xmlspace_Setter";
-
-}
-// 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('SVGLength')
 @Unstable()
 class Length extends NativeFieldWrapperClass1 {
@@ -3517,7 +3062,7 @@
 @DocsEditable()
 @DomName('SVGLineElement')
 @Unstable()
-class LineElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace {
+class LineElement extends GraphicsElement implements ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory LineElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -3545,66 +3090,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGLineElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGLineElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGLineElement_xmllang_Getter";
-
-  @DomName('SVGLineElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGLineElement_xmllang_Setter";
-
-  @DomName('SVGLineElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGLineElement_xmlspace_Getter";
-
-  @DomName('SVGLineElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGLineElement_xmlspace_Setter";
-
-  @DomName('SVGLineElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGLineElement_farthestViewportElement_Getter";
-
-  @DomName('SVGLineElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGLineElement_nearestViewportElement_Getter";
-
-  @DomName('SVGLineElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGLineElement_getBBox_Callback";
-
-  @DomName('SVGLineElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGLineElement_getCTM_Callback";
-
-  @DomName('SVGLineElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGLineElement_getScreenCTM_Callback";
-
-  @DomName('SVGLineElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGLineElement_getTransformToElement_Callback";
-
-  @DomName('SVGLineElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGLineElement_requiredExtensions_Getter";
-
-  @DomName('SVGLineElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGLineElement_requiredFeatures_Getter";
-
-  @DomName('SVGLineElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGLineElement_systemLanguage_Getter";
-
-  @DomName('SVGLineElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGLineElement_hasExtension_Callback";
-
-  @DomName('SVGLineElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGLineElement_transform_Getter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -3649,46 +3134,9 @@
 
 
 @DocsEditable()
-@DomName('SVGLocatable')
-@Unstable()
-abstract class Locatable extends NativeFieldWrapperClass1 {
-
-  @DomName('SVGLocatable.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGLocatable_farthestViewportElement_Getter";
-
-  @DomName('SVGLocatable.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGLocatable_nearestViewportElement_Getter";
-
-  @DomName('SVGLocatable.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGLocatable_getBBox_Callback";
-
-  @DomName('SVGLocatable.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGLocatable_getCTM_Callback";
-
-  @DomName('SVGLocatable.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGLocatable_getScreenCTM_Callback";
-
-  @DomName('SVGLocatable.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGLocatable_getTransformToElement_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('SVGMarkerElement')
 @Unstable()
-class MarkerElement extends StyledElement implements FitToViewBox, ExternalResourcesRequired, LangSpace {
+class MarkerElement extends StyledElement implements FitToViewBox, ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory MarkerElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -3768,22 +3216,6 @@
   @DocsEditable()
   AnimatedRect get viewBox native "SVGMarkerElement_viewBox_Getter";
 
-  @DomName('SVGMarkerElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGMarkerElement_xmllang_Getter";
-
-  @DomName('SVGMarkerElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGMarkerElement_xmllang_Setter";
-
-  @DomName('SVGMarkerElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGMarkerElement_xmlspace_Getter";
-
-  @DomName('SVGMarkerElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGMarkerElement_xmlspace_Setter";
-
 }
 // 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
@@ -3795,7 +3227,7 @@
 @DocsEditable()
 @DomName('SVGMaskElement')
 @Unstable()
-class MaskElement extends StyledElement implements ExternalResourcesRequired, Tests, LangSpace {
+class MaskElement extends StyledElement implements ExternalResourcesRequired, Tests {
   // To suppress missing implicit constructor warnings.
   factory MaskElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -3831,22 +3263,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGMaskElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGMaskElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGMaskElement_xmllang_Getter";
-
-  @DomName('SVGMaskElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGMaskElement_xmllang_Setter";
-
-  @DomName('SVGMaskElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGMaskElement_xmlspace_Getter";
-
-  @DomName('SVGMaskElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGMaskElement_xmlspace_Setter";
-
   @DomName('SVGMaskElement.requiredExtensions')
   @DocsEditable()
   StringList get requiredExtensions native "SVGMaskElement_requiredExtensions_Getter";
@@ -4106,7 +3522,7 @@
 @DocsEditable()
 @DomName('SVGPathElement')
 @Unstable()
-class PathElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace {
+class PathElement extends GraphicsElement implements ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory PathElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -4226,66 +3642,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGPathElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGPathElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGPathElement_xmllang_Getter";
-
-  @DomName('SVGPathElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGPathElement_xmllang_Setter";
-
-  @DomName('SVGPathElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGPathElement_xmlspace_Getter";
-
-  @DomName('SVGPathElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGPathElement_xmlspace_Setter";
-
-  @DomName('SVGPathElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGPathElement_farthestViewportElement_Getter";
-
-  @DomName('SVGPathElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGPathElement_nearestViewportElement_Getter";
-
-  @DomName('SVGPathElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGPathElement_getBBox_Callback";
-
-  @DomName('SVGPathElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGPathElement_getCTM_Callback";
-
-  @DomName('SVGPathElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGPathElement_getScreenCTM_Callback";
-
-  @DomName('SVGPathElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGPathElement_getTransformToElement_Callback";
-
-  @DomName('SVGPathElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGPathElement_requiredExtensions_Getter";
-
-  @DomName('SVGPathElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGPathElement_requiredFeatures_Getter";
-
-  @DomName('SVGPathElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGPathElement_systemLanguage_Getter";
-
-  @DomName('SVGPathElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGPathElement_hasExtension_Callback";
-
-  @DomName('SVGPathElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGPathElement_transform_Getter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -5238,7 +4594,7 @@
 @DocsEditable()
 @DomName('SVGPatternElement')
 @Unstable()
-class PatternElement extends StyledElement implements FitToViewBox, UriReference, ExternalResourcesRequired, Tests, LangSpace {
+class PatternElement extends StyledElement implements FitToViewBox, UriReference, ExternalResourcesRequired, Tests {
   // To suppress missing implicit constructor warnings.
   factory PatternElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -5286,22 +4642,6 @@
   @DocsEditable()
   AnimatedRect get viewBox native "SVGPatternElement_viewBox_Getter";
 
-  @DomName('SVGPatternElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGPatternElement_xmllang_Getter";
-
-  @DomName('SVGPatternElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGPatternElement_xmllang_Setter";
-
-  @DomName('SVGPatternElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGPatternElement_xmlspace_Getter";
-
-  @DomName('SVGPatternElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGPatternElement_xmlspace_Setter";
-
   @DomName('SVGPatternElement.requiredExtensions')
   @DocsEditable()
   StringList get requiredExtensions native "SVGPatternElement_requiredExtensions_Getter";
@@ -5411,7 +4751,7 @@
 @DocsEditable()
 @DomName('SVGPolygonElement')
 @Unstable()
-class PolygonElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace {
+class PolygonElement extends GraphicsElement implements ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory PolygonElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -5431,66 +4771,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGPolygonElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGPolygonElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGPolygonElement_xmllang_Getter";
-
-  @DomName('SVGPolygonElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGPolygonElement_xmllang_Setter";
-
-  @DomName('SVGPolygonElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGPolygonElement_xmlspace_Getter";
-
-  @DomName('SVGPolygonElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGPolygonElement_xmlspace_Setter";
-
-  @DomName('SVGPolygonElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGPolygonElement_farthestViewportElement_Getter";
-
-  @DomName('SVGPolygonElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGPolygonElement_nearestViewportElement_Getter";
-
-  @DomName('SVGPolygonElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGPolygonElement_getBBox_Callback";
-
-  @DomName('SVGPolygonElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGPolygonElement_getCTM_Callback";
-
-  @DomName('SVGPolygonElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGPolygonElement_getScreenCTM_Callback";
-
-  @DomName('SVGPolygonElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGPolygonElement_getTransformToElement_Callback";
-
-  @DomName('SVGPolygonElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGPolygonElement_requiredExtensions_Getter";
-
-  @DomName('SVGPolygonElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGPolygonElement_requiredFeatures_Getter";
-
-  @DomName('SVGPolygonElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGPolygonElement_systemLanguage_Getter";
-
-  @DomName('SVGPolygonElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGPolygonElement_hasExtension_Callback";
-
-  @DomName('SVGPolygonElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGPolygonElement_transform_Getter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -5502,7 +4782,7 @@
 @DocsEditable()
 @DomName('SVGPolylineElement')
 @Unstable()
-class PolylineElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace {
+class PolylineElement extends GraphicsElement implements ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory PolylineElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -5522,66 +4802,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGPolylineElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGPolylineElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGPolylineElement_xmllang_Getter";
-
-  @DomName('SVGPolylineElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGPolylineElement_xmllang_Setter";
-
-  @DomName('SVGPolylineElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGPolylineElement_xmlspace_Getter";
-
-  @DomName('SVGPolylineElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGPolylineElement_xmlspace_Setter";
-
-  @DomName('SVGPolylineElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGPolylineElement_farthestViewportElement_Getter";
-
-  @DomName('SVGPolylineElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGPolylineElement_nearestViewportElement_Getter";
-
-  @DomName('SVGPolylineElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGPolylineElement_getBBox_Callback";
-
-  @DomName('SVGPolylineElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGPolylineElement_getCTM_Callback";
-
-  @DomName('SVGPolylineElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGPolylineElement_getScreenCTM_Callback";
-
-  @DomName('SVGPolylineElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGPolylineElement_getTransformToElement_Callback";
-
-  @DomName('SVGPolylineElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGPolylineElement_requiredExtensions_Getter";
-
-  @DomName('SVGPolylineElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGPolylineElement_requiredFeatures_Getter";
-
-  @DomName('SVGPolylineElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGPolylineElement_systemLanguage_Getter";
-
-  @DomName('SVGPolylineElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGPolylineElement_hasExtension_Callback";
-
-  @DomName('SVGPolylineElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGPolylineElement_transform_Getter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -5766,7 +4986,7 @@
 @DocsEditable()
 @DomName('SVGRectElement')
 @Unstable()
-class RectElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace {
+class RectElement extends GraphicsElement implements ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory RectElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -5802,66 +5022,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGRectElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGRectElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGRectElement_xmllang_Getter";
-
-  @DomName('SVGRectElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGRectElement_xmllang_Setter";
-
-  @DomName('SVGRectElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGRectElement_xmlspace_Getter";
-
-  @DomName('SVGRectElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGRectElement_xmlspace_Setter";
-
-  @DomName('SVGRectElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGRectElement_farthestViewportElement_Getter";
-
-  @DomName('SVGRectElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGRectElement_nearestViewportElement_Getter";
-
-  @DomName('SVGRectElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGRectElement_getBBox_Callback";
-
-  @DomName('SVGRectElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGRectElement_getCTM_Callback";
-
-  @DomName('SVGRectElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGRectElement_getScreenCTM_Callback";
-
-  @DomName('SVGRectElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGRectElement_getTransformToElement_Callback";
-
-  @DomName('SVGRectElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGRectElement_requiredExtensions_Getter";
-
-  @DomName('SVGRectElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGRectElement_requiredFeatures_Getter";
-
-  @DomName('SVGRectElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGRectElement_systemLanguage_Getter";
-
-  @DomName('SVGRectElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGRectElement_hasExtension_Callback";
-
-  @DomName('SVGRectElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGRectElement_transform_Getter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -6085,7 +5245,7 @@
 @DomName('SVGStyleElement')
 // http://www.w3.org/TR/SVG/types.html#InterfaceSVGStylable
 @Experimental() // nonstandard
-class StyleElement extends SvgElement implements LangSpace {
+class StyleElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory StyleElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6125,22 +5285,6 @@
   @DocsEditable()
   void set type(String value) native "SVGStyleElement_type_Setter";
 
-  @DomName('SVGStyleElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGStyleElement_xmllang_Getter";
-
-  @DomName('SVGStyleElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGStyleElement_xmllang_Setter";
-
-  @DomName('SVGStyleElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGStyleElement_xmlspace_Getter";
-
-  @DomName('SVGStyleElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGStyleElement_xmlspace_Setter";
-
 }
 // 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
@@ -6327,6 +5471,26 @@
   @DocsEditable()
   void set xmlbase(String value) native "SVGElement_xmlbase_Setter";
 
+  @DomName('SVGElement.xmllang')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get xmllang native "SVGElement_xmllang_Getter";
+
+  @DomName('SVGElement.xmllang')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set xmllang(String value) native "SVGElement_xmllang_Setter";
+
+  @DomName('SVGElement.xmlspace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  String get xmlspace native "SVGElement_xmlspace_Getter";
+
+  @DomName('SVGElement.xmlspace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void set xmlspace(String value) native "SVGElement_xmlspace_Setter";
+
 }
 // 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
@@ -6335,7 +5499,7 @@
 
 @DomName('SVGSVGElement')
 @Unstable()
-class SvgSvgElement extends StyledElement implements FitToViewBox, Transformable, Tests, ExternalResourcesRequired, ZoomAndPan, LangSpace {
+class SvgSvgElement extends GraphicsElement implements FitToViewBox, ExternalResourcesRequired, ZoomAndPan {
   factory SvgSvgElement() => _SvgSvgElementFactoryProvider.createSvgSvgElement();
 
   // To suppress missing implicit constructor warnings.
@@ -6517,66 +5681,6 @@
   @DocsEditable()
   AnimatedRect get viewBox native "SVGSVGElement_viewBox_Getter";
 
-  @DomName('SVGSVGElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGSVGElement_xmllang_Getter";
-
-  @DomName('SVGSVGElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGSVGElement_xmllang_Setter";
-
-  @DomName('SVGSVGElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGSVGElement_xmlspace_Getter";
-
-  @DomName('SVGSVGElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGSVGElement_xmlspace_Setter";
-
-  @DomName('SVGSVGElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGSVGElement_farthestViewportElement_Getter";
-
-  @DomName('SVGSVGElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGSVGElement_nearestViewportElement_Getter";
-
-  @DomName('SVGSVGElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGSVGElement_getBBox_Callback";
-
-  @DomName('SVGSVGElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGSVGElement_getCTM_Callback";
-
-  @DomName('SVGSVGElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGSVGElement_getScreenCTM_Callback";
-
-  @DomName('SVGSVGElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGSVGElement_getTransformToElement_Callback";
-
-  @DomName('SVGSVGElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGSVGElement_requiredExtensions_Getter";
-
-  @DomName('SVGSVGElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGSVGElement_requiredFeatures_Getter";
-
-  @DomName('SVGSVGElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGSVGElement_systemLanguage_Getter";
-
-  @DomName('SVGSVGElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGSVGElement_hasExtension_Callback";
-
-  @DomName('SVGSVGElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGSVGElement_transform_Getter";
-
   @DomName('SVGSVGElement.zoomAndPan')
   @DocsEditable()
   int get zoomAndPan native "SVGSVGElement_zoomAndPan_Getter";
@@ -6596,7 +5700,7 @@
 @DocsEditable()
 @DomName('SVGSwitchElement')
 @Unstable()
-class SwitchElement extends StyledElement implements Transformable, ExternalResourcesRequired, Tests, LangSpace {
+class SwitchElement extends GraphicsElement implements ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory SwitchElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6608,66 +5712,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGSwitchElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGSwitchElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGSwitchElement_xmllang_Getter";
-
-  @DomName('SVGSwitchElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGSwitchElement_xmllang_Setter";
-
-  @DomName('SVGSwitchElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGSwitchElement_xmlspace_Getter";
-
-  @DomName('SVGSwitchElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGSwitchElement_xmlspace_Setter";
-
-  @DomName('SVGSwitchElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGSwitchElement_farthestViewportElement_Getter";
-
-  @DomName('SVGSwitchElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGSwitchElement_nearestViewportElement_Getter";
-
-  @DomName('SVGSwitchElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGSwitchElement_getBBox_Callback";
-
-  @DomName('SVGSwitchElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGSwitchElement_getCTM_Callback";
-
-  @DomName('SVGSwitchElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGSwitchElement_getScreenCTM_Callback";
-
-  @DomName('SVGSwitchElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGSwitchElement_getTransformToElement_Callback";
-
-  @DomName('SVGSwitchElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGSwitchElement_requiredExtensions_Getter";
-
-  @DomName('SVGSwitchElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGSwitchElement_requiredFeatures_Getter";
-
-  @DomName('SVGSwitchElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGSwitchElement_systemLanguage_Getter";
-
-  @DomName('SVGSwitchElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGSwitchElement_hasExtension_Callback";
-
-  @DomName('SVGSwitchElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGSwitchElement_transform_Getter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -6679,7 +5723,7 @@
 @DocsEditable()
 @DomName('SVGSymbolElement')
 @Unstable()
-class SymbolElement extends StyledElement implements FitToViewBox, ExternalResourcesRequired, LangSpace {
+class SymbolElement extends StyledElement implements FitToViewBox, ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory SymbolElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6699,22 +5743,6 @@
   @DocsEditable()
   AnimatedRect get viewBox native "SVGSymbolElement_viewBox_Getter";
 
-  @DomName('SVGSymbolElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGSymbolElement_xmllang_Getter";
-
-  @DomName('SVGSymbolElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGSymbolElement_xmllang_Setter";
-
-  @DomName('SVGSymbolElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGSymbolElement_xmlspace_Getter";
-
-  @DomName('SVGSymbolElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGSymbolElement_xmlspace_Setter";
-
 }
 // 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
@@ -6774,7 +5802,7 @@
 @DocsEditable()
 @DomName('SVGTextContentElement')
 @Unstable()
-class TextContentElement extends StyledElement implements ExternalResourcesRequired, Tests, LangSpace {
+class TextContentElement extends GraphicsElement implements ExternalResourcesRequired {
   // To suppress missing implicit constructor warnings.
   factory TextContentElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6838,38 +5866,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGTextContentElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGTextContentElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGTextContentElement_xmllang_Getter";
-
-  @DomName('SVGTextContentElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGTextContentElement_xmllang_Setter";
-
-  @DomName('SVGTextContentElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGTextContentElement_xmlspace_Getter";
-
-  @DomName('SVGTextContentElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGTextContentElement_xmlspace_Setter";
-
-  @DomName('SVGTextContentElement.requiredExtensions')
-  @DocsEditable()
-  StringList get requiredExtensions native "SVGTextContentElement_requiredExtensions_Getter";
-
-  @DomName('SVGTextContentElement.requiredFeatures')
-  @DocsEditable()
-  StringList get requiredFeatures native "SVGTextContentElement_requiredFeatures_Getter";
-
-  @DomName('SVGTextContentElement.systemLanguage')
-  @DocsEditable()
-  StringList get systemLanguage native "SVGTextContentElement_systemLanguage_Getter";
-
-  @DomName('SVGTextContentElement.hasExtension')
-  @DocsEditable()
-  bool hasExtension(String extension) native "SVGTextContentElement_hasExtension_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
@@ -6881,7 +5877,7 @@
 @DocsEditable()
 @DomName('SVGTextElement')
 @Unstable()
-class TextElement extends TextPositioningElement implements Transformable {
+class TextElement extends TextPositioningElement {
   // To suppress missing implicit constructor warnings.
   factory TextElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -6889,34 +5885,6 @@
   @DocsEditable()
   factory TextElement() => _SvgElementFactoryProvider.createSvgElement_tag("text");
 
-  @DomName('SVGTextElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGTextElement_farthestViewportElement_Getter";
-
-  @DomName('SVGTextElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGTextElement_nearestViewportElement_Getter";
-
-  @DomName('SVGTextElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGTextElement_getBBox_Callback";
-
-  @DomName('SVGTextElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGTextElement_getCTM_Callback";
-
-  @DomName('SVGTextElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGTextElement_getScreenCTM_Callback";
-
-  @DomName('SVGTextElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGTextElement_getTransformToElement_Callback";
-
-  @DomName('SVGTextElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGTextElement_transform_Getter";
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -7018,7 +5986,7 @@
 @DocsEditable()
 @DomName('SVGTitleElement')
 @Unstable()
-class TitleElement extends StyledElement implements LangSpace {
+class TitleElement extends StyledElement {
   // To suppress missing implicit constructor warnings.
   factory TitleElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -7026,22 +5994,6 @@
   @DocsEditable()
   factory TitleElement() => _SvgElementFactoryProvider.createSvgElement_tag("title");
 
-  @DomName('SVGTitleElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGTitleElement_xmllang_Getter";
-
-  @DomName('SVGTitleElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGTitleElement_xmllang_Setter";
-
-  @DomName('SVGTitleElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGTitleElement_xmlspace_Getter";
-
-  @DomName('SVGTitleElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGTitleElement_xmlspace_Setter";
-
 }
 // 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
@@ -7227,47 +6179,6 @@
 
 
 @DocsEditable()
-@DomName('SVGTransformable')
-@Unstable()
-abstract class Transformable extends NativeFieldWrapperClass1 implements Locatable {
-
-  @DomName('SVGTransformable.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGTransformable_transform_Getter";
-
-  @DomName('SVGTransformable.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGTransformable_farthestViewportElement_Getter";
-
-  @DomName('SVGTransformable.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGTransformable_nearestViewportElement_Getter";
-
-  @DomName('SVGTransformable.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGTransformable_getBBox_Callback";
-
-  @DomName('SVGTransformable.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGTransformable_getCTM_Callback";
-
-  @DomName('SVGTransformable.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGTransformable_getScreenCTM_Callback";
-
-  @DomName('SVGTransformable.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGTransformable_getTransformToElement_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('SVGUnitTypes')
 @Unstable()
 class UnitTypes extends NativeFieldWrapperClass1 {
@@ -7312,7 +6223,7 @@
 @DocsEditable()
 @DomName('SVGUseElement')
 @Unstable()
-class UseElement extends StyledElement implements Transformable, ExternalResourcesRequired, UriReference, Tests, LangSpace {
+class UseElement extends GraphicsElement implements UriReference, ExternalResourcesRequired, Tests {
   // To suppress missing implicit constructor warnings.
   factory UseElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -7348,46 +6259,6 @@
   @DocsEditable()
   AnimatedBoolean get externalResourcesRequired native "SVGUseElement_externalResourcesRequired_Getter";
 
-  @DomName('SVGUseElement.xmllang')
-  @DocsEditable()
-  String get xmllang native "SVGUseElement_xmllang_Getter";
-
-  @DomName('SVGUseElement.xmllang')
-  @DocsEditable()
-  void set xmllang(String value) native "SVGUseElement_xmllang_Setter";
-
-  @DomName('SVGUseElement.xmlspace')
-  @DocsEditable()
-  String get xmlspace native "SVGUseElement_xmlspace_Getter";
-
-  @DomName('SVGUseElement.xmlspace')
-  @DocsEditable()
-  void set xmlspace(String value) native "SVGUseElement_xmlspace_Setter";
-
-  @DomName('SVGUseElement.farthestViewportElement')
-  @DocsEditable()
-  SvgElement get farthestViewportElement native "SVGUseElement_farthestViewportElement_Getter";
-
-  @DomName('SVGUseElement.nearestViewportElement')
-  @DocsEditable()
-  SvgElement get nearestViewportElement native "SVGUseElement_nearestViewportElement_Getter";
-
-  @DomName('SVGUseElement.getBBox')
-  @DocsEditable()
-  Rect getBBox() native "SVGUseElement_getBBox_Callback";
-
-  @DomName('SVGUseElement.getCTM')
-  @DocsEditable()
-  Matrix getCtm() native "SVGUseElement_getCTM_Callback";
-
-  @DomName('SVGUseElement.getScreenCTM')
-  @DocsEditable()
-  Matrix getScreenCtm() native "SVGUseElement_getScreenCTM_Callback";
-
-  @DomName('SVGUseElement.getTransformToElement')
-  @DocsEditable()
-  Matrix getTransformToElement(SvgElement element) native "SVGUseElement_getTransformToElement_Callback";
-
   @DomName('SVGUseElement.requiredExtensions')
   @DocsEditable()
   StringList get requiredExtensions native "SVGUseElement_requiredExtensions_Getter";
@@ -7404,10 +6275,6 @@
   @DocsEditable()
   bool hasExtension(String extension) native "SVGUseElement_hasExtension_Callback";
 
-  @DomName('SVGUseElement.transform')
-  @DocsEditable()
-  AnimatedTransformList get transform native "SVGUseElement_transform_Getter";
-
   @DomName('SVGUseElement.href')
   @DocsEditable()
   AnimatedString get href native "SVGUseElement_href_Getter";
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index e065196..b3355ed 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -149,6 +149,11 @@
   // To suppress missing implicit constructor warnings.
   factory AudioBufferSourceNode._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('AudioBufferSourceNode.endedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+
   @DomName('AudioBufferSourceNode.FINISHED_STATE')
   @DocsEditable()
   static const int FINISHED_STATE = 3;
@@ -205,6 +210,11 @@
   @DocsEditable()
   void noteOn(num when) native;
 
+  @DomName('AudioBufferSourceNode.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onEnded => endedEvent.forTarget(this);
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -318,14 +328,15 @@
   @DocsEditable()
   PannerNode createPanner() native;
 
+  @DomName('AudioContext.createPeriodicWave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) native;
+
   @DomName('AudioContext.createWaveShaper')
   @DocsEditable()
   WaveShaperNode createWaveShaper() native;
 
-  @DomName('AudioContext.createWaveTable')
-  @DocsEditable()
-  WaveTable createWaveTable(Float32List real, Float32List imag) native;
-
   @JSName('decodeAudioData')
   @DomName('AudioContext.decodeAudioData')
   @DocsEditable()
@@ -346,6 +357,25 @@
   @DocsEditable()
   void startRendering() native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('AudioContext.addEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('AudioContext.dispatchEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool dispatchEvent(Event event) native;
+
+  @JSName('removeEventListener')
+  @DomName('AudioContext.removeEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('AudioContext.oncomplete')
   @DocsEditable()
   Stream<Event> get onComplete => completeEvent.forTarget(this);
@@ -461,11 +491,6 @@
   @DocsEditable()
   final int numberOfOutputs;
 
-  @JSName('addEventListener')
-  @DomName('AudioNode.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
-
   @JSName('connect')
   @DomName('AudioNode.connect')
   @DocsEditable()
@@ -475,6 +500,13 @@
   @DocsEditable()
   void disconnect(int output) native;
 
+  // From EventTarget
+
+  @JSName('addEventListener')
+  @DomName('AudioNode.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
+
   @DomName('AudioNode.dispatchEvent')
   @DocsEditable()
   bool dispatchEvent(Event event) native;
@@ -803,7 +835,7 @@
 @DomName('MediaStreamAudioDestinationNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaStreamAudioDestinationNode
 @Experimental()
-class MediaStreamAudioDestinationNode extends AudioSourceNode native "MediaStreamAudioDestinationNode" {
+class MediaStreamAudioDestinationNode extends AudioNode native "MediaStreamAudioDestinationNode" {
   // To suppress missing implicit constructor warnings.
   factory MediaStreamAudioDestinationNode._() { throw new UnsupportedError("Not supported"); }
 
@@ -854,7 +886,7 @@
 @DomName('OfflineAudioContext')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#OfflineAudioContext-section
 @Experimental()
-class OfflineAudioContext extends AudioContext implements EventTarget native "OfflineAudioContext" {
+class OfflineAudioContext extends AudioContext native "OfflineAudioContext" {
   // To suppress missing implicit constructor warnings.
   factory OfflineAudioContext._() { throw new UnsupportedError("Not supported"); }
 
@@ -878,6 +910,11 @@
   // To suppress missing implicit constructor warnings.
   factory OscillatorNode._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('OscillatorNode.endedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+
   @DomName('OscillatorNode.CUSTOM')
   @DocsEditable()
   // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
@@ -948,9 +985,10 @@
   @DocsEditable()
   void noteOn(num when) native;
 
-  @DomName('OscillatorNode.setWaveTable')
+  @DomName('OscillatorNode.setPeriodicWave')
   @DocsEditable()
-  void setWaveTable(WaveTable waveTable) native;
+  @Experimental() // untriaged
+  void setPeriodicWave(PeriodicWave periodicWave) native;
 
   @DomName('OscillatorNode.start')
   @DocsEditable()
@@ -959,6 +997,11 @@
   @DomName('OscillatorNode.stop')
   @DocsEditable()
   void stop(num when) native;
+
+  @DomName('OscillatorNode.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onEnded => endedEvent.forTarget(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1053,6 +1096,16 @@
   @DocsEditable()
   void setVelocity(num x, num y, num z) native;
 }
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+@DocsEditable()
+@DomName('PeriodicWave')
+@Experimental() // untriaged
+class PeriodicWave extends Interceptor native "PeriodicWave" {
+}
 // 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.
@@ -1123,14 +1176,3 @@
   @DocsEditable()
   String oversample;
 }
-// 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('WaveTable')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#WaveTable-section
-@Experimental()
-class WaveTable extends Interceptor native "WaveTable" {
-}
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index 8fb7c34..64d95f9 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -145,6 +145,11 @@
   // To suppress missing implicit constructor warnings.
   factory AudioBufferSourceNode._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('AudioBufferSourceNode.endedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+
   @DomName('AudioBufferSourceNode.FINISHED_STATE')
   @DocsEditable()
   static const int FINISHED_STATE = 3;
@@ -243,6 +248,11 @@
   @DocsEditable()
   void stop(num when) native "AudioBufferSourceNode_stop_Callback";
 
+  @DomName('AudioBufferSourceNode.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onEnded => endedEvent.forTarget(this);
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -406,6 +416,11 @@
   @DocsEditable()
   PannerNode createPanner() native "AudioContext_createPanner_Callback";
 
+  @DomName('AudioContext.createPeriodicWave')
+  @DocsEditable()
+  @Experimental() // untriaged
+  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) native "AudioContext_createPeriodicWave_Callback";
+
   ScriptProcessorNode createScriptProcessor(int bufferSize, [int numberOfInputChannels, int numberOfOutputChannels]) {
     if (numberOfOutputChannels != null) {
       return _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels);
@@ -426,10 +441,6 @@
   @DocsEditable()
   WaveShaperNode createWaveShaper() native "AudioContext_createWaveShaper_Callback";
 
-  @DomName('AudioContext.createWaveTable')
-  @DocsEditable()
-  WaveTable createWaveTable(Float32List real, Float32List imag) native "AudioContext_createWaveTable_Callback";
-
   @DomName('AudioContext.decodeAudioData')
   @DocsEditable()
   void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native "AudioContext_decodeAudioData_Callback";
@@ -446,6 +457,21 @@
   @DocsEditable()
   void startRendering() native "AudioContext_startRendering_Callback";
 
+  @DomName('AudioContext.addEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "AudioContext_addEventListener_Callback";
+
+  @DomName('AudioContext.dispatchEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  bool dispatchEvent(Event event) native "AudioContext_dispatchEvent_Callback";
+
+  @DomName('AudioContext.removeEventListener')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "AudioContext_removeEventListener_Callback";
+
   @DomName('AudioContext.oncomplete')
   @DocsEditable()
   Stream<Event> get onComplete => completeEvent.forTarget(this);
@@ -561,10 +587,6 @@
   @DocsEditable()
   int get numberOfOutputs native "AudioNode_numberOfOutputs_Getter";
 
-  @DomName('AudioNode.addEventListener')
-  @DocsEditable()
-  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "AudioNode_addEventListener_Callback";
-
   void $dom_connect(destination, int output, [int input]) {
     if ((input is int || input == null) && (output is int || output == null) && (destination is AudioNode || destination == null)) {
       _connect_1(destination, output, input);
@@ -585,6 +607,10 @@
   @DocsEditable()
   void disconnect(int output) native "AudioNode_disconnect_Callback";
 
+  @DomName('AudioNode.addEventListener')
+  @DocsEditable()
+  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "AudioNode_addEventListener_Callback";
+
   @DomName('AudioNode.dispatchEvent')
   @DocsEditable()
   bool dispatchEvent(Event event) native "AudioNode_dispatchEvent_Callback";
@@ -963,7 +989,7 @@
 @DomName('MediaStreamAudioDestinationNode')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#MediaStreamAudioDestinationNode
 @Experimental()
-class MediaStreamAudioDestinationNode extends AudioSourceNode {
+class MediaStreamAudioDestinationNode extends AudioNode {
   // To suppress missing implicit constructor warnings.
   factory MediaStreamAudioDestinationNode._() { throw new UnsupportedError("Not supported"); }
 
@@ -1023,7 +1049,7 @@
 @DomName('OfflineAudioContext')
 // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#OfflineAudioContext-section
 @Experimental()
-class OfflineAudioContext extends AudioContext implements EventTarget {
+class OfflineAudioContext extends AudioContext {
   // To suppress missing implicit constructor warnings.
   factory OfflineAudioContext._() { throw new UnsupportedError("Not supported"); }
 
@@ -1052,6 +1078,11 @@
   // To suppress missing implicit constructor warnings.
   factory OscillatorNode._() { throw new UnsupportedError("Not supported"); }
 
+  @DomName('OscillatorNode.endedEvent')
+  @DocsEditable()
+  @Experimental() // untriaged
+  static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
+
   @DomName('OscillatorNode.CUSTOM')
   @DocsEditable()
   // https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AlternateNames
@@ -1126,9 +1157,10 @@
   @DocsEditable()
   void noteOn(num when) native "OscillatorNode_noteOn_Callback";
 
-  @DomName('OscillatorNode.setWaveTable')
+  @DomName('OscillatorNode.setPeriodicWave')
   @DocsEditable()
-  void setWaveTable(WaveTable waveTable) native "OscillatorNode_setWaveTable_Callback";
+  @Experimental() // untriaged
+  void setPeriodicWave(PeriodicWave periodicWave) native "OscillatorNode_setPeriodicWave_Callback";
 
   @DomName('OscillatorNode.start')
   @DocsEditable()
@@ -1138,6 +1170,11 @@
   @DocsEditable()
   void stop(num when) native "OscillatorNode_stop_Callback";
 
+  @DomName('OscillatorNode.onended')
+  @DocsEditable()
+  @Experimental() // untriaged
+  Stream<Event> get onEnded => endedEvent.forTarget(this);
+
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1267,6 +1304,19 @@
   void setVelocity(num x, num y, num z) native "PannerNode_setVelocity_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('PeriodicWave')
+@Experimental() // untriaged
+class PeriodicWave extends NativeFieldWrapperClass1 {
+
+}
 // 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.
@@ -1349,17 +1399,3 @@
   void set oversample(String value) native "WaveShaperNode_oversample_Setter";
 
 }
-// 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('WaveTable')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#WaveTable-section
-@Experimental()
-class WaveTable extends NativeFieldWrapperClass1 {
-
-}
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index 411dd69..8387961 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -2793,8 +2793,19 @@
   @DomName('WebGLRenderingContext.texImage2D')
   void texImage2D(int targetTexture, int levelOfDetail, int internalFormat,
       int format, int type, data) {
-    _texImage2D(targetTexture, levelOfDetail, internalFormat,
-        format, type, data);
+    if (data is ImageElement) {
+      texImage2DImage(targetTexture, levelOfDetail, internalFormat, format,
+          type, data);
+    } else if (data is ImageData) {
+      texImage2DImageData(targetTexture, levelOfDetail, internalFormat, format,
+          type, data);
+    } else if (data is CanvasElement) {
+      texImage2DCanvas(targetTexture, levelOfDetail, internalFormat, format,
+          type, data);
+    } else {
+      texImage2DVideo(targetTexture, levelOfDetail, internalFormat, format,
+          type, data);
+    }
   }
 
   /**
diff --git a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
index 3608d4c..57a3f17 100644
--- a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
+++ b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
@@ -171,57 +171,6 @@
 
 
 @DocsEditable()
-@DomName('SQLException')
-// http://www.w3.org/TR/webdatabase/#sqlexception
-@Experimental() // deprecated
-class SqlException extends Interceptor native "SQLException" {
-
-  @DomName('SQLException.CONSTRAINT_ERR')
-  @DocsEditable()
-  static const int CONSTRAINT_ERR = 6;
-
-  @DomName('SQLException.DATABASE_ERR')
-  @DocsEditable()
-  static const int DATABASE_ERR = 1;
-
-  @DomName('SQLException.QUOTA_ERR')
-  @DocsEditable()
-  static const int QUOTA_ERR = 4;
-
-  @DomName('SQLException.SYNTAX_ERR')
-  @DocsEditable()
-  static const int SYNTAX_ERR = 5;
-
-  @DomName('SQLException.TIMEOUT_ERR')
-  @DocsEditable()
-  static const int TIMEOUT_ERR = 7;
-
-  @DomName('SQLException.TOO_LARGE_ERR')
-  @DocsEditable()
-  static const int TOO_LARGE_ERR = 3;
-
-  @DomName('SQLException.UNKNOWN_ERR')
-  @DocsEditable()
-  static const int UNKNOWN_ERR = 0;
-
-  @DomName('SQLException.VERSION_ERR')
-  @DocsEditable()
-  static const int VERSION_ERR = 2;
-
-  @DomName('SQLException.code')
-  @DocsEditable()
-  final int code;
-
-  @DomName('SQLException.message')
-  @DocsEditable()
-  final String message;
-}
-// 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('SQLResultSet')
 // http://www.w3.org/TR/webdatabase/#sqlresultset
 @Experimental() // deprecated
diff --git a/sdk/lib/web_sql/dartium/web_sql_dartium.dart b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
index 33f5260..828bcf8 100644
--- a/sdk/lib/web_sql/dartium/web_sql_dartium.dart
+++ b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
@@ -177,60 +177,6 @@
 
 
 @DocsEditable()
-@DomName('SQLException')
-// http://www.w3.org/TR/webdatabase/#sqlexception
-@Experimental() // deprecated
-class SqlException extends NativeFieldWrapperClass1 {
-
-  @DomName('SQLException.CONSTRAINT_ERR')
-  @DocsEditable()
-  static const int CONSTRAINT_ERR = 6;
-
-  @DomName('SQLException.DATABASE_ERR')
-  @DocsEditable()
-  static const int DATABASE_ERR = 1;
-
-  @DomName('SQLException.QUOTA_ERR')
-  @DocsEditable()
-  static const int QUOTA_ERR = 4;
-
-  @DomName('SQLException.SYNTAX_ERR')
-  @DocsEditable()
-  static const int SYNTAX_ERR = 5;
-
-  @DomName('SQLException.TIMEOUT_ERR')
-  @DocsEditable()
-  static const int TIMEOUT_ERR = 7;
-
-  @DomName('SQLException.TOO_LARGE_ERR')
-  @DocsEditable()
-  static const int TOO_LARGE_ERR = 3;
-
-  @DomName('SQLException.UNKNOWN_ERR')
-  @DocsEditable()
-  static const int UNKNOWN_ERR = 0;
-
-  @DomName('SQLException.VERSION_ERR')
-  @DocsEditable()
-  static const int VERSION_ERR = 2;
-
-  @DomName('SQLException.code')
-  @DocsEditable()
-  int get code native "SQLException_code_Getter";
-
-  @DomName('SQLException.message')
-  @DocsEditable()
-  String get message native "SQLException_message_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('SQLResultSet')
 // http://www.w3.org/TR/webdatabase/#sqlresultset
 @Experimental() // deprecated
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 81a6b85..116302e 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -89,11 +89,6 @@
 Language/03_Overview/1_Scoping_A02_t07: fail, OK
 Language/12_Statements/04_Local_Function_Declaration_A01_t01: fail, OK
 
-# co19 issue #417, 'if', 'while' and 'do-while' don't create scope
-Language/03_Overview/1_Scoping_A02_t11: fail, OK
-Language/03_Overview/1_Scoping_A02_t12: fail, OK
-Language/03_Overview/1_Scoping_A02_t16: fail, OK
-
 # co19 issue #420, 'throw' without exception; deprecated; rethrow should be used
 Language/11_Expressions/08_Throw_A05_t01: fail, OK
 Language/11_Expressions/08_Throw_A05_t02: fail, OK
@@ -435,3 +430,25 @@
 Language/11_Expressions/11_Instance_Creation_A03_t01: fail, OK
 Language/11_Expressions/11_Instance_Creation_A04_t01: fail, OK
 Language/11_Expressions/11_Instance_Creation_A04_t02: fail, OK
+
+# co19 issue #481
+Language/13_Libraries_and_Scripts/1_Imports_A03_t02: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t05: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t08: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t09: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t10: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t22: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t25: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t29: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t28: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t30: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t42: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t45: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t48: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t49: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t50: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t62: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t65: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t68: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t69: fail, OK
+Language/13_Libraries_and_Scripts/1_Imports_A03_t70: fail, OK
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 687842a..2e5df38 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -4,6 +4,10 @@
 
 [ $compiler == dart2dart ]
 
+Language/11_Expressions/08_Throw_A05_t01: Fail # co19 issue 420
+Language/11_Expressions/08_Throw_A05_t02: Fail # co19 issue 420
+Language/11_Expressions/08_Throw_A05_t03: Fail # co19 issue 420
+
 LibTest/math/max_A01_t03: Fail # co19 issue 467
 LibTest/math/min_A01_t03: Fail # co19 issue 467
 
@@ -153,8 +157,6 @@
 Language/07_Classes/1_Instance_Methods_A02_t05: Fail # http://dartbug.com/5519
 Language/07_Classes/1_Instance_Methods_A06_t01: Fail # Inherited from dart2js
 Language/07_Classes/1_Instance_Methods_A06_t02: Fail # Inherited from dart2js
-Language/07_Classes/2_Getters_A01_t03: Fail # inherited from VM
-Language/07_Classes/2_Getters_A01_t05: Fail # inherited from VM
 Language/07_Classes/3_Setters_A04_t01: Fail # inherited from VM
 Language/07_Classes/3_Setters_A04_t02: Fail # inherited from VM
 Language/07_Classes/3_Setters_A04_t03: Fail # inherited from VM
@@ -278,10 +280,6 @@
 Language/12_Statements/04_Local_Function_Declaration_A02_t02: Fail # Inherited from dart2js
 Language/12_Statements/06_For_A01_t11: Fail # Inherited from dart2js
 Language/12_Statements/09_Switch_A01_t02: Fail # Inherited from VM (switch case with several labels).
-Language/12_Statements/09_Switch_A02_t01: Fail # Inherited from dart2js
-Language/12_Statements/09_Switch_A02_t02: Fail # Inherited from dart2js
-Language/12_Statements/09_Switch_A03_t01: Fail # Inherited from dart2js
-Language/12_Statements/09_Switch_A03_t02: Fail # Inherited from dart2js
 Language/12_Statements/09_Switch_A06_t02: Fail # Inherited from VM (does not throw NSME).
 Language/12_Statements/10_Try_A06_t01: Fail, Pass # Passes in conservative renaming mode. Test depends on function names.
 Language/12_Statements/10_Try_A07_t03: Fail # Test depends on out file name.
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index f4d828f..335f686 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -2,6 +2,11 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+[ $compiler == dart2js && ($runtime == d8 || $runtime == drt) ]
+LibTest/core/List/sort_A01_t02: Pass, Fail # v8 bug: Issue 12293
+LibTest/core/List/sort_A01_t03: Pass, Fail # v8 bug: Issue 12293
+LibTest/core/Map/Map_class_A01_t04: Pass, Fail # v8 bug: Issue 12293
+
 [ $compiler == dart2js && $runtime == jsshell ]
 LibTest/isolate/isolate_api/spawnUri_A02_t01: Crash # TODO(ahe): Please triage this crash.
 LibTest/core/List/sort_A01_t04: Pass, Timeout # Must be a bug in jsshell, test sometimes times out.
@@ -69,7 +74,6 @@
 Language/12_Statements/03_Variable_Declaration_A04_t08: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/04_Local_Function_Declaration_A01_t01: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/04_Local_Function_Declaration_A02_t02: Fail # TODO(ahe): Please triage this failure.
-Language/12_Statements/09_Switch_A02_t02: Fail # TODO(ahe): Please triage this failure.
 Language/12_Statements/09_Switch_A06_t02: Fail # co19 issue 413
 Language/12_Statements/10_Try_A06_t01: Fail # Issue 11850: dart2js inlining results in stack traces not as accurate
 Language/12_Statements/10_Try_A07_t03: Fail # TODO(ahe): Please triage this failure.
@@ -529,6 +533,10 @@
 LibTest/core/Match/pattern_A01_t01: Fail # co19 Issue 400, 422
 LibTest/core/RegExp/allMatches_A01_t01: Fail # co19 Issue 400, 422
 
+Language/11_Expressions/08_Throw_A05_t01: Fail # co19 issue 420
+Language/11_Expressions/08_Throw_A05_t02: Fail # co19 issue 420
+Language/11_Expressions/08_Throw_A05_t03: Fail # co19 issue 420
+
 LibTest/core/String/indexOf_A01_t02: Fail # Issue 427
 LibTest/core/String/lastIndexOf_A01_t02: Fail # Issue 427
 
@@ -567,6 +575,8 @@
 Language/13_Libraries_and_Scripts/1_Imports_A03_t62: Fail # 481
 Language/13_Libraries_and_Scripts/1_Imports_A03_t65: Fail # 481
 
+Language/14_Types/2_Dynamic_Type_System_A02_t01: Fail # co19 issue 481
+
 [ $compiler == dart2js && $checked ]
 
 Language/03_Overview/1_Scoping_A02_t30: Fail # co19 issue 463
@@ -707,8 +717,6 @@
 Language/07_Classes/07_Classes_A04_t25: Fail # Checks that a static abstract setter can't be used in place of a class member definition.
 Language/07_Classes/1_Instance_Methods_A02_t02: Fail # Checks that a compile-time error is produced if m1 has fewer named parameters than m2 (1 vs. 0) and neither have any required parameters.
 Language/07_Classes/1_Instance_Methods_A02_t05: Fail # Checks that a compile-time error is produced if m1 has almost the same set of named  parameters as m2 except for one of them having a different name.
-Language/07_Classes/2_Getters_A01_t03: Fail # Checks that a compile-time error is produced if empty formal parameter list is present.
-Language/07_Classes/2_Getters_A01_t05: Fail # Checks that a compile-time error is produced if an static getter has empty formal parameter list.
 Language/07_Classes/4_Abstract_Instance_Members_A04_t01: Fail # Checks that a compile-time error is produced when the overriding abstract method has fewer named parameters than the instance method being overridden (2 vs 3) and neither  have any required parameters.
 Language/07_Classes/4_Abstract_Instance_Members_A04_t05: Fail # Checks that a compile-time error is produced when the overriding non-abstract  instance method has the same set of named parameters as the abstract method being overriden,  but in a different order.
 Language/07_Classes/4_Abstract_Instance_Members_A04_t06: Fail # Checks that a compile-time error is produced when the overriding non-abstract  instance method has almost the same set of named parameters as the abstract method being overriden,  except for one that has a different name.
@@ -732,8 +740,6 @@
 # Unexpected compile-time errors.
 #
 [ $compiler == dart2js ]
-Language/14_Types/2_Dynamic_Type_System_A02_t01: Fail # http://dartbug.com/5029
-
 Language/07_Classes/3_Setters_A04_t01: Fail # http://dartbug.com/5023
 Language/07_Classes/3_Setters_A04_t02: Fail # http://dartbug.com/5023
 Language/07_Classes/3_Setters_A04_t03: Fail # http://dartbug.com/5023
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 822b076..4e93a27 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -448,9 +448,19 @@
 Language/13_Libraries_and_Scripts/1_Imports_A03_t31: Fail # co19 issue 463
 Language/14_Types/8_Parameterized_Types_A02_t01: Fail # co19 issue 463
 
-LibTest/core/AssertionError/line_A01_t02: Fail # co19 issue 479
 LibTest/core/Set/intersection_A03_t01: Fail # co19 issue 480
+
+LibTest/core/AssertionError/column_A01_t02: Fail # co19 issue 479
+LibTest/core/AssertionError/failedAssertion_A01_t01: Fail # co19 issue 479
+LibTest/core/AssertionError/line_A01_t02: Fail # co19 issue 479
+LibTest/core/AssertionError/url_A01_t01: Fail # co19 issue 479
+LibTest/core/TypeError/column_A01_t01: Fail # co19 issue 479
+LibTest/core/TypeError/dstName_A01_t01: Fail # co19 issue 479
+LibTest/core/TypeError/dstType_A01_t01: Fail # co19 issue 479
+LibTest/core/TypeError/failedAssertion_A01_t01: Fail # co19 issue 479
 LibTest/core/TypeError/line_A01_t01: Fail # co19 issue 479
+LibTest/core/TypeError/srcType_A01_t01: Fail # co19 issue 479
+LibTest/core/TypeError/url_A01_t01: Fail # co19 issue 479
 
 LibTest/core/Strings/concatAll_A04_t01: Fail, OK # checks for ArgumentError. TypeError is ok too. co19 issue 366
 LibTest/core/Strings/join_A04_t01: Fail, OK # checks for ArgumentError. TypeError is ok too. co19 issue 366
@@ -474,9 +484,12 @@
 Language/11_Expressions/15_Method_Invocation/4_Super_Invocation_A04_t04: Pass # co19 issues 405 and 463
 Language/11_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A05_t06: Pass # co19 issues 405 and 463
 Language/11_Expressions/17_Getter_Invocation_A02_t02: Pass # co19 issues 405 and 463
-Language/11_Expressions/32_Type_Cast_A05_t01: Fail # co19 issue 463 and issue 5280
-Language/11_Expressions/32_Type_Cast_A05_t02: Pass # co19 issue 463 and issue 5280
-Language/11_Expressions/32_Type_Cast_A05_t04: Pass # co19 issue 463 and issue 5280
+
+Language/11_Expressions/32_Type_Cast_A05_t01: Fail # co19 issue 463
+Language/11_Expressions/32_Type_Cast_A05_t02: Fail # co19 issue 463
+Language/11_Expressions/32_Type_Cast_A05_t03: Fail # co19 issue 463
+Language/11_Expressions/32_Type_Cast_A05_t04: Fail # co19 issue 463
+Language/11_Expressions/32_Type_Cast_A05_t05: Fail # co19 issue 463
 
 Language/12_Statements/09_Switch_A05_t01: Fail # co19 issue 442
 
@@ -512,7 +525,7 @@
 LibTest/math/exp_A01_t01: Fail
 
 [ $compiler == none && $runtime == vm && $system != windows && $arch != x64 && $arch != arm ]
-LibTest/math/tan_A01_t01: Fail
+LibTest/math/tan_A01_t01: Pass, Fail
 
 [ $compiler == none && $runtime == vm && $arch != x64 ]
 LibTest/core/int/operator_left_shift_A01_t02: Fail # co19 issue 129
diff --git a/tests/compiler/dart2js/deprecated_features_test.dart b/tests/compiler/dart2js/deprecated_features_test.dart
deleted file mode 100644
index 58d8f07..0000000
--- a/tests/compiler/dart2js/deprecated_features_test.dart
+++ /dev/null
@@ -1,86 +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.
-
-// Test that deprecated language features are diagnosed correctly.
-
-import "package:expect/expect.dart";
-import 'dart:async';
-
-import '../../../sdk/lib/_internal/compiler/compiler.dart';
-import '../../utils/dummy_compiler_test.dart' as dummy;
-
-main() {
-  StringBuffer messages = new StringBuffer();
-  void handler(Uri uri, int begin, int end, String message, Diagnostic kind) {
-    if (kind == Diagnostic.VERBOSE_INFO) return;
-    if (identical(kind.name, 'source map')) return;
-    if (uri == null) {
-      messages.write('$kind: $message\n');
-    } else {
-      Expect.equals('main:${uri.path}', '$uri');
-      String source = TEST_SOURCE[uri.path];
-      Expect.isNotNull(source);
-      messages.write('$begin<${source.substring(begin, end)}>:${uri.path}:'
-                   '$kind: $message\n');
-    }
-  }
-
-  Future<String> provider(Uri uri) {
-    if (uri.scheme != "main") return dummy.provider(uri);
-    String source = TEST_SOURCE[uri.path];
-    Expect.isNotNull(source);
-    return new Future<String>.value(source);
-  }
-
-  String code = deprecatedFutureValue(
-      compile(new Uri(scheme: 'main'),
-              new Uri(scheme: 'lib', path: '/'),
-              new Uri(scheme: 'package', path: '/'),
-              provider, handler));
-  if (code == null) {
-    throw 'Compilation failed: ${messages}';
-  }
-  Expect.stringEquals(
-      // This string is composed of lines of the following format:
-      //
-      // offset<source>:path:kind: message
-      //
-      // "offset" is the character offset from the beginning of TEST_SOURCE.
-      // "source" is the substring of TEST_SOURCE that the compiler is
-      // indicating as erroneous.
-      // "path" is the URI path.
-      // "kind" is the result of calling toString on a [Diagnostic] object.
-      // "message" is the expected message as a [String].  This is a
-      // short-term solution and should eventually changed to include
-      // a symbolic reference to a MessageKind.
-      "15<part 'part.dart';>::${deprecatedMessage('missing part-of tag')}\n"
-      "0<>:/part.dart:info: Note: This file has no part-of tag, but it is being"
-      " used as a part.\n"
-      "53<()>::${deprecatedMessage('getter parameters')}\n",
-      messages.toString());
-}
-
-deprecatedMessage(feature) {
-  return
-    "warning: Warning: Deprecated language feature, $feature"
-    ", will be removed in a future Dart milestone.";
-}
-
-const Map<String, String> TEST_SOURCE =
-  const <String, String>{ '': """
-library test;
-
-part 'part.dart';
-
-class Foo {
-  get x() => null;
-}
-
-main() {
-  var a = new Foo();
-}
-""",
-    // TODO(ahe): Why isn't this 'part.dart'? Why the leading slash?
-    '/part.dart': '',
-  };
diff --git a/tests/compiler/dart2js/memory_compiler.dart b/tests/compiler/dart2js/memory_compiler.dart
index a45e1ca..5418963 100644
--- a/tests/compiler/dart2js/memory_compiler.dart
+++ b/tests/compiler/dart2js/memory_compiler.dart
@@ -20,7 +20,8 @@
 
 Compiler compilerFor(Map<String,String> memorySourceFiles,
                      {DiagnosticHandler diagnosticHandler,
-                      List<String> options: const []}) {
+                      List<String> options: const [],
+                      Compiler cachedCompiler}) {
   Uri script = currentDirectory.resolve(nativeToUriPath(Platform.script));
   Uri libraryRoot = script.resolve('../../../sdk/');
   Uri packageRoot = script.resolve('./packages/');
@@ -42,6 +43,37 @@
                                    libraryRoot,
                                    packageRoot,
                                    options);
+  if (cachedCompiler != null) {
+    compiler.coreLibrary = cachedCompiler.libraries['dart:core'];
+    compiler.types = cachedCompiler.types;
+    cachedCompiler.libraries.forEach((String uri, library) {
+      if (library.isPlatformLibrary) {
+        compiler.libraries[uri] = library;
+        compiler.onLibraryScanned(library, library.canonicalUri);
+      }
+    });
+
+    compiler.symbolConstructor = cachedCompiler.symbolConstructor;
+    compiler.mirrorSystemClass = cachedCompiler.mirrorSystemClass;
+    compiler.mirrorsUsedClass = cachedCompiler.mirrorsUsedClass;
+    compiler.mirrorSystemGetNameFunction =
+        cachedCompiler.mirrorSystemGetNameFunction;
+    compiler.symbolImplementationClass =
+        cachedCompiler.symbolImplementationClass;
+    compiler.symbolValidatedConstructor =
+        cachedCompiler.symbolValidatedConstructor;
+    compiler.mirrorsUsedConstructor = cachedCompiler.mirrorsUsedConstructor;
+    compiler.deferredLibraryClass = cachedCompiler.deferredLibraryClass;
+
+    Map cachedTreeElements =
+        cachedCompiler.enqueuer.resolution.resolvedElements;
+    cachedTreeElements.forEach((element, treeElements) {
+      if (element.getLibrary().isPlatformLibrary) {
+        compiler.enqueuer.resolution.resolvedElements[element] =
+            treeElements;
+      }
+    });
+  }
   return compiler;
 }
 
diff --git a/tests/compiler/dart2js/message_kind_helper.dart b/tests/compiler/dart2js/message_kind_helper.dart
new file mode 100644
index 0000000..f972a96
--- /dev/null
+++ b/tests/compiler/dart2js/message_kind_helper.dart
@@ -0,0 +1,50 @@
+// 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 dart2js.test.message_kind_helper;
+
+import 'package:expect/expect.dart';
+
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart' show
+    Compiler,
+    MessageKind;
+
+import 'memory_compiler.dart';
+
+const String ESCAPE_REGEXP = r'[[\]{}()*+?.\\^$|]';
+
+Compiler check(MessageKind kind, Compiler cachedCompiler) {
+  Expect.isNotNull(kind.howToFix);
+  Expect.isFalse(kind.examples.isEmpty);
+
+  for (String example in kind.examples) {
+    List<String> messages = <String>[];
+    void collect(Uri uri, int begin, int end, String message, kind) {
+      if (kind.name == 'verbose info') {
+        return;
+      }
+      messages.add(message);
+    }
+
+    Compiler compiler = compilerFor(
+        {'main.dart': example},
+        diagnosticHandler: collect,
+        options: ['--analyze-only'],
+        cachedCompiler: cachedCompiler);
+
+    compiler.run(Uri.parse('memory:main.dart'));
+
+    Expect.isFalse(messages.isEmpty, 'No messages in """$example"""');
+
+    String pattern = '${kind.template}\n${kind.howToFix}'.replaceAllMapped(
+        new RegExp(ESCAPE_REGEXP), (m) => '\\${m[0]}');
+    pattern = pattern.replaceAll(new RegExp(r'#\\\{[^}]*\\\}'), '.*');
+
+    for (String message in messages) {
+      Expect.isTrue(new RegExp('^$pattern\$').hasMatch(message),
+                    '"$pattern" does not match "$message"');
+    }
+    return compiler;
+  }
+}
diff --git a/tests/compiler/dart2js/message_kind_test.dart b/tests/compiler/dart2js/message_kind_test.dart
new file mode 100644
index 0000000..55f9bed
--- /dev/null
+++ b/tests/compiler/dart2js/message_kind_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 '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart' show
+    DualKind,
+    MessageKind;
+
+import 'message_kind_helper.dart';
+
+import 'dart:mirrors';
+
+main() {
+  ClassMirror cls = reflectClass(MessageKind);
+  Map<String, MessageKind> kinds = <String, MessageKind>{};
+  cls.variables.forEach((Symbol name, VariableMirror variable) {
+    if (variable.isStatic) {
+      var value = cls.getField(name).reflectee;
+      if (value is MessageKind) {
+        kinds[MirrorSystem.getName(name)] = value;
+      } else if (value is DualKind) {
+        kinds['${MirrorSystem.getName(name)}.error'] = value.error;
+        kinds['${MirrorSystem.getName(name)}.warning'] = value.warning;
+      } else {
+        Expect.fail("Weird static field: '${MirrorSystem.getName(name)}'.");
+      }
+    }
+  });
+  List<String> names = kinds.keys.toList()..sort();
+  List<String> examples = <String>[];
+  for (String name in names) {
+    MessageKind kind = kinds[name];
+    if (name == 'GENERIC' // Shouldn't be used.
+        // We can't provoke a crash.
+        || name == 'COMPILER_CRASHED'
+        || name == 'PLEASE_REPORT_THE_CRASH'
+        // We cannot provide examples for patch errors.
+        || name.startsWith('PATCH_')) continue;
+    if (kind.examples != null) {
+      examples.add(name);
+    } else {
+      print("No example in '$name'");
+    }
+  };
+  var cachedCompiler;
+  for (String name in examples) {
+    Stopwatch sw = new Stopwatch()..start();
+    cachedCompiler = check(kinds[name], cachedCompiler);
+    sw.stop();
+    print("Checked '$name' in ${sw.elapsedMilliseconds}ms.");
+  }
+}
diff --git a/tests/compiler/dart2js/mirror_helper_test.dart b/tests/compiler/dart2js/mirror_helper_test.dart
new file mode 100644
index 0000000..01e69ed
--- /dev/null
+++ b/tests/compiler/dart2js/mirror_helper_test.dart
@@ -0,0 +1,134 @@
+// 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_compiler.dart' show compilerFor;
+import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart' show
+    Compiler;
+import
+    '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
+show
+    Element, LibraryElement, ClassElement;
+import
+    '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart'
+show
+    Node;
+import
+    '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart'
+show
+    DartBackend, ElementAst;
+import
+    '../../../sdk/lib/_internal/compiler/implementation/mirror_renamer/mirror_renamer.dart'
+show
+    MirrorRenamer;
+import
+    '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart'
+show
+    SourceString;
+
+
+main() {
+  testWithMirrorRenaming();
+  testWithoutMirrorRenaming();
+  testWithMirrorRenamingMinify();
+  testWithoutMirrorRenamingMinify();
+}
+
+Compiler runCompiler({useMirrorHelperLibrary: false, minify: false}) {
+  List<String> options = ['--output-type=dart'];
+  if (minify) {
+    options.add('--minify');
+  }
+  Compiler compiler = compilerFor(MEMORY_SOURCE_FILES, options: options);
+  DartBackend backend = compiler.backend;
+  backend.useMirrorHelperLibrary = useMirrorHelperLibrary;
+  compiler.runCompiler(Uri.parse('memory:main.dart'));
+  return compiler;
+}
+
+void testWithMirrorRenaming() {
+  Compiler compiler = runCompiler(useMirrorHelperLibrary: true, minify: false);
+
+  DartBackend backend = compiler.backend;
+  Map<Node, String> renames = backend.renames;
+  Map<LibraryElement, String> imports = backend.imports;
+
+  Node getNameFunctionNode =
+      backend.memberNodes.values.first.first.body.statements.nodes.head;
+
+  Expect.equals(MirrorRenamer.MIRROR_HELPER_GET_NAME_FUNCTION,
+                renames[getNameFunctionNode.expression.selector]);
+  Expect.equals(MirrorRenamer.MIRROR_HELPER_CLASS_FULLY_QUALIFIED_NAME,
+                renames[getNameFunctionNode.expression.receiver]);
+  Expect.equals(2, imports.keys.length);
+  Expect.isTrue(imports.keys.any((library) =>
+      library.canonicalUri ==
+          new Uri(path: MirrorRenamer.MIRROR_HELPER_LIBRARY_NAME)));
+}
+
+void testWithMirrorRenamingMinify() {
+  Compiler compiler = runCompiler(useMirrorHelperLibrary: true, minify: true);
+
+  DartBackend backend = compiler.backend;
+  Map<Node, String> renames = backend.renames;
+  Map<LibraryElement, String> imports = backend.imports;
+
+  Node getNameFunctionNode =
+      backend.memberNodes.values.first.first.body.statements.nodes.head;
+
+  Expect.equals(MirrorRenamer.MIRROR_HELPER_GET_NAME_FUNCTION,
+      renames[getNameFunctionNode.expression.selector]);
+  Expect.equals(MirrorRenamer.MIRROR_HELPER_CLASS_FULLY_QUALIFIED_NAME,
+                renames[getNameFunctionNode.expression.receiver]);
+  Expect.equals(2, imports.keys.length);
+  Expect.isTrue(imports.keys.any((library) =>
+      library.canonicalUri ==
+          new Uri(path: MirrorRenamer.MIRROR_HELPER_LIBRARY_NAME)));
+}
+
+void testWithoutMirrorRenaming() {
+  Compiler compiler = runCompiler(useMirrorHelperLibrary: false, minify: false);
+
+  DartBackend backend = compiler.backend;
+  Map<Node, String> renames = backend.renames;
+  Map<LibraryElement, String> imports = backend.imports;
+
+  Node getNameFunctionNode =
+      backend.memberNodes.values.first.first.body.statements.nodes.head;
+
+  Expect.isFalse(renames.containsKey(getNameFunctionNode.expression.selector));
+  Expect.isFalse(renames.containsKey(getNameFunctionNode.expression.receiver));
+  Expect.equals(1, imports.keys.length);
+}
+
+void testWithoutMirrorRenamingMinify() {
+  Compiler compiler = runCompiler(useMirrorHelperLibrary: false, minify: true);
+
+  DartBackend backend = compiler.backend;
+  Map<Node, String> renames = backend.renames;
+  Map<LibraryElement, String> imports = backend.imports;
+
+  Node getNameFunctionNode =
+      backend.memberNodes.values.first.first.body.statements.nodes.head;
+
+  Expect.isFalse(renames.containsKey(getNameFunctionNode.expression.selector));
+  Expect.isFalse(renames.containsKey(getNameFunctionNode.expression.receiver));
+  Expect.equals(1, imports.keys.length);
+}
+
+const MEMORY_SOURCE_FILES = const <String, String> {
+  'main.dart': """
+import 'dart:mirrors';
+
+
+class Foo {
+  noSuchMethod(Invocation invocation) {
+    MirrorSystem.getName(invocation.memberName);
+  }
+}
+
+void main() {
+  new Foo().fisk();
+}
+"""};
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index 09fdd29..75623b9 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -48,19 +48,36 @@
   // 2. Some code was refactored, and there are more methods.
   // Either situation could be problematic, but in situation 2, it is often
   // acceptable to increase [expectedMethodCount] a little.
-  int expectedMethodCount = 315;
+  int expectedMethodCount = 317;
   Expect.isTrue(
       generatedCode.length <= expectedMethodCount,
       'Too many compiled methods: '
       '${generatedCode.length} > $expectedMethodCount');
 
+  // The following names should be retained:
+  List expectedNames = [
+      'Foo', // The name of class Foo.
+      r'Foo$', // The name of class Foo's constructor.
+      'Foo_staticMethod', // The name of Foo.staticMethod.
+      r'get$field', // The (getter) name of Foo.field.
+      r'instanceMethod$0']; // The name of Foo.instanceMethod.
+  Set recordedNames = new Set()
+      ..addAll(compiler.backend.emitter.recordedMangledNames)
+      ..addAll(compiler.backend.emitter.mangledFieldNames.keys)
+      ..addAll(compiler.backend.emitter.mangledGlobalFieldNames.keys);
+  Expect.setEquals(new Set.from(expectedNames), recordedNames);
+
   for (var library in compiler.libraries.values) {
     library.forEachLocalMember((member) {
-      if (library == compiler.mainApp) {
-        // TODO(ahe): We currently retain the entire library. Update this test
-        // to test that only Foo is retained.
+      if (library == compiler.mainApp
+          && member.name == const SourceString('Foo')) {
         Expect.isTrue(
             compiler.backend.isNeededForReflection(member), '$member');
+        member.forEachLocalMember((classMember) {
+          Expect.isTrue(
+              compiler.backend.isNeededForReflection(classMember),
+              '$classMember');
+        });
       } else {
         Expect.isFalse(
             compiler.backend.isNeededForReflection(member), '$member');
@@ -76,7 +93,14 @@
 
 import 'library.dart';
 
-class Foo {}
+class Foo {
+  int field;
+  instanceMethod() {}
+  static staticMethod() {}
+}
+
+unusedFunction() {
+}
 
 main() {
   useReflect(Foo);
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 950a7e5..ec113a8 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -340,7 +340,7 @@
     errors = [];
   }
 
-  TreeElementMapping resolveStatement(String text) {
+  CollectingTreeElements resolveStatement(String text) {
     parsedTree = parseStatement(text);
     return resolveNodeStatement(parsedTree, mainApp);
   }
@@ -380,10 +380,6 @@
     // Do nothing. The mock core library is already handled in the constructor.
   }
 
-  void importCoreLibrary(LibraryElement library) {
-    scanner.importLibrary(library, coreLibrary, null);
-  }
-
   Uri translateResolvedUri(LibraryElement importingLibrary,
                            Uri resolvedUri, Node node) => resolvedUri;
 
@@ -427,7 +423,7 @@
   }
 }
 
-void importLibrary(LibraryElement target, LibraryElement imported,
+void importLibrary(LibraryElement target, LibraryElementX imported,
                    Compiler compiler) {
   for (var element in imported.localMembers) {
     compiler.withCurrentElement(element, () {
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 5398829..112ba50 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -252,7 +252,7 @@
   MockCompiler compiler = testLocals([["foo", false], ["foo", false]]);
   Expect.equals(1, compiler.errors.length);
   Expect.equals(
-      new Message(MessageKind.DUPLICATE_DEFINITION, {'name': 'foo'}),
+      new Message(MessageKind.DUPLICATE_DEFINITION, {'name': 'foo'}, false),
       compiler.errors[0].message);
 }
 
@@ -435,7 +435,7 @@
 
   Expect.equals(
       new Message(
-          MessageKind.CANNOT_RESOLVE_TYPE.warning,  {'typeName': 'Foo'}),
+          MessageKind.CANNOT_RESOLVE_TYPE.warning,  {'typeName': 'Foo'}, false),
       compiler.warnings[0].message);
   VariableDefinitions definition = compiler.parsedTree;
   Expect.equals(warningNode, definition.type);
@@ -462,7 +462,7 @@
   // should only the get the error once.
   Expect.equals(2, compiler.errors.length);
   var cannotResolveBar = new Message(MessageKind.CANNOT_RESOLVE_TYPE.error,
-                                     {'typeName': 'Bar'});
+                                     {'typeName': 'Bar'}, false);
   Expect.equals(cannotResolveBar, compiler.errors[0].message);
   Expect.equals(cannotResolveBar, compiler.errors[1].message);
   compiler.clearErrors();
@@ -487,7 +487,8 @@
   compiler.resolveStatement("Foo bar;");
   Expect.equals(1, compiler.errors.length);
   Expect.equals(
-      new Message(MessageKind.CANNOT_RESOLVE_TYPE.warning, {'typeName': 'var'}),
+      new Message(
+          MessageKind.CANNOT_RESOLVE_TYPE.warning, {'typeName': 'var'}, false),
       compiler.errors[0].message);
   compiler.clearErrors();
 }
@@ -498,7 +499,8 @@
   compiler.resolveStatement("Foo bar;");
   Expect.equals(1, compiler.errors.length);
   Expect.equals(
-      new Message(MessageKind.CANNOT_RESOLVE_TYPE.warning, {'typeName': 'bar'}),
+      new Message(
+          MessageKind.CANNOT_RESOLVE_TYPE.warning, {'typeName': 'bar'}, false),
       compiler.errors[0].message);
   compiler.clearErrors();
 
@@ -811,7 +813,7 @@
 }
 
 map(ResolverVisitor visitor) {
-  TreeElementMapping elements = visitor.mapping;
+  CollectingTreeElements elements = visitor.mapping;
   return elements.map;
 }
 
@@ -832,8 +834,8 @@
 }
 
 checkMemberResolved(compiler, className, memberName) {
-  Element memberElement = findElement(compiler, className)
-      .lookupLocalMember(memberName);
+  ClassElement cls = findElement(compiler, className);
+  Element memberElement = cls.lookupLocalMember(memberName);
   Expect.isNotNull(memberElement);
   Expect.isNotNull(
       compiler.enqueuer.resolution.getCachedElements(memberElement));
diff --git a/tests/compiler/dart2js/simple_inferrer_postfix_prefix_test.dart b/tests/compiler/dart2js/simple_inferrer_postfix_prefix_test.dart
index e346b11..6ae3174 100644
--- a/tests/compiler/dart2js/simple_inferrer_postfix_prefix_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_postfix_prefix_test.dart
@@ -28,7 +28,7 @@
 }
 
 class B extends A {
-  get foo() => 42;
+  get foo => 42;
   operator[](index) => 42;
 
   returnString1() => super.foo--;
diff --git a/tests/compiler/dart2js/source_mapping_test.dart b/tests/compiler/dart2js/source_mapping_test.dart
index 3cccbbd..e204f2b 100644
--- a/tests/compiler/dart2js/source_mapping_test.dart
+++ b/tests/compiler/dart2js/source_mapping_test.dart
@@ -61,7 +61,7 @@
 
 String UNARY_TEST = 'void main() { ((x, y) { print(@-x + @~y); })(1,2); }';
 
-String BINARY_TEST = 'void main() { ((x, y) { if (x @!== y) print(x @* y); })(1,2); }';
+String BINARY_TEST = 'void main() { ((x, y) { if (x @!= y) print(x @* y); })(1,2); }';
 
 String SEND_TEST = '''
 void main() {
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index f0f61fd..e543480 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -140,10 +140,19 @@
   analyze("switch (0) { case 1: break; case 2: break; }");
   analyze("switch (0) { case 1: int i = ''; break; case 2: break; }",
       NOT_ASSIGNABLE);
-  analyze("switch (0) { case '': break; case 2: break; }",
+  analyze("switch (0) { case '': break; }",
       NOT_ASSIGNABLE);
   analyze("switch ('') { case 1: break; case 2: break; }",
       [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+
+  analyze("switch (0.5) { case 0.5: break; case 1.5: break; }",
+      [], []);
+  analyze("switch (1.0) { case 1.0: break; case 1.5: break; }",
+      [], []);
+  analyze("switch (null) { case 1.0: break; case 2: break; }",
+      [MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE, 
+       MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE], 
+      [MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL]);
 }
 
 testOperators() {
@@ -1543,9 +1552,11 @@
   };
 }
 
-analyze(String text, [expectedWarnings]) {
+analyze(String text, [expectedWarnings, expectedErrors]) {
   if (expectedWarnings == null) expectedWarnings = [];
   if (expectedWarnings is !List) expectedWarnings = [expectedWarnings];
+  if (expectedErrors == null) expectedErrors = [];
+  if (expectedErrors is !List) expectedErrors = [expectedErrors];
 
   compiler.diagnosticHandler = createHandler(text);
 
@@ -1562,8 +1573,10 @@
   TypeCheckerVisitor checker = new TypeCheckerVisitor(compiler, elements,
                                                                 types);
   compiler.clearWarnings();
+  compiler.clearErrors();
   checker.analyze(node);
   compareWarningKinds(text, expectedWarnings, compiler.warnings);
+  compareWarningKinds(text, expectedErrors, compiler.errors);
   compiler.diagnosticHandler = null;
 }
 
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_unused_classes_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_unused_classes_test.dart
new file mode 100644
index 0000000..db4389e
--- /dev/null
+++ b/tests/compiler/dart2js_extra/deferred/deferred_unused_classes_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that deferred loader analyzer doesn't trip over unused classes.
+
+import "package:expect/expect.dart";
+import 'dart:async';
+
+@lazy import 'deferred_class_library.dart';
+
+const lazy = const DeferredLibrary('deferred_class_library');
+
+class Base {}
+
+class DerivedNotUsed extends Base {}
+
+main() {
+}
diff --git a/tests/compiler/dart2js_extra/inline_position_crash_source.dart b/tests/compiler/dart2js_extra/inline_position_crash_source.dart
index 64d03ce..67194b8 100644
--- a/tests/compiler/dart2js_extra/inline_position_crash_source.dart
+++ b/tests/compiler/dart2js_extra/inline_position_crash_source.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of inline_position_crash_test;
+
 /*******************************************************************************
  * Long comment to make positions in this file exceed those in
  * 'inline_position_crash_source.dart'.
diff --git a/tests/compiler/dart2js_extra/inline_position_crash_test.dart b/tests/compiler/dart2js_extra/inline_position_crash_test.dart
index 07039ddd..54f58b2 100644
--- a/tests/compiler/dart2js_extra/inline_position_crash_test.dart
+++ b/tests/compiler/dart2js_extra/inline_position_crash_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+library inline_position_crash_test;
+
 part 'inline_position_crash_source.dart';
 
 class Sub extends Super {
diff --git a/tests/compiler/dart2js_extra/source_mapping_crash_source.dart b/tests/compiler/dart2js_extra/source_mapping_crash_source.dart
index 825360f..78f15e3 100644
--- a/tests/compiler/dart2js_extra/source_mapping_crash_source.dart
+++ b/tests/compiler/dart2js_extra/source_mapping_crash_source.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of source_mapping_crash_test;
+
 /*******************************************************************************
  * Long comment to make positions in this file exceed those in
  * 'source_mapping_crash_test.dart'.
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 5b87bf8..e67a374 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -4,6 +4,11 @@
 
 reg_exp_unicode_2_test: Fail # Bug 6592
 
+[ $compiler == dart2js && ($runtime == d8 || $runtime == drt) ]
+hash_set_test: Pass, Fail # v8 bug: Issue 12293
+list_test: Pass, Fail # v8 bug: Issue 12293
+
+
 [ $compiler == none ]
 unicode_test: Fail        # Bug 6706
 *dartc_test: Skip
diff --git a/tests/corelib/uri_file_test.dart b/tests/corelib/uri_file_test.dart
new file mode 100644
index 0000000..d0e30a7
--- /dev/null
+++ b/tests/corelib/uri_file_test.dart
@@ -0,0 +1,273 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+testFileUri() {
+  final unsupported = new UnsupportedError("");
+
+  var tests = [
+    ["", "", ""],
+    ["relative", "relative", "relative"],
+    ["relative/", "relative/", "relative\\"],
+    ["a%20b", "a b", "a b"],
+    ["a%20b/", "a b/", "a b\\"],
+    ["a/b", "a/b", "a\\b"],
+    ["a/b/", "a/b/", "a\\b\\"],
+    ["a%20b/c%20d", "a b/c d", "a b\\c d"],
+    ["a%20b/c%20d/", "a b/c d/", "a b\\c d\\"],
+
+    ["file:///absolute", "/absolute", "\\absolute"],
+    ["file:///absolute", "/absolute", "\\absolute"],
+    ["file:///a/b", "/a/b", "\\a\\b"],
+    ["file:///a/b", "/a/b", "\\a\\b"],
+
+    ["file://server/a/b", unsupported, "\\\\server\\a\\b"],
+    ["file://server/a/b/", unsupported, "\\\\server\\a\\b\\"],
+
+    ["file:///C:/", "/C:/", "C:\\"],
+    ["file:///C:/a/b", "/C:/a/b", "C:\\a\\b"],
+    ["file:///C:/a/b/", "/C:/a/b/", "C:\\a\\b\\"],
+
+    ["http:/a/b", unsupported, unsupported],
+    ["https:/a/b", unsupported, unsupported],
+    ["urn:a:b", unsupported, unsupported],
+  ];
+
+  void check(String s, filePath, bool windows) {
+    Uri uri = Uri.parse(s);
+    if (filePath is Error) {
+      if (filePath is UnsupportedError) {
+        Expect.throws(() => uri.toFilePath(windows: windows),
+                      (e) => e is UnsupportedError);
+      } else {
+        Expect.throws(() => uri.toFilePath(windows: windows));
+      }
+    } else {
+      Expect.equals(filePath, uri.toFilePath(windows: windows));
+      Expect.equals(
+          s, new Uri.file(filePath, windows: windows).toString());
+    }
+  }
+
+  for (var test in tests) {
+    check(test[0], test[1], false);
+    check(test[0], test[2], true);
+  }
+
+  Uri uri;
+  uri = Uri.parse("file:a");
+  Expect.equals("/a", uri.toFilePath(windows: false));
+  Expect.equals("\\a", uri.toFilePath(windows: true));
+  uri = Uri.parse("file:a/");
+  Expect.equals("/a/", uri.toFilePath(windows: false));
+  Expect.equals("\\a\\", uri.toFilePath(windows: true));
+}
+
+testFileUriWindowsSlash() {
+  var tests = [
+    ["", "", ""],
+    ["relative", "relative", "relative"],
+    ["relative/", "relative/", "relative\\"],
+    ["a%20b", "a b", "a b"],
+    ["a%20b/", "a b/", "a b\\"],
+    ["a/b", "a/b", "a\\b"],
+    ["a/b/", "a/b/", "a\\b\\"],
+    ["a%20b/c%20d", "a b/c d", "a b\\c d"],
+    ["a%20b/c%20d/", "a b/c d/", "a b\\c d\\"],
+
+    ["file:///absolute", "/absolute", "\\absolute"],
+    ["file:///absolute", "/absolute", "\\absolute"],
+    ["file:///a/b", "/a/b", "\\a\\b"],
+    ["file:///a/b", "/a/b", "\\a\\b"],
+
+    ["file://server/a/b", "//server/a/b", "\\\\server\\a\\b"],
+    ["file://server/a/b/", "//server/a/b/", "\\\\server\\a\\b\\"],
+
+    ["file:///C:/", "C:/", "C:\\"],
+    ["file:///C:/a/b", "C:/a/b", "C:\\a\\b"],
+    ["file:///C:/a/b/", "C:/a/b/", "C:\\a\\b\\"],
+  ];
+
+  for (var test in tests) {
+    Uri uri;
+    uri = new Uri.file(test[1], windows: true);
+    Expect.equals(test[0], uri.toString());
+    Expect.equals(test[2], uri.toFilePath(windows: true));
+  }
+}
+
+testFileUriWindowsWin32Namespace() {
+  var tests = [
+      ["\\\\?\\C:\\", "file:///C:/", "C:\\"],
+      ["\\\\?\\C:\\", "file:///C:/", "C:\\"],
+      ["\\\\?\\UNC\\server\\share\\file",
+       "file://server/share/file",
+       "\\\\server\\share\\file"],
+  ];
+
+  for (var test in tests) {
+    Uri uri = new Uri.file(test[0], windows: true);
+    Expect.equals(test[1], uri.toString());
+    Expect.equals(test[2], uri.toFilePath(windows: true));
+  }
+
+  Expect.throws(
+      () => new Uri.file("\\\\?\\file", windows: true),
+      (e) => e is ArgumentError);
+  Expect.throws(
+      () => new Uri.file("\\\\?\\UNX\\server\\share\\file", windows: true),
+      (e) => e is ArgumentError);
+}
+
+testFileUriDriveLetter() {
+  check(String s, String nonWindows, String windows) {
+    Uri uri;
+    uri = Uri.parse(s);
+    Expect.equals(nonWindows, uri.toFilePath(windows: false));
+    if (windows != null) {
+      Expect.equals(windows, uri.toFilePath(windows: true));
+    } else {
+      Expect.throws(() => uri.toFilePath(windows: true),
+                    (e) => e is UnsupportedError);
+    }
+  }
+
+  check("file:///C:", "/C:", "C:\\");
+  check("file:///C:/", "/C:/", "C:\\");
+  check("file:///C:a", "/C:a", null);
+  check("file:///C:a/", "/C:a/", null);
+
+  Expect.throws(() => new Uri.file("C:", windows: true),
+                (e) => e is ArgumentError);
+  Expect.throws(() => new Uri.file("C:a", windows: true),
+                (e) => e is ArgumentError);
+  Expect.throws(() => new Uri.file("C:a\b", windows: true),
+                (e) => e is ArgumentError);
+}
+
+testFileUriResolve() {
+  var tests = [
+    ["file:///a", "/a", "", "\\a", ""],
+    ["file:///a/", "/a/", "", "\\a\\", ""],
+    ["file:///b", "/a", "b", "\\a", "b"],
+    ["file:///b/", "/a", "b/", "\\a", "b\\"],
+    ["file:///a/b", "/a/", "b", "\\a\\", "b"],
+    ["file:///a/b/", "/a/", "b/", "\\a\\", "b\\"],
+    ["file:///a/c/d", "/a/b", "c/d", "\\a\\b", "c\\d"],
+    ["file:///a/c/d/", "/a/b", "c/d/", "\\a\\b", "c\\d\\"],
+    ["file:///a/b/c/d", "/a/b/", "c/d", "\\a\\b\\", "c\\d"],
+    ["file:///a/b/c/d/", "/a/b/", "c/d/", "\\a\\b\\", "c\\d\\"],
+  ];
+
+  check(String s, String absolute, String relative, bool windows) {
+    Uri absoluteUri = new Uri.file(absolute, windows: windows);
+    Uri relativeUri = new Uri.file(relative, windows: windows);
+    String relativeString =
+        windows ? relative.replaceAll("\\", "/") : relative;
+    Expect.equals(s, absoluteUri.resolve(relativeString).toString());
+    Expect.equals(s, absoluteUri.resolveUri(relativeUri).toString());
+  }
+
+  for (var test in tests) {
+    check(test[0], test[1], test[2], false);
+    check(test[0], test[1], test[2], true);
+    check(test[0], test[1], test[4], true);
+    check(test[0], test[3], test[2], true);
+    check(test[0], test[3], test[4], true);
+  }
+}
+
+testFileUriIllegalCharacters() {
+  // Slash is an invalid character in file names on both non-Windows
+  // and Windows.
+  Uri uri = Uri.parse("file:///a%2Fb");
+  Expect.throws(() => uri.toFilePath(windows: false),
+                (e) => e is UnsupportedError);
+  Expect.throws(() => uri.toFilePath(windows: true),
+                (e) => e is UnsupportedError);
+
+  // Illegal characters in windows file names.
+  var illegalWindowsPaths =
+      ["a<b", "a>b", "a:b", "a\"b", "a|b", "a?b", "a*b", "\\\\?\\c:\\a/b"];
+
+  for (var test in illegalWindowsPaths) {
+    Expect.throws(() => new Uri.file(test, windows: true),
+                  (e) => e is ArgumentError);
+    Expect.throws(() => new Uri.file("\\$test", windows: true),
+                  (e) => e is ArgumentError);
+
+    // It is possible to create non-Windows URIs, but not Windows URIs.
+    Uri uri = new Uri.file(test, windows: false);
+    Uri absoluteUri = new Uri.file("/$test", windows: false);
+    Expect.throws(() => new Uri.file(test, windows: true));
+    Expect.throws(() => new Uri.file("\\$test", windows: true));
+
+    // It is possible to extract non-Windows file path, but not
+    // Windows file path.
+    Expect.equals(test, uri.toFilePath(windows: false));
+    Expect.equals("/$test", absoluteUri.toFilePath(windows: false));
+    Expect.throws(() => uri.toFilePath(windows: true));
+    Expect.throws(() => absoluteUri.toFilePath(windows: true));
+  }
+
+  // Backslash
+  illegalWindowsPaths = ["a\\b", "a\\b\\"];
+  for (var test in illegalWindowsPaths) {
+    // It is possible to create both non-Windows URIs, and Windows URIs.
+    Uri uri = new Uri.file(test, windows: false);
+    Uri absoluteUri = new Uri.file("/$test", windows: false);
+    new Uri.file(test, windows: true);
+    new Uri.file("\\$test", windows: true);
+
+    // It is possible to extract non-Windows file path, but not
+    // Windows file path from the non-Windows URI (it has a backslash
+    // in a path segment).
+    Expect.equals(test, uri.toFilePath(windows: false));
+    Expect.equals("/$test", absoluteUri.toFilePath(windows: false));
+    Expect.throws(() => uri.toFilePath(windows: true),
+                  (e) => e is UnsupportedError);
+    Expect.throws(() => absoluteUri.toFilePath(windows: true));
+  }
+}
+
+testFileUriIllegalDriveLetter() {
+  Expect.throws(() => new Uri.file("1:\\", windows: true),
+                (e) => e is ArgumentError);
+  Uri uri = new Uri.file("1:\\", windows: false);
+  Expect.equals("1:\\", uri.toFilePath(windows: false));
+  Expect.throws(() => uri.toFilePath(windows: true),
+                (e) => e is UnsupportedError);
+}
+
+testAdditionalComponents() {
+  check(String s, {bool windowsOk: false}) {
+    Uri uri = Uri.parse(s);
+    Expect.throws(() => uri.toFilePath(windows: false),
+                  (e) => e is UnsupportedError);
+    if (windowsOk) {
+      Expect.isTrue(uri.toFilePath(windows: true) is String);
+    } else {
+      Expect.throws(() => uri.toFilePath(windows: true),
+                    (e) => e is UnsupportedError);
+    }
+  }
+
+  check("file:///path?query");
+  check("file:///path#fragment");
+  check("file:///path?query#fragment");
+  check("file://host/path", windowsOk: true);
+  check("file://user@password:host/path");
+}
+
+main() {
+  testFileUri();
+  testFileUriWindowsSlash();
+  testFileUriDriveLetter();
+  testFileUriWindowsWin32Namespace();
+  testFileUriResolve();
+  testFileUriIllegalCharacters();
+  testFileUriIllegalDriveLetter();
+  testAdditionalComponents();
+}
diff --git a/tests/html/element_test.dart b/tests/html/element_test.dart
index 7e13741..71dd4ea 100644
--- a/tests/html/element_test.dart
+++ b/tests/html/element_test.dart
@@ -285,6 +285,17 @@
       expect(firedEvent, false);
       e.click();
       expect(firedEvent, true);
+
+      var e2 = new DivElement();
+      var firedEvent2 = false;
+      e2.onClick.matches('.foo').listen((event) {
+        firedEvent2 = true;
+      });
+      e2.click();
+      expect(firedEvent2, false);
+      e2.classes.add('foo');
+      e2.click();
+      expect(firedEvent2, true);
     });
   });
 
@@ -728,4 +739,85 @@
       expect(range[1], isInputElement);
     });
   });
+
+  group('eventDelegation', () {
+    test('matches', () {
+      Element elem = new Element.div()..classes.addAll(['a', 'b']);
+      Element img = new Element.img()
+        ..classes.addAll(['b', 'a', 'd'])
+        ..id = 'cookie';
+      Element input = new InputElement()..classes.addAll(['c', 'd']);
+      var div = new Element.div()
+        ..classes.add('a')
+        ..id = 'wat';
+      document.body.append(elem);
+      document.body.append(img);
+      document.body.append(input);
+      document.body.append(div);
+
+      Element elem4 = new Element.div()..classes.addAll(['i', 'j']);
+      Element elem5 = new Element.div()
+        ..classes.addAll(['g', 'h'])
+        ..children.add(elem4);
+      Element elem6 = new Element.div()
+        ..classes.addAll(['e', 'f'])
+        ..children.add(elem5);
+      document.body.append(elem6);
+
+      var firedEvent = false;
+      var elems = queryAll('.a');
+      queryAll('.a').onClick.listen((event) {
+        firedEvent = true;
+      });
+      expect(firedEvent, false);
+      query('.c').click();
+      expect(firedEvent, false);
+      query('#wat').click();
+      expect(firedEvent, true);
+
+      var firedEvent4 = false;
+      queryAll('.a').onClick.matches('.d').listen((event) {
+        firedEvent4 = true;
+      });
+      expect(firedEvent4, false);
+      query('.c').click();
+      expect(firedEvent4, false);
+      query('#wat').click();
+      expect(firedEvent4, false);
+      query('#cookie').click();
+      expect(firedEvent4, true);
+
+      var firedEvent2 = false;
+      queryAll('.a').onClick.listen((event) {
+        firedEvent2 = true;
+      });
+      Element elem2 = new Element.html('<div class="a"><br/>');
+      document.body.append(elem2);
+      elem2.click();
+      expect(firedEvent2, false);
+      elem2.classes.add('a');
+      elem2.click();
+      expect(firedEvent2, false);
+
+      var firedEvent3 = false;
+      queryAll(':root').onClick.matches('.a').listen((event) {
+        firedEvent3 = true;
+      });
+      Element elem3 = new Element.html('<div class="d"><br/>');
+      document.body.append(elem3);
+      elem3.click();
+      expect(firedEvent3, false);
+      elem3.classes.add('a');
+      elem3.click();
+      expect(firedEvent3, true);
+
+      var firedEvent5 = false;
+      queryAll(':root').onClick.matches('.e').listen((event) {
+        firedEvent5 = true;
+      });
+      expect(firedEvent5, false);
+      query('.i').click();
+      expect(firedEvent5, true);
+    });
+  });
 }
diff --git a/tests/html/html.status b/tests/html/html.status
index 03be635..1000c5c 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -14,7 +14,7 @@
 # Document.register is unimplemented.
 custom_elements_test: Skip
 
-[ $compiler == dartanalyzer ]
+[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 # Document.register is unimplemented.
 custom_elements_test: Skip
 
@@ -71,6 +71,8 @@
 [ $compiler == none && ($runtime == drt || $runtime == dartium) ]
 request_animation_frame_test: Skip   # drt hangs; requestAnimationFrame not implemented
 worker_api_test: Fail # http://dartbug.com/10223
+element_test/click: Fail #TODO(efortuna)
+element_test/eventDelegation: Fail #TODO(efortuna)
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium) && $system == windows]
 websql_test: Skip # Issue 4941: stderr contains a backtrace.
diff --git a/tests/html/xhr_test.dart b/tests/html/xhr_test.dart
index 7c2f863..d47707f 100644
--- a/tests/html/xhr_test.dart
+++ b/tests/html/xhr_test.dart
@@ -208,6 +208,24 @@
         });
       });
     }
+
+    test('xhr postFormData', () {
+      var data = { 'name': 'John', 'time': '2 pm' };
+
+      var parts = [];
+      for (var key in data.keys) {
+        parts.add('${Uri.encodeQueryComponent(key)}='
+          '${Uri.encodeQueryComponent(data[key])}');
+      }
+      var encodedData = parts.join('&');
+
+      return HttpRequest.postFormData(
+          '${window.location.protocol}//${window.location.host}/echo', data)
+          .then((xhr) {
+          expect(xhr.responseText, encodedData);
+        });
+    });
+
   });
 
   group('xhr_requestBlob', () {
diff --git a/tests/isolate/global_error_handler_stream_test.dart b/tests/isolate/global_error_handler_stream_test.dart
index c792fc5..c1d8ce8 100644
--- a/tests/isolate/global_error_handler_stream_test.dart
+++ b/tests/isolate/global_error_handler_stream_test.dart
@@ -15,7 +15,7 @@
     firstFunction();
   } catch (e) {
     new Timer(Duration.ZERO, finishFunction);
-    throw;
+    rethrow;
   }
 }
 
diff --git a/tests/isolate/global_error_handler_test.dart b/tests/isolate/global_error_handler_test.dart
index e3b5de0..aa5ba92 100644
--- a/tests/isolate/global_error_handler_test.dart
+++ b/tests/isolate/global_error_handler_test.dart
@@ -15,7 +15,7 @@
     firstFunction();
   } catch (e) {
     new Timer(Duration.ZERO, finishFunction);
-    throw;
+    rethrow;
   }
 }
 
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index c260b67..1d3e6f5 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -29,10 +29,6 @@
 spawn_uri_vm_negative_test: fail
 unresolved_ports_negative_test: fail
 
-# test issue 10888
-global_error_handler_stream_test: fail
-global_error_handler_test: fail
-
 [ $compiler == dart2analyzer ]
 isolate2_negative_test: fail
 isolate_import_negative_test: fail
@@ -42,10 +38,6 @@
 spawn_uri_vm_negative_test: fail
 unresolved_ports_negative_test: fail
 
-# test issue 10888
-global_error_handler_stream_test: fail
-global_error_handler_test: fail
-
 [ $compiler == dart2js && ($runtime == d8 || $jscl) ]
 illegal_msg_stream_test: Fail # Issue 6750
 typed_data_message_test: Fail, OK # DataView only supported in browsers.
@@ -56,6 +48,10 @@
 [ $compiler == dart2js && $runtime == drt ]
 unresolved_ports_negative_test: Pass, Crash # Issue 10613
 
+[ $compiler == dart2js && $runtime == chrome ]
+spawn_uri_negative_test: Pass, Fail, Timeout # Issue: 12239
+spawn_uri_test: Pass, Fail, Timeout # Issue: 12239
+
 [ $compiler == dart2js ]
 serialization_test: Fail # Tries to access class TestingOnly declared in isolate_patch.dart
 illegal_msg_test: Fail # Issue 6750
diff --git a/tests/language/crash_12118_test.dart b/tests/language/crash_12118_test.dart
new file mode 100644
index 0000000..fea6996
--- /dev/null
+++ b/tests/language/crash_12118_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for issue 12118 which caused a crash in dart2js.
+
+const X = 42;
+
+class A {
+  final x;
+  A({this.x: X});
+}
+
+class B extends A {}
+
+void main() {
+  if (new B().x != 42) {
+    throw 'Test failed';
+  }
+}
diff --git a/tests/language/execute_finally10_test.dart b/tests/language/execute_finally10_test.dart
index 4591908..74beb5a 100644
--- a/tests/language/execute_finally10_test.dart
+++ b/tests/language/execute_finally10_test.dart
@@ -6,7 +6,7 @@
 // block as a successor of a catch block that throws.
 
 import "package:expect/expect.dart";
- 
+
 class A {
   var field;
   start() {}
@@ -26,7 +26,7 @@
       // variable.
       runCompiler.toString();
       runCompiler.toString();
-      throw;
+      rethrow;
     } finally {
       totalCompileTime.stop();
     }
diff --git a/tests/language/execute_finally11_test.dart b/tests/language/execute_finally11_test.dart
index 093d7dc..9ab66aa 100644
--- a/tests/language/execute_finally11_test.dart
+++ b/tests/language/execute_finally11_test.dart
@@ -6,7 +6,7 @@
 // block as a successor of a nested try block.
 
 import "package:expect/expect.dart";
- 
+
 class A {
   var field;
   start() {}
@@ -29,7 +29,7 @@
         runCompiler.toString();
       } catch (exception) {
       }
-      throw;
+      rethrow;
     } finally {
       totalCompileTime.stop();
     }
diff --git a/tests/language/final_used_in_try_test.dart b/tests/language/final_used_in_try_test.dart
index 3fbfddf..259ba8d 100644
--- a/tests/language/final_used_in_try_test.dart
+++ b/tests/language/final_used_in_try_test.dart
@@ -10,7 +10,7 @@
     try {
       Expect.equals('f', a);
     } catch (e) {
-      throw;
+      rethrow;
     }
     break;
   }
diff --git a/tests/language/full_stacktrace2_test.dart b/tests/language/full_stacktrace2_test.dart
index a98f5a6..5de34e0 100644
--- a/tests/language/full_stacktrace2_test.dart
+++ b/tests/language/full_stacktrace2_test.dart
@@ -24,7 +24,7 @@
     Expect.isTrue(fullTrace.contains("func7"));
     Expect.isTrue(fullTrace.contains("main"));
 
-    throw;  // This is a rethrow.
+    rethrow;  // This is a rethrow.
   }
 }
 int func4() {
diff --git a/tests/language/generic_test.dart b/tests/language/generic_test.dart
index 7e7c56c..918162c 100644
--- a/tests/language/generic_test.dart
+++ b/tests/language/generic_test.dart
@@ -56,14 +56,11 @@
       E e = new E();  // Throws a type error, if type checks are enabled.
     } on TypeError catch (error) {
       result = 1;
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("generic_test.dart", subs);
-      Expect.equals(31, error.line);  // new B<T>(t); AX does not extend A.
-      Expect.equals(21, error.column);
+      // Location of malformed error: T extends A, but AX does not extend A.
+      Expect.isTrue(error.toString().contains("line 20 pos 9"));
+      // Location of failed type check: new B<T>(t)/
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "generic_test.dart:31:21"));
     }
     return result;
   }
diff --git a/tests/language/getter_parameters_test.dart b/tests/language/getter_parameters_test.dart
new file mode 100644
index 0000000..491a82b
--- /dev/null
+++ b/tests/language/getter_parameters_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Test that a getter has no parameters.
+
+get f1 => null;
+get f2
+() /// 01: compile-time error
+=> null;
+get f3
+(arg) /// 02: compile-time error
+=> null;
+get f4
+([arg]) /// 03: compile-time error
+=> null;
+get f5
+({arg}) /// 04: compile-time error
+=> null;
+
+main() {
+  f1;
+  f2;
+  f3;
+  f4;
+  f5;
+}
+
diff --git a/tests/language/hash_map_null_key_foreach_test.dart b/tests/language/hash_map_null_key_foreach_test.dart
new file mode 100644
index 0000000..4e566fb
--- /dev/null
+++ b/tests/language/hash_map_null_key_foreach_test.dart
@@ -0,0 +1,19 @@
+// 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";
+
+// Regression test for using `null` as a key with `forEach`.
+
+main() {
+  var x = new Map<int, int>();
+  x[1] = 2;
+  x[null] = 1;
+  int c = 0;
+  x.forEach((int i, int j) {
+    c++;
+    Expect.isTrue(i == null || i is int, 'int or null expected');
+  });
+  Expect.equals(2, c);
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index e788b73..cdf20d7 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -15,6 +15,9 @@
 # 2) File a bug on each architecture for the failure due to the language change.
 # 3) Update the language/src directory with the updated test.
 
+[ $compiler == dart2js && ($runtime == ie9 || $runtime == ie10) ]
+licm2_test: Skip # Issue: 12298
+
 [ $compiler == dart2dart ]
 mixin_super_constructor_named_test: Fail
 mixin_super_constructor_positionals_test: Fail
@@ -28,6 +31,8 @@
 library_juxtaposition_test: Fail # Issue 6877
 pseudo_kw_illegal_test/14: Fail  # Issue 356
 bound_closure_equality_test: Fail # Issue 10849
+switch_int_double_test/01: Fail # Issue 7307
+switch_int_double_test/02: Fail # Issue 7307
 
 # These bugs refer currently ongoing language discussions.
 constructor5_test: Fail           # (Discussion ongoing)
@@ -47,8 +52,6 @@
 
 lazy_static3_test: Fail # Issue 3558
 
-type_error_test: Fail # http://dartbug.com/5280
-
 # DartC specific tests that should not be run by the VM
 *dartc_test: Skip
 *dartc_negative_test: Skip
@@ -68,18 +71,10 @@
 mixin_illegal_object_test/01: Crash # Issue 10952
 mixin_illegal_object_test/02: Crash # Issue 10952
 
-type_variable_field_initializer_closure_test: Crash # issue 8847
-closures_initializer_test: Crash # issue 8847
-closures_initializer2_test: Crash # issue 8847
-
 mixin_forwarding_constructor2_test: Fail # Issue 11888
 mixin_typedef_constructor_test: Fail # Issue 11888
 mixin_type_parameter2_test: Fail # Issue 11888
 
-const_constructor_mixin_test/01: Fail # Issue 11917
-const_constructor_mixin2_test/01: Fail # Issue 11917
-const_constructor_mixin3_test/01: Fail # Issue 11917
-
 [ $compiler == none && $unchecked ]
 
 # Only checked mode reports an error on type assignment
@@ -100,9 +95,6 @@
 
 
 [ $compiler == none && $runtime == drt ]
-type_variable_field_initializer_closure_test: Fail # issue 8847
-closures_initializer_test: Fail # VM bug: issue 8847
-closures_initializer2_test: Fail # VM bug: issue 8847
 final_variable_assignment_test/01: Fail
 final_variable_assignment_test/02: Fail
 final_variable_assignment_test/03: Fail
@@ -116,7 +108,6 @@
 [ $runtime == vm || ($runtime == drt && $compiler == none) ]
 first_class_types_literals_test: Fail # issue 11761
 call_test: Fail # Issue 1604
-throw8_test: Fail # Issue 11972
 
 [ $runtime == chrome ]
 
@@ -295,11 +286,7 @@
 compile_time_constant_checked3_test/05: Fail, OK
 compile_time_constant_checked3_test/06: Fail, OK
 
-type_error_test: Fail, OK # VM bug: http://dartbug.com/5280
-
-type_variable_field_initializer_closure_test: Crash # VM bug: issue 8847
-closures_initializer_test: Crash # VM bug: issue 8847
-closures_initializer2_test: Crash # VM bug: issue 8847
+positional_parameters_type_test: Fail # Triage this.
 
 bound_closure_equality_test: Fail # Issue 10849
 
@@ -314,13 +301,5 @@
 invocation_mirror_test: Fail, OK # hardcoded names.
 super_call4_test: Fail, OK # hardcoded names.
 
-
-[ $arch == simarm || $arch == arm ]
-try_catch4_test: Crash, Fail
-
-
 [ $arch == mips ]
 *: Skip
-
-[ $arch == simmips ]
-try_catch4_test: Fail
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 3f4a04f..e8a968b 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -7,9 +7,6 @@
 # Runtime negative test. No static errors or warnings.
 closure_call_wrong_argument_count_negative_test: skip
 
-
-#argument_definition_test/01: fail  # issue 11565 (passing for the wrong reason)
-
 illegal_invocation_test/01: fail # Issue: 11892
 
 # TBF: m([int p = 'String'])
@@ -47,8 +44,8 @@
 f_bounded_quantification_test/01: fail
 f_bounded_quantification_test/02: fail
 
-function_type_alias6_test/00: fail # Issue 11987
 function_type_alias9_test/00: crash # Issue 11987
+
 list_literal_syntax_test/01: fail # Issue 12103
 list_literal_syntax_test/02: fail # Issue 12103
 list_literal_syntax_test/03: fail # Issue 12103
@@ -56,6 +53,7 @@
 
 # TBF: disallowed in the most recent spec
 named_parameters_aggregated_test/03: fail
+positional_parameters_type_test: fail
 
 # TBF: non-const superinitializer; 7.6.3 Constant Constructors: The superinitializer that appears, explicitly or implicitly, in the initializer list of a constant constructor must specify a constant constructor of the superclass of the immediately enclosing class.
 non_const_super_negative_test: fail
@@ -106,16 +104,6 @@
 block_scope_test: fail
 lazy_static3_test: fail
 
-# test issue 10889, "throw" requires expression, "rethrow" should be used instead
-execute_finally10_test: fail
-execute_finally11_test: fail
-final_used_in_try_test: fail
-full_stacktrace2_test: fail
-stack_trace_test: fail
-throw3_test: fail
-try_catch3_test: fail
-type_error_test: fail
-
 # test issue 10890; on-catch UnknownType is a static warning, not error
 try_catch_on_syntax_test/01: fail
 
@@ -240,9 +228,6 @@
 # test issue 11596. e is Unknown is not a compile time error
 is_not_class2_negative_test: fail
 
-# test issue 11597, It is a compile-time error if part has no "part of" directive
-library_juxtaposition_test: fail
-
 # test issue 11598, Any use of a malbounded type gives rise to a static warning
 mixin_type_parameters_errors_test/01: fail
 mixin_type_parameters_errors_test/02: fail
@@ -283,14 +268,6 @@
 static_final_field_negative_test: fail
 constructor2_negative_test: fail
 
-# test issue 12158, 'native' is not in spec, so analyzer does not generate compile-time error
-syntax_test/28: fail
-syntax_test/29: fail
-syntax_test/30: fail
-syntax_test/31: fail
-syntax_test/32: fail
-syntax_test/33: fail
-
 # test issue 12159, print(exception.message_); causes static warning, not an error
 throw7_negative_test: fail
 
@@ -325,6 +302,8 @@
 library_ambiguous_test/02: fail
 library_ambiguous_test/03: fail
 
+# test issue 12289, assignment in assert statement
+type_error_test: fail
 
 [ $compiler == dartanalyzer && $checked ]
 factory1_test/00: fail
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 387f350..5acf485 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -3,73 +3,12 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2analyzer ]
-#argument_definition_test/01: fail  # issue 11565 (passing for the wrong reason)
 
-# test issue 11581, it is not warning to call dynamic
-call_through_getter_test: fail
-
-# test issue 11582, non-final field with 'const' constructor
-compile_time_constant10_test/none: fail
-
-# test issue 11583, int is valid key for constant map literal
-compile_time_constant_c_test/01: fail
-
-# test issue 11589, export D from 2 export directives
-export_cyclic_test: fail
-
-# test issue 11580, Function is not a malformed type
-black_listed_test/11: fail
-
-# test issue 11584, positional arguments cannot be used for named parameters
-compile_time_constant_e_test: fail
-
-# test issue 11585, static warning, not negative test
-constructor3_negative_test: fail # issue 11585
-constructor_call_wrong_argument_count_negative_test: fail
-instance_call_wrong_argument_count_negative_test: fail
-
-# test issue 11586, Class(args) is compile-time warning, not error
-constructor_negative_test: fail
-
-# test issue 11590, runtime only negative test
-field_method4_negative_test: fail
-
-# test issue 11591, assigning to the final variable is warning, not error
-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
-getter_no_setter_test/01: fail
-
-# test issue 11592, Function type alias (typedef) is not a constant
-first_class_types_constants_test: fail
-
-# test issue 11594, Reference to a not resolve identifier is static warning
-import_combinators_negative_test: fail
-interface_static_non_final_fields_negative_test: fail
-
-# test issue 11595, It is static warning to create instance (new) of the malformed type
-instantiate_type_variable_negative_test: fail
-
-# test issue 11596. e is Unknown is not a compile time error
-is_not_class2_negative_test: fail
-
-# test issue 11597, It is a compile-time error if part has no "part of" directive
-library_juxtaposition_test: fail
-
-# test issue 11598, 	Any use of a malbounded type gives rise to a static warning
-mixin_type_parameters_errors_test/01: fail
-mixin_type_parameters_errors_test/02: fail
-mixin_type_parameters_errors_test/05: fail
+# Runtime negative test. No static errors or warnings.
+closure_call_wrong_argument_count_negative_test: skip
 
 illegal_invocation_test/01: fail # Issue: 11892
 
-# TBF: a.imethod = () { return 1; };
-assign_instance_method_negative_test: fail
-
 # TBF: m([int p = 'String'])
 assign_static_type_test/06: fail
 
@@ -81,25 +20,14 @@
 cast_test/05: fail
 
 # TBF: It is a compile-time error if the superclass of a class C appears in the implements clause of C.
-closure_call_wrong_argument_count_negative_test: fail
 const_constructor_super_test/01: fail
 compile_time_constant10_test/none: fail
 compile_time_constant_c_test/01: fail
 
-# Runtime negative test. No static errors or warnings.
-closure_call_wrong_argument_count_negative_test: skip
-
 # TBF: m([int p = 'String']) and call 'const' instance creation
 compile_time_constant_checked2_test/03: fail
 compile_time_constant_checked3_test/03: fail
 
-# TBF: not initialized final instance variable
-constructor2_negative_test: fail
-constructor3_negative_test: fail
-constructor_call_wrong_argument_count_negative_test: fail
-constructor_initializer_test: fail # uses argument definition test
-constructor_negative_test: fail
-
 # TBF: It is a static type warning if a type parameter is a supertype of its upper bound.
 cyclic_type_variable_test/01: fail
 cyclic_type_variable_test/02: fail
@@ -116,75 +44,68 @@
 f_bounded_quantification_test/01: fail
 f_bounded_quantification_test/02: fail
 
+function_type_alias9_test/00: crash # Issue 11987
+
+list_literal_syntax_test/01: fail # Issue 12103
+list_literal_syntax_test/02: fail # Issue 12103
+list_literal_syntax_test/03: fail # Issue 12103
+malformed_test/none: fail
+
+# TBF: disallowed in the most recent spec
 named_parameters_aggregated_test/03: fail
-no_such_method_negative_test: fail
+positional_parameters_type_test: fail
+
+# TBF: non-const superinitializer; 7.6.3 Constant Constructors: The superinitializer that appears, explicitly or implicitly, in the initializer list of a constant constructor must specify a constant constructor of the superclass of the immediately enclosing class.
 non_const_super_negative_test: fail
+
+# TBF: 1is int; invalid character in number
 number_identifier_negative_test: fail
+
+# TBF: we should check conflicts not only for methods, but for accessors too
 override_field_test/01: fail
 override_field_test/02: fail
 override_field_test/03: fail
+
+# TBF: prefix T hidden by type variable T in 'new T.Class()'
 prefix10_negative_test: fail
-prefix11_negative_test: fail
-prefix12_negative_test: fail
-prefix1_negative_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
+
+# TBF: no error if A in our library, B extends A in other library, reference B._private from Test extends B in our library.
 private_member1_negative_test: fail
 private_member2_negative_test: fail
 private_member3_negative_test: fail
-pseudo_kw_illegal_test/14: fail
+
+# TBF
 pseudo_kw_test: fail
+
+# TBF: hiding at start of the block and declared after declaration statement
 scope_negative_test: fail
-static_call_wrong_argument_count_negative_test: fail
+
+# TBF: 'instance.staticMethod()' is static warning
 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
-throw7_negative_test: fail
-type_error_test: fail
-type_parameter_test/none: 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_static_context_negative_test: fail
-unresolved_in_factory_negative_test: fail
-unresolved_top_level_method_negative_test: fail
-unresolved_top_level_var_negative_test: fail
+
+# TBF
+method_override2_test/00: fail # issue 11497
+method_override2_test/01: fail # issue 11497
+method_override2_test/02: fail # issue 11497
+method_override2_test/03: fail # issue 11497
+method_override3_test/00: fail # issue 11497
+method_override3_test/01: fail # issue 11497
+method_override3_test/02: fail # issue 11497
+method_override4_test: fail # issue 11497
+method_override5_test: fail # issue 11497
+method_override6_test: fail # issue 11497
+
+
+
 
 # test issue 10683, It is a compile-time error if e refers to the name v or the name v=.
 block_scope_test: fail
 lazy_static3_test: fail
 
-# test issue 10752, there are 'implicit' scopes for 'if', 'while' and 'do-while'
-implicit_scope_test: fail
-
-# test issue 10889, "throw" requires expression, "rethrow" should be used instead
-execute_finally10_test: fail
-execute_finally11_test: fail
-final_used_in_try_test: fail
-full_stacktrace2_test: fail
-stack_trace_test: fail
-throw3_test: fail
-try_catch3_test: fail
-
 # test issue 10890; on-catch UnknownType is a static warning, not error
 try_catch_on_syntax_test/01: fail
-try_catch_on_syntax_test/07: fail
-try_catch_syntax_test/08: fail
 
 # test issue 10899; it is static warning, not error, to call methods of class literal
 class_literal_test/02: fail
@@ -231,23 +152,6 @@
 # Test issue 11564, named parameter starts with '_'
 named_parameters_with_object_property_names_test: fail
 
-# TBF
-method_override2_test/00: fail # issue 11497
-method_override2_test/01: fail # issue 11497
-method_override2_test/02: fail # issue 11497
-method_override2_test/03: fail # issue 11497
-method_override3_test/00: fail # issue 11497
-method_override3_test/01: fail # issue 11497
-method_override3_test/02: fail # issue 11497
-method_override4_test: fail # issue 11497
-method_override5_test: fail # issue 11497
-method_override6_test: fail # issue 11497
-
-# testing framework problem: we do report warning, framework does not understand it
-# may be https://codereview.chromium.org/18174010/ will fix this
-type_variable_bounds_test/08: fail
-wrong_number_type_arguments_test/01: fail
-
 # test issue 11575, classes with abstrac members are not marked as abstract
 abstract_factory_constructor_test/none: fail
 abstract_syntax_test/none: fail
@@ -272,10 +176,135 @@
 # test issue 11579, assignment, no setter
 getter_no_setter_test/none: fail
 
-# issue 11918: mixin and const constructor
+# test issue 11580, Function is not a malformed type
+black_listed_test/11: fail
+
+# test issue 11581, it is not warning to call dynamic
+call_through_getter_test: fail
+
+# test issue 11582, non-final field with 'const' constructor
+compile_time_constant10_test/none: fail
+
+# test issue 11583, int is valid key for constant map literal
+compile_time_constant_c_test/01: fail
+
+# test issue 11584, positional arguments cannot be used for named parameters
+compile_time_constant_e_test: fail
+
+# test issue 11585, static warning, not negative test
+constructor3_negative_test: fail
+constructor_call_wrong_argument_count_negative_test: fail
+instance_call_wrong_argument_count_negative_test: fail
+
+# test issue 11586, Class(args) is compile-time warning, not error
+constructor_negative_test: fail
+
+# test issue 11589, export D from 2 export directives
+export_cyclic_test: fail
+
+# test issue 11590, runtime only negative test
+field_method4_negative_test: fail
+
+# test issue 11591, assigning to the final variable is warning, not error
+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
+getter_no_setter_test/01: fail
+
+# test issue 11592, Function type alias (typedef) is not a constant
+first_class_types_constants_test: fail
+
+# test issue 11594, Reference to a not resolve identifier is static warning
+import_combinators_negative_test: fail
+interface_static_non_final_fields_negative_test: fail
+
+# test issue 11595, It is static warning to create instance (new) of the malformed type
+instantiate_type_variable_negative_test: fail
+
+# test issue 11596. e is Unknown is not a compile time error
+is_not_class2_negative_test: fail
+
+# test issue 11598, Any use of a malbounded type gives rise to a static warning
+mixin_type_parameters_errors_test/01: fail
+mixin_type_parameters_errors_test/02: fail
+mixin_type_parameters_errors_test/05: fail
+
+# test issue 11698, no setter, so warning, not error
+assign_instance_method_negative_test: fail
+
+# test issue 11918: mixin and const constructor
 const_constructor_mixin_test/01: fail
 const_constructor_mixin3_test/01: fail
 
+# test issue 11958, fails only at runtime
+no_such_method_negative_test: fail
+
+# test issue 11962, it is warning, not error to reference undeclared identifier
+prefix1_negative_test: fail
+prefix2_negative_test: fail
+prefix4_negative_test: fail
+prefix5_negative_test: fail
+prefix12_negative_test: fail
+
+# test issue 11963, it is fine to access any property of the dynamic variable
+prefix6_negative_test: fail
+
+# test issue 11964, Any use of a malformed type gives rise to a static warning.
+prefix8_negative_test: fail
+prefix9_negative_test: fail
+prefix11_negative_test: fail
+
+# test issue 11965, 'source' is not built-in identifier anymore
+pseudo_kw_illegal_test/14: fail
+
+# test issue 12156, fails only at runtime
+static_call_wrong_argument_count_negative_test: fail
+
+# test issue 12157, uninitializer instance variable is warning, so not negative test
+static_final_field_negative_test: fail
+constructor2_negative_test: fail
+
+# test issue 12159, print(exception.message_); causes static warning, not an error
+throw7_negative_test: fail
+
+# test issue 12160, not annotated warnings for type variables from static member
+type_parameter_test/none: fail
+# test issue 12161, type variable in static, malformed type, static warning
+type_variable_static_context_negative_test: fail
+
+# test issue 12162, 'a' has dynamic type, so it statically it is assignable to anything
+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
+
+# test issue 12163, unresolved identifier is static warning in static context
+unresolved_in_factory_negative_test: fail
+unresolved_top_level_method_negative_test: fail
+unresolved_top_level_var_negative_test: fail
+
+# test issue 12181, uses argument definition test
+constructor_initializer_test: fail
+
+# test issue 12184, It is static warning, not error, to assign to a constant variable.
+static_final_field2_negative_test: fail
+
+# test issue 12191, ambuguous import is always warning now
+prefix3_negative_test: fail
+library_ambiguous_test/00: fail
+library_ambiguous_test/01: fail
+library_ambiguous_test/02: fail
+library_ambiguous_test/03: fail
+
+# test issue 12289, assignment in assert statement
+type_error_test: fail
+
 [ $compiler == dart2analyzer && $checked ]
 factory1_test/00: fail
 factory1_test/01: fail
@@ -291,10 +320,4 @@
 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/library_juxtaposition_part.dart b/tests/language/library_juxtaposition_part.dart
index 2b14942..708c854 100644
--- a/tests/language/library_juxtaposition_part.dart
+++ b/tests/language/library_juxtaposition_part.dart
@@ -2,4 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part of lib;
+
 const c = 47;
diff --git a/tests/language/missing_part_of_tag_part.dart b/tests/language/missing_part_of_tag_part.dart
new file mode 100644
index 0000000..c4618bc
--- /dev/null
+++ b/tests/language/missing_part_of_tag_part.dart
@@ -0,0 +1,3 @@
+// 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.
diff --git a/tests/language/missing_part_of_tag_test.dart b/tests/language/missing_part_of_tag_test.dart
new file mode 100644
index 0000000..ffb360c
--- /dev/null
+++ b/tests/language/missing_part_of_tag_test.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test for missing part-of tag.
+
+library lib;
+
+part 'missing_part_of_tag_part.dart'; /// 01: compile-time error
+
+void main() {}
\ No newline at end of file
diff --git a/tests/language/mixin_type_parameter4_test.dart b/tests/language/mixin_type_parameter4_test.dart
new file mode 100644
index 0000000..00fe43e
--- /dev/null
+++ b/tests/language/mixin_type_parameter4_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class R<E, F> {}
+
+class M<J> implements R<bool, J> {}
+
+class B1 {}
+class B2 {}
+
+class A1<T> extends B1 with M<T> {}
+
+typedef A2<T> = B2 with M<T>;
+
+main() {
+  var ab = new A1<int>();
+  Expect.isTrue(ab is R<bool, int>);
+  ab = new A2<int>();
+  Expect.isTrue(ab is R<bool, int>);
+}
diff --git a/tests/language/named_parameters_type_test.dart b/tests/language/named_parameters_type_test.dart
index 304cbed..1eb7a7f 100644
--- a/tests/language/named_parameters_type_test.dart
+++ b/tests/language/named_parameters_type_test.dart
@@ -25,22 +25,25 @@
       acceptFunNumOptBool(funNum);  // No static type warning.
     } on TypeError catch (error) {
       result += 1;
-      Expect.stringEquals("(num, {b: bool}) => void", error.dstType);
-      Expect.stringEquals("(num) => void", error.srcType);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("(num, {b: bool}) => void"));  // dstType
+      Expect.isTrue(msg.contains("(num) => void"));  // srcType
     }
     try {
       acceptFunNumOptBool(funNumBool);  /// static type warning
     } on TypeError catch (error) {
       result += 10;
-      Expect.stringEquals("(num, {b: bool}) => void", error.dstType);
-      Expect.stringEquals("(num, bool) => void", error.srcType);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("(num, {b: bool}) => void"));  // dstType
+      Expect.isTrue(msg.contains("(num, bool) => void"));  // srcType
     }
     try {
       acceptFunNumOptBool(funNumOptBoolX);  /// static type warning
     } on TypeError catch (error) {
       result += 100;
-      Expect.stringEquals("(num, {b: bool}) => void", error.dstType);
-      Expect.stringEquals("(num, {x: bool}) => void", error.srcType);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("(num, {b: bool}) => void"));  // dstType
+      Expect.isTrue(msg.contains("(num, {x: bool}) => void"));  // srcType
     }
     return result;
   }
diff --git a/tests/language/positional_parameters_type_test.dart b/tests/language/positional_parameters_type_test.dart
index db26b84..6c3c77d 100644
--- a/tests/language/positional_parameters_type_test.dart
+++ b/tests/language/positional_parameters_type_test.dart
@@ -25,15 +25,23 @@
       acceptFunNumOptBool(funNum);  // No static type warning.
     } on TypeError catch (error) {
       result += 1;
-      Expect.stringEquals("(num, [bool]) => void", error.dstType);
-      Expect.stringEquals("(num) => void", error.srcType);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'(num, [bool]) => void'"));  // dstType
+      Expect.isTrue(msg.contains("'(num) => void'"));  // srcType
+      Expect.isTrue(msg.contains("'funNumOptBool'"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "positional_parameters_type_test.dart:14:35"));
     }
     try {
       acceptFunNumOptBool(funNumBool);  /// static type warning
     } on TypeError catch (error) {
       result += 10;
-      Expect.stringEquals("(num, [bool]) => void", error.dstType);
-      Expect.stringEquals("(num, bool) => void", error.srcType);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'(num, [bool]) => void'"));  // dstType
+      Expect.isTrue(msg.contains("'(num, bool) => void'"));  // srcType
+      Expect.isTrue(msg.contains("'funNumOptBool'"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "positional_parameters_type_test.dart:14:35"));
     }
     try {
       acceptFunNumOptBool(funNumOptBoolX);  // No static type warning.
diff --git a/tests/language/regress_11800_test.dart b/tests/language/regress_11800_test.dart
new file mode 100644
index 0000000..14c8a6f
--- /dev/null
+++ b/tests/language/regress_11800_test.dart
@@ -0,0 +1,19 @@
+// 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=--optimization-counter-threshold=10
+
+import "package:expect/expect.dart";
+
+// Test correct register allocation with a value used twice at the same
+// instruction.
+test(List a, int v) {
+  a[v] = v;
+}
+
+main() {
+  var list = new List(2);
+  for (var i = 0; i < 20; i++) test(list, 1);
+  Expect.equals(null, list[0]);
+  Expect.equals(1, list[1]);
+}
diff --git a/tests/language/stack_trace_test.dart b/tests/language/stack_trace_test.dart
index 2f584a6..e2fd827 100644
--- a/tests/language/stack_trace_test.dart
+++ b/tests/language/stack_trace_test.dart
@@ -70,7 +70,7 @@
     try {
       func();
     } on MyException catch (exception) {
-      throw;
+      rethrow;
     }
     return 10;
   }
diff --git a/tests/language/switch_int_double_test.dart b/tests/language/switch_int_double_test.dart
new file mode 100644
index 0000000..d6e02dd
--- /dev/null
+++ b/tests/language/switch_int_double_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that double literals with no fractional part is not treated as having
+// static type int.
+
+import "package:expect/expect.dart";
+
+void main() {
+  Expect.equals(100, test(1.0));
+  Expect.equals(75, test(0.75));
+  Expect.equals(null, test(0.5));
+}
+
+int test(num ratio) {
+  switch (ratio) {
+    case 0.75:
+      return 75;
+    case 1.0:
+      return 100;
+    case 2:       /// 01: compile-time error
+      return 200; /// 01: continued
+    case 'foo':   /// 02: compile-time error
+      return 400; /// 02: continued
+  }
+}
\ No newline at end of file
diff --git a/tests/language/throw3_test.dart b/tests/language/throw3_test.dart
index 111404c..9a3ef0a 100644
--- a/tests/language/throw3_test.dart
+++ b/tests/language/throw3_test.dart
@@ -37,7 +37,7 @@
       }
     } on MyException catch (ex) {
       print(ex.message_);
-      throw;  // Rethrow the exception.
+      rethrow;  // Rethrow the exception.
     }
     return 10;
   }
diff --git a/tests/language/try_catch3_test.dart b/tests/language/try_catch3_test.dart
index b6b6e60..e485b61 100644
--- a/tests/language/try_catch3_test.dart
+++ b/tests/language/try_catch3_test.dart
@@ -81,7 +81,7 @@
     } on MyParameterizedException<String, TestException> catch (e, trace) {
       i = 800;
       trace.printStackTrace(e);
-      throw;
+      rethrow;
     } on MyException catch (exception) {
       i = 100;
       print(exception.getMessage());
diff --git a/tests/language/try_catch_syntax_test.dart b/tests/language/try_catch_syntax_test.dart
index 68b8aec..b153d84 100644
--- a/tests/language/try_catch_syntax_test.dart
+++ b/tests/language/try_catch_syntax_test.dart
@@ -42,6 +42,6 @@
 }
 
 testIllegalRethrow() {
-  try { throw; } catch (e) { }             /// 16: compile-time error
-  try { } catch (e) { } finally { throw; } /// 17: compile-time error
+  try { rethrow; } catch (e) { }             /// 16: compile-time error
+  try { } catch (e) { } finally { rethrow; } /// 17: compile-time error
 }
diff --git a/tests/language/type_cast_vm_test.dart b/tests/language/type_cast_vm_test.dart
index 90bb522..9285eb0 100644
--- a/tests/language/type_cast_vm_test.dart
+++ b/tests/language/type_cast_vm_test.dart
@@ -22,13 +22,13 @@
     int result = 0;
     try {
       var i = "hello" as int;  // Throws a CastError
-    } on TypeError catch (error, stacktrace) {
+    } catch (error) {
       result = 1;
       Expect.isTrue(error is CastError);
-      Expect.equals("int", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("type cast", error.dstName);
-      checkTopFunction("type_cast_vm_test.dart:24:23", stacktrace);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("int"));  // dstType
+      Expect.isTrue(msg.contains("String"));  // srcType
+      checkTopFunction("type_cast_vm_test.dart:24:23", error.stackTrace);
     }
     return result;
   }
@@ -44,7 +44,7 @@
       a[0] = 0;
       a[index()]++;  // Type check succeeds, but does not create side effects.
       Expect.equals(1, a[0]);
-    } on TypeError catch (error) {
+    } catch (error) {
       result = 100;
     }
     return result;
@@ -57,13 +57,13 @@
     }
     try {
       int i = f("hello" as int);  // Throws a CastError
-    } on TypeError catch (error, stacktrace) {
+    } catch (error) {
       result = 1;
       Expect.isTrue(error is CastError);
-      Expect.equals("int", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("type cast", error.dstName);
-      checkTopFunction("type_cast_vm_test.dart:59:25", stacktrace);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("int"));  // dstType
+      Expect.isTrue(msg.contains("String"));  // srcType
+      checkTopFunction("type_cast_vm_test.dart:59:25", error.stackTrace);
     }
     return result;
   }
@@ -75,13 +75,13 @@
     }
     try {
       int i = f("hello");
-    } on TypeError catch (error, stacktrace) {
+    } catch (error) {
       result = 1;
       Expect.isTrue(error is CastError);
-      Expect.equals("int", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("type cast", error.dstName);
-      checkTopFunction("type_cast_vm_test.dart:74:16", stacktrace);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("int"));  // dstType
+      Expect.isTrue(msg.contains("String"));  // srcType
+      checkTopFunction("type_cast_vm_test.dart:74:16", error.stackTrace);
     }
     return result;
   }
@@ -93,12 +93,12 @@
     Expect.equals(5, (field as String).length);
     try {
       field as int;  // Throws a CastError
-    } on TypeError catch (error, stacktrace) {
+    } catch (error) {
       result = 1;
-      Expect.equals("int", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("type cast", error.dstName);
-      checkTopFunction("type_cast_vm_test.dart:95:13", stacktrace);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("int"));  // dstType
+      Expect.isTrue(msg.contains("String"));  // srcType
+      checkTopFunction("type_cast_vm_test.dart:95:13", error.stackTrace);
     }
     return result;
   }
@@ -111,12 +111,12 @@
     anyFunction = null as Function;  // No error.
     try {
       var i = f as int;  // Throws a TypeError if type checks are enabled.
-    } on TypeError catch (error, stacktrace) {
+    } catch (error) {
       result = 1;
-      Expect.equals("int", error.dstType);
-      Expect.equals("() => dynamic", error.srcType);
-      Expect.equals("type cast", error.dstName);
-      checkTopFunction("type_cast_vm_test.dart:113:17", stacktrace);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("int"));  // dstType
+      Expect.isTrue(msg.contains("() => dynamic"));  // srcType
+      checkTopFunction("type_cast_vm_test.dart:113:17", error.stackTrace);
     }
     return result;
   }
diff --git a/tests/language/type_error_test.dart b/tests/language/type_error_test.dart
index b41ad07..fc62c23 100644
--- a/tests/language/type_error_test.dart
+++ b/tests/language/type_error_test.dart
@@ -133,7 +133,7 @@
   } on TypeError catch (e) {
     print(e); // This might provoke an error.
     if (assertionsEnabled) return; // Expected type error.
-    throw; // Rethrow unexpected type error.
+    rethrow; // Rethrow unexpected type error.
   }
   if (assertionsEnabled) {
     throw 'expected TypeError';
@@ -145,7 +145,7 @@
     assert(o);
   } on TypeError catch (e) {
     print(e); // This might provoke an error.
-    if (!assertionsEnabled) throw; // Unexpected error.
+    if (!assertionsEnabled) rethrow; // Unexpected error.
   }
 }
 
@@ -154,7 +154,7 @@
     print(o);
   } on TypeError catch (e) {
     print('unexpected type error: ${Error.safeToString(e)}');
-    throw; // Unexpected type error.
+    rethrow; // Unexpected type error.
   } on CastError catch (e) {
     print(e); // This might provoke an error.
     return; // Expected a cast error.
diff --git a/tests/language/type_vm_test.dart b/tests/language/type_vm_test.dart
index 29f7aff..fda7b1c 100644
--- a/tests/language/type_vm_test.dart
+++ b/tests/language/type_vm_test.dart
@@ -3,8 +3,15 @@
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=--enable_type_checks --no_show_internal_names
 // Dart test program testing type checks.
+
 import "package:expect/expect.dart";
 
+class C {
+  factory C() {
+    return 1;  // Implicit result type is 'C', not int.
+  }
+}
+
 class TypeTest {
   static test() {
     int result = 0;
@@ -12,17 +19,12 @@
       int i = "hello";  // Throws a TypeError if type checks are enabled.
     } on TypeError catch (error) {
       result = 1;
-      Expect.equals("int", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("i", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(12, error.line);
-      Expect.equals(15, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'int'"));  // dstType
+      Expect.isTrue(msg.contains("'String'"));  // srcType
+      Expect.isTrue(msg.contains("'i'"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:19:15"));
     }
     return result;
   }
@@ -53,17 +55,12 @@
       int i = f("hello");  // Throws a TypeError if type checks are enabled.
     } on TypeError catch (error) {
       result = 1;
-      Expect.equals("int", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("i", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(49, error.line);
-      Expect.equals(15, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'int'"));  // dstType
+      Expect.isTrue(msg.contains("'String'"));  // srcType
+      Expect.isTrue(msg.contains("'i'"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:51:15"));
     }
     return result;
   }
@@ -77,17 +74,12 @@
       int i = f("hello");  // Throws a TypeError if type checks are enabled.
     } on TypeError catch (error) {
       result = 1;
-      Expect.equals("int", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("function result", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(74, error.line);
-      Expect.equals(14, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'int'"));  // dstType
+      Expect.isTrue(msg.contains("'String'"));  // srcType
+      Expect.isTrue(msg.contains("function result"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:71:14"));
     }
     return result;
   }
@@ -99,17 +91,12 @@
       field = "hello";  // Throws a TypeError if type checks are enabled.
     } on TypeError catch (error) {
       result = 1;
-      Expect.equals("int", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("field", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(99, error.line);
-      Expect.equals(15, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'int'"));  // dstType
+      Expect.isTrue(msg.contains("'String'"));  // srcType
+      Expect.isTrue(msg.contains("'field'"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:91:15"));
     }
     return result;
   }
@@ -123,17 +110,12 @@
       int i = f;  // Throws a TypeError if type checks are enabled.
     } on TypeError catch (error) {
       result = 1;
-      Expect.equals("int", error.dstType);
-      Expect.equals("() => dynamic", error.srcType);
-      Expect.equals("i", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(123, error.line);
-      Expect.equals(15, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'int'"));  // dstType
+      Expect.isTrue(msg.contains("'() => dynamic'"));  // srcType
+      Expect.isTrue(msg.contains("'i'"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:110:15"));
     }
     return result;
   }
@@ -154,17 +136,12 @@
       acceptObjFunObj(voidFunObj);  // Throws a TypeError.
     } on TypeError catch (error) {
       result = 1;
-      Expect.equals("(Object) => Object", error.dstType);
-      Expect.equals("(Object) => void", error.srcType);
-      Expect.equals("objFunObj", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(145, error.line);
-      Expect.equals(33, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'(Object) => Object'"));  // dstType
+      Expect.isTrue(msg.contains("'(Object) => void'"));  // srcType
+      Expect.isTrue(msg.contains("'objFunObj'"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:127:33"));
     }
     return result;
   }
@@ -188,17 +165,12 @@
       acceptFunNum(funString);  // Throws an error.
     } on TypeError catch (error) {
       result = 1;
-      Expect.equals("(num) => void", error.dstType);
-      Expect.equals("(String) => void", error.srcType);
-      Expect.equals("funNum", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(175, error.line);
-      Expect.equals(28, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'(num) => void'"));  // dstType
+      Expect.isTrue(msg.contains("'(String) => void'"));  // srcType
+      Expect.isTrue(msg.contains("'funNum'"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:152:28"));
     }
     return result;
   }
@@ -209,145 +181,100 @@
       bool i = !"hello";  // Throws a TypeError if type checks are enabled.
     } on TypeError catch (error) {
       result++;
-      Expect.equals("bool", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("boolean expression", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(209, error.line);
-      Expect.equals(17, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'bool'"));  // dstType
+      Expect.isTrue(msg.contains("'String'"));  // srcType
+      Expect.isTrue(msg.contains("boolean expression"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:181:17"));
     }
     try {
       while ("hello") {};  // Throws a TypeError if type checks are enabled.
     } on TypeError catch (error) {
       result++;
-      Expect.equals("bool", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("boolean expression", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(225, error.line);
-      Expect.equals(14, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'bool'"));  // dstType
+      Expect.isTrue(msg.contains("'String'"));  // srcType
+      Expect.isTrue(msg.contains("boolean expression"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:192:14"));
     }
     try {
       do {} while ("hello");  // Throws a TypeError if type checks are enabled.
     } on TypeError catch (error) {
       result++;
-      Expect.equals("bool", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("boolean expression", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(241, error.line);
-      Expect.equals(20, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'bool'"));  // dstType
+      Expect.isTrue(msg.contains("'String'"));  // srcType
+      Expect.isTrue(msg.contains("boolean expression"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:203:20"));
     }
     try {
       for (;"hello";) {};  // Throws a TypeError if type checks are enabled.
     } on TypeError catch (error) {
       result++;
-      Expect.equals("bool", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("boolean expression", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(257, error.line);
-      Expect.equals(13, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'bool'"));  // dstType
+      Expect.isTrue(msg.contains("'String'"));  // srcType
+      Expect.isTrue(msg.contains("boolean expression"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:214:13"));
     }
     try {
       int i = "hello" ? 1 : 0;  // Throws a TypeError if type checks are enabled.
     } on TypeError catch (error) {
       result++;
-      Expect.equals("bool", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("boolean expression", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(273, error.line);
-      Expect.equals(15, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'bool'"));  // dstType
+      Expect.isTrue(msg.contains("'String'"));  // srcType
+      Expect.isTrue(msg.contains("boolean expression"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:225:15"));
     }
     try {
       if ("hello") {};  // Throws a TypeError if type checks are enabled.
     } on TypeError catch (error) {
       result++;
-      Expect.equals("bool", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("boolean expression", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(289, error.line);
-      Expect.equals(11, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'bool'"));  // dstType
+      Expect.isTrue(msg.contains("'String'"));  // srcType
+      Expect.isTrue(msg.contains("boolean expression"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:236:11"));
     }
     try {
       if ("hello" || false) {};  // Throws a TypeError if type checks are enabled.
     } on TypeError catch (error) {
       result++;
-      Expect.equals("bool", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("boolean expression", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(305, error.line);
-      Expect.equals(11, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'bool'"));  // dstType
+      Expect.isTrue(msg.contains("'String'"));  // srcType
+      Expect.isTrue(msg.contains("boolean expression"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:247:11"));
     }
     try {
       if (false || "hello") {};  // Throws a TypeError if type checks are enabled.
     } on TypeError catch (error) {
       result++;
-      Expect.equals("bool", error.dstType);
-      Expect.equals("String", error.srcType);
-      Expect.equals("boolean expression", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(321, error.line);
-      Expect.equals(20, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'bool'"));  // dstType
+      Expect.isTrue(msg.contains("'String'"));  // srcType
+      Expect.isTrue(msg.contains("boolean expression"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:258:20"));
     }
     try {
       if (null) {};  // Throws a TypeError if type checks are enabled.
     } on TypeError catch (error) {
       result++;
-      Expect.equals("bool", error.dstType);
-      Expect.equals("Null", error.srcType);
-      Expect.equals("boolean expression", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(337, error.line);
-      Expect.equals(11, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'bool'"));  // dstType
+      Expect.isTrue(msg.contains("'Null'"));  // srcType
+      Expect.isTrue(msg.contains("boolean expression"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:269:11"));
     }
     return result;
   }
@@ -359,17 +286,12 @@
       var x = new C();
     } on TypeError catch (error) {
       result++;
-      Expect.equals("C", error.dstType);
-      Expect.equals("int", error.srcType);
-      Expect.equals("function result", error.dstName);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("type_vm_test.dart", subs);
-      Expect.equals(560, error.line);
-      Expect.equals(12, error.column);
+      var msg = error.toString();
+      Expect.isTrue(msg.contains("'C'"));  // dstType
+      Expect.isTrue(msg.contains("'int'"));  // srcType
+      Expect.isTrue(msg.contains("function result"));  // dstName
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "type_vm_test.dart:11:12"));
     }
     return result;
   }
@@ -392,49 +314,34 @@
         List<int> ai = a;
       } on TypeError catch (error) {
         result++;
-        Expect.equals("List<int>", error.dstType);
-        Expect.equals("List<Object>", error.srcType);
-        Expect.equals("ai", error.dstName);
-        int pos = error.url.lastIndexOf("/", error.url.length);
-        if (pos == -1) {
-          pos = error.url.lastIndexOf("\\", error.url.length);
-        }
-        String subs = error.url.substring(pos + 1, error.url.length);
-        Expect.equals("type_vm_test.dart", subs);
-        Expect.equals(392, error.line);
-        Expect.equals(24, error.column);
+        var msg = error.toString();
+        Expect.isTrue(msg.contains("'List<int>'"));  // dstType
+        Expect.isTrue(msg.contains("'List<Object>'"));  // srcType
+        Expect.isTrue(msg.contains("'ai'"));  // dstName
+        Expect.isTrue(error.stackTrace.toString().contains(
+            "type_vm_test.dart:314:24"));
       }
       try {
         List<num> an = a;
       } on TypeError catch (error) {
         result++;
-        Expect.equals("List<num>", error.dstType);
-        Expect.equals("List<Object>", error.srcType);
-        Expect.equals("an", error.dstName);
-        int pos = error.url.lastIndexOf("/", error.url.length);
-        if (pos == -1) {
-          pos = error.url.lastIndexOf("\\", error.url.length);
-        }
-        String subs = error.url.substring(pos + 1, error.url.length);
-        Expect.equals("type_vm_test.dart", subs);
-        Expect.equals(408, error.line);
-        Expect.equals(24, error.column);
+        var msg = error.toString();
+        Expect.isTrue(msg.contains("'List<num>'"));  // dstType
+        Expect.isTrue(msg.contains("'List<Object>'"));  // srcType
+        Expect.isTrue(msg.contains("'an'"));  // dstName
+        Expect.isTrue(error.stackTrace.toString().contains(
+            "type_vm_test.dart:325:24"));
       }
       try {
         List<String> as = a;
       } on TypeError catch (error) {
         result++;
-        Expect.equals("List<String>", error.dstType);
-        Expect.equals("List<Object>", error.srcType);
-        Expect.equals("as", error.dstName);
-        int pos = error.url.lastIndexOf("/", error.url.length);
-        if (pos == -1) {
-          pos = error.url.lastIndexOf("\\", error.url.length);
-        }
-        String subs = error.url.substring(pos + 1, error.url.length);
-        Expect.equals("type_vm_test.dart", subs);
-        Expect.equals(424, error.line);
-        Expect.equals(27, error.column);
+        var msg = error.toString();
+        Expect.isTrue(msg.contains("'List<String>'"));  // dstType
+        Expect.isTrue(msg.contains("'List<Object>'"));  // srcType
+        Expect.isTrue(msg.contains("'as'"));  // dstName
+        Expect.isTrue(error.stackTrace.toString().contains(
+            "type_vm_test.dart:336:27"));
       }
     }
     {
@@ -447,17 +354,12 @@
         List<String> as = a;
       } on TypeError catch (error) {
         result++;
-        Expect.equals("List<String>", error.dstType);
-        Expect.equals("List<int>", error.srcType);
-        Expect.equals("as", error.dstName);
-        int pos = error.url.lastIndexOf("/", error.url.length);
-        if (pos == -1) {
-          pos = error.url.lastIndexOf("\\", error.url.length);
-        }
-        String subs = error.url.substring(pos + 1, error.url.length);
-        Expect.equals("type_vm_test.dart", subs);
-        Expect.equals(447, error.line);
-        Expect.equals(27, error.column);
+        var msg = error.toString();
+        Expect.isTrue(msg.contains("'List<String>'"));  // dstType
+        Expect.isTrue(msg.contains("'List<int>'"));  // srcType
+        Expect.isTrue(msg.contains("'as'"));  // dstName
+        Expect.isTrue(error.stackTrace.toString().contains(
+            "type_vm_test.dart:354:27"));
       }
     }
     {
@@ -468,34 +370,24 @@
         List<int> ai = a;
       } on TypeError catch (error) {
         result++;
-        Expect.equals("List<int>", error.dstType);
-        Expect.equals("List<num>", error.srcType);
-        Expect.equals("ai", error.dstName);
-        int pos = error.url.lastIndexOf("/", error.url.length);
-        if (pos == -1) {
-          pos = error.url.lastIndexOf("\\", error.url.length);
-        }
-        String subs = error.url.substring(pos + 1, error.url.length);
-        Expect.equals("type_vm_test.dart", subs);
-        Expect.equals(468, error.line);
-        Expect.equals(24, error.column);
+        var msg = error.toString();
+        Expect.isTrue(msg.contains("'List<int>'"));  // dstType
+        Expect.isTrue(msg.contains("'List<num>'"));  // srcType
+        Expect.isTrue(msg.contains("'ai'"));  // dstName
+        Expect.isTrue(error.stackTrace.toString().contains(
+            "type_vm_test.dart:370:24"));
       }
       List<num> an = a;
       try {
         List<String> as = a;
       } on TypeError catch (error) {
         result++;
-        Expect.equals("List<String>", error.dstType);
-        Expect.equals("List<num>", error.srcType);
-        Expect.equals("as", error.dstName);
-        int pos = error.url.lastIndexOf("/", error.url.length);
-        if (pos == -1) {
-          pos = error.url.lastIndexOf("\\", error.url.length);
-        }
-        String subs = error.url.substring(pos + 1, error.url.length);
-        Expect.equals("type_vm_test.dart", subs);
-        Expect.equals(485, error.line);
-        Expect.equals(27, error.column);
+        var msg = error.toString();
+        Expect.isTrue(msg.contains("'List<String>'"));  // dstType
+        Expect.isTrue(msg.contains("'List<num>'"));  // srcType
+        Expect.isTrue(msg.contains("'as'"));  // dstName
+        Expect.isTrue(error.stackTrace.toString().contains(
+            "type_vm_test.dart:382:27"));
       }
     }
     {
@@ -506,33 +398,23 @@
         List<int> ai = a;
       } on TypeError catch (error) {
         result++;
-        Expect.equals("List<int>", error.dstType);
-        Expect.equals("List<String>", error.srcType);
-        Expect.equals("ai", error.dstName);
-        int pos = error.url.lastIndexOf("/", error.url.length);
-        if (pos == -1) {
-          pos = error.url.lastIndexOf("\\", error.url.length);
-        }
-        String subs = error.url.substring(pos + 1, error.url.length);
-        Expect.equals("type_vm_test.dart", subs);
-        Expect.equals(506, error.line);
-        Expect.equals(24, error.column);
+        var msg = error.toString();
+        Expect.isTrue(msg.contains("'List<int>'"));  // dstType
+        Expect.isTrue(msg.contains("'List<String>'"));  // srcType
+        Expect.isTrue(msg.contains("'ai'"));  // dstName
+        Expect.isTrue(error.stackTrace.toString().contains(
+            "type_vm_test.dart:398:24"));
       }
       try {
         List<num> an = a;
       } on TypeError catch (error) {
         result++;
-        Expect.equals("List<num>", error.dstType);
-        Expect.equals("List<String>", error.srcType);
-        Expect.equals("an", error.dstName);
-        int pos = error.url.lastIndexOf("/", error.url.length);
-        if (pos == -1) {
-          pos = error.url.lastIndexOf("\\", error.url.length);
-        }
-        String subs = error.url.substring(pos + 1, error.url.length);
-        Expect.equals("type_vm_test.dart", subs);
-        Expect.equals(522, error.line);
-        Expect.equals(24, error.column);
+        var msg = error.toString();
+        Expect.isTrue(msg.contains("'List<num>'"));  // dstType
+        Expect.isTrue(msg.contains("'List<String>'"));  // srcType
+        Expect.isTrue(msg.contains("'an'"));  // dstName
+        Expect.isTrue(error.stackTrace.toString().contains(
+            "type_vm_test.dart:409:24"));
       }
       List<String> as = a;
     }
@@ -554,14 +436,6 @@
   }
 }
 
-
-class C {
-  factory C() {
-    return 1;  // Implicit result type is 'C', not int.
-  }
-}
-
-
 main() {
   TypeTest.testMain();
 }
diff --git a/tests/language/unsupported_operators_test.dart b/tests/language/unsupported_operators_test.dart
new file mode 100644
index 0000000..a80987f
--- /dev/null
+++ b/tests/language/unsupported_operators_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test handling of unsupported operators.
+
+library unsupported_operators;
+
+class C {
+  m() {
+    print(
+          super === /// 01: compile-time error
+          null);
+    print(
+          super !== /// 02: compile-time error
+          null);
+  }
+}
+
+void main() {
+  new C().m();
+  new C().m();
+  print(
+        "foo" === /// 03: compile-time error
+        null);
+  print(
+        "foo" !== /// 04: compile-time error
+        null);
+}
\ No newline at end of file
diff --git a/tests/lib/analyzer/analyze_tests.status b/tests/lib/analyzer/analyze_tests.status
index 802f246..ca318fe 100644
--- a/tests/lib/analyzer/analyze_tests.status
+++ b/tests/lib/analyzer/analyze_tests.status
@@ -6,7 +6,6 @@
 javascript_int_overflow_literal_test/01: fail, ok
 
 # https://code.google.com/p/dart/issues/detail?id=11665
-standalone/assert_test: fail
 standalone/io/directory_invalid_arguments_test: fail
 standalone/io/file_constructor_test: fail
 standalone/io/file_fuzz_test: fail
@@ -35,7 +34,6 @@
 javascript_int_overflow_literal_test/01: fail, ok
 
 # https://code.google.com/p/dart/issues/detail?id=11665
-standalone/assert_test: fail
 standalone/io/directory_invalid_arguments_test: fail
 standalone/io/file_constructor_test: fail
 standalone/io/file_fuzz_test: fail
@@ -56,8 +54,5 @@
 standalone/typed_data_view_test: fail
 standalone/typed_data_test: fail
 
-# pkg issue https://code.google.com/p/dart/issues/detail?id=11856
-standalone/io/secure_socket_renegotiate_test: fail
-
 # https://code.google.com/p/dart/issues/detail?id=11647
 standalone/package/package_isolate_test: fail
diff --git a/tests/lib/convert/line_splitter_test.dart b/tests/lib/convert/line_splitter_test.dart
new file mode 100644
index 0000000..acdc633
--- /dev/null
+++ b/tests/lib/convert/line_splitter_test.dart
@@ -0,0 +1,180 @@
+// 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 line_splitter_test;
+import "package:expect/expect.dart";
+import 'dart:async';
+import 'dart:convert';
+import 'dart:math' as MATH;
+
+
+void main() {
+  testSimpleConvert();
+  testManyLines();
+  testReadLine1();
+  testReadLine2();
+}
+
+void testManyLines() {
+  const breaks = const ['\n', '\r\n'];
+  int breakIndex = 0;
+
+  var inputs = const ['line1', 'line2', 'long line 3', ' line 4 ', 'l5'];
+
+
+  var buffer = inputs.fold(new StringBuffer(), (buff, e) {
+    buff.write(e);
+    buff.write(breaks[breakIndex]);
+
+    breakIndex++;
+    breakIndex = breakIndex % breaks.length;
+
+    return buff;
+  });
+
+
+  var foo = _getLinesSliced(buffer.toString());
+  Expect.equals(inputs.join(), foo);
+}
+
+
+String _getLinesSliced(String str) {
+  String lines;
+  var stringSink =
+      new StringConversionSink.withCallback((result) => lines = result);
+  var sink = new LineSplitter().startChunkedConversion(stringSink);
+
+  const chunkSize = 3;
+  var index = 0;
+  while(index < str.length) {
+    var end = MATH.min(str.length, index + chunkSize);
+
+    sink.addSlice(str, index, end, false);
+    index += chunkSize;
+  }
+
+  sink.close();
+  return lines;
+}
+
+void testSimpleConvert() {
+  var test = """line1
+line2
+line3""";
+
+
+  var decoder = new LineSplitter();
+  var result = decoder.convert(test);
+
+  Expect.listEquals(['line1', 'line2', 'line3'], result);
+
+  test = "Line1\nLine2\r\nLine3\rLi"
+      "ne4\n"
+       "\n\n\r\n\r\n\r\r";
+
+  result = decoder.convert(test);
+
+  Expect.listEquals(
+      ['Line1', 'Line2', 'Line3', 'Line4', '', '', '', '', '', ''],
+      result);
+}
+
+void testReadLine1() {
+  var controller = new StreamController(sync: true);
+  var stream = controller.stream
+      .transform(new Utf8Decoder())
+      .transform(new LineSplitter());
+
+  var stage = 0;
+  var done = false;
+
+  void stringData(line) {
+    Expect.equals(stage, 0);
+    Expect.equals("Line", line);
+    stage++;
+  }
+
+  void streamClosed() {
+    Expect.equals(1, stage);
+    done = true;
+  }
+
+  stream.listen(
+      stringData,
+      onDone: streamClosed);
+
+  // Note: codeUnits is fine. Text is ASCII.
+  controller.add("Line".codeUnits);
+  controller.close();
+  Expect.isTrue(done, 'should be done by now');
+}
+
+void testReadLine2() {
+  var controller = new StreamController(sync: true);
+
+  var stream = controller.stream
+    .transform(new Utf8Decoder())
+    .transform(new LineSplitter());
+
+  var done = false;
+
+  var stage = 0;
+  var subStage = 0;
+  stream.listen((line) {
+      if (stage == 0) {
+        if (subStage == 0) {
+          Expect.equals("Line1", line);
+          subStage++;
+        } else if (subStage == 1) {
+          Expect.equals("Line2", line);
+          subStage++;
+        } else if (subStage == 2) {
+          Expect.equals("Line3", line);
+          subStage = 0;
+          stage++;
+        } else {
+          Expect.fail("Stage 0 failed");
+        }
+      } else if (stage == 1) {
+        if (subStage == 0) {
+          Expect.equals("Line4", line);
+          subStage = 0;
+          stage++;
+        } else {
+          Expect.fail("Stage 1 failed");
+        }
+      } else if (stage == 2) {
+        if (subStage < 4) {
+          // Expect 5 empty lines. As long as the stream is not closed the
+          // final \r cannot be interpreted as a end of line.
+          Expect.equals("", line);
+          subStage++;
+        } else if (subStage == 4) {
+          Expect.equals("", line);
+          subStage = 0;
+          stage++;
+        } else {
+          Expect.fail("Stage 2 failed");
+        }
+      } else if (stage == 3) {
+        if (subStage == 0) {
+          Expect.equals("", line);
+          stage++;
+        } else {
+          Expect.fail("Stage 3 failed");
+        }
+      }
+    }, onDone: () {
+      Expect.equals(4, stage);
+      Expect.equals(0, subStage);
+      done = true;
+    });
+
+  // Note: codeUnits is fine. Text is ASCII.
+  controller.add("Line1\nLine2\r\nLine3\rLi".codeUnits);
+  controller.add("ne4\n".codeUnits);
+  controller.add("\n\n\r\n\r\n\r\r".codeUnits);
+  controller.close();
+  Expect.isTrue(done, 'should be done here...');
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index b321b7a..31a0738 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -2,16 +2,25 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+[ $compiler == dart2js && ($runtime == d8 || $runtime == drt) ]
+convert/chunked_conversion_utf87_test: Pass, Fail # v8 bug: Issue 12293
+typed_data/byte_data_test: Pass, Fail # v8 bug: Issue 12293
+
 [ $compiler == dart2js ]
 math/*: Skip
+mirrors/invoke_test: Fail # Issue 11954
 mirrors/class_mirror_type_variables_test: Fail # Issue 12087
 mirrors/invoke_private_test: Fail # Issue 12164
 mirrors/function_type_mirror_test: Fail # Issue 12166
+mirrors/generics_test: Fail # Issue 12333
+mirrors/fake_function_test: Fail # Issue 11612
 mirrors/method_mirror_name_test: Fail # Issue 6335
 mirrors/method_mirror_properties_test: Fail # Issue 11861
 mirrors/method_mirror_returntype_test : Fail # Issue 11928
+mirrors/mixin_members_test : Fail # Issue 11863
 mirrors/mirrors_test: Fail # TODO(ahe): I'm working on fixing this.
 mirrors/null_test : Fail # Issue 12129
+mirrors/library_metadata_test: Fail # Issue 10905
 mirrors/library_uri_io_test: Skip # Not intended for dart2js as it uses dart:io.
 async/run_async3_test: Fail # _enqueueImmediate runs after Timer. http://dartbug.com/9002
 async/run_async4_test: Pass, Fail # no global exception handler in isolates. http://dartbug.com/9012
diff --git a/tests/lib/math/random_test.dart b/tests/lib/math/random_test.dart
index d1e02bc..bb3b347 100644
--- a/tests/lib/math/random_test.dart
+++ b/tests/lib/math/random_test.dart
@@ -47,6 +47,12 @@
   Expect.equals(2134030067, rnd.nextInt(1 << ++i));
   Expect.equals(721180690, rnd.nextInt(1 << ++i));
   Expect.equals(32, i);
-  // If max is too large expect an ArgumentError. 
+  // If max is too large expect an ArgumentError.
   Expect.throws(() => rnd.nextInt((1 << i)+1), (e) => e is ArgumentError);
+
+  rnd = new Random(6790);
+  Expect.approxEquals(0.7360144236, rnd.nextDouble());
+  Expect.approxEquals(0.3292339731, rnd.nextDouble());
+  Expect.approxEquals(0.3489622548, rnd.nextDouble());
+  Expect.approxEquals(0.9815975892, rnd.nextDouble());
 }
diff --git a/tests/lib/mirrors/fake_function_test.dart b/tests/lib/mirrors/fake_function_test.dart
new file mode 100644
index 0000000..a824be0
--- /dev/null
+++ b/tests/lib/mirrors/fake_function_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:mirrors";
+
+import "package:expect/expect.dart";
+
+class WannabeFunction {
+  int call(int a, int b) => a + b;
+  method(x) => x * x;
+}
+
+main() {
+  Expect.isTrue(new WannabeFunction() is Function);
+
+  ClosureMirror cm = reflect(new WannabeFunction());
+  Expect.equals(7, cm.invoke(const Symbol("call"), [3,4]).reflectee);
+  Expect.throws(() => cm.invoke(const Symbol("call"), [3]),
+                (e) => e is NoSuchMethodError,
+                "Wrong arity");
+  Expect.equals(49, cm.invoke(const Symbol("method"), [7]).reflectee);
+  Expect.throws(() => cm.invoke(const Symbol("method"), [3, 4]),
+                (e) => e is NoSuchMethodError,
+                "Wrong arity");
+  Expect.equals(7, cm.apply([3,4]).reflectee);
+  Expect.throws(() => cm.apply([3]),
+                (e) => e is NoSuchMethodError,
+                "Wrong arity");
+
+  MethodMirror mm = cm.function;
+  Expect.equals(const Symbol("call"), mm.simpleName);
+  Expect.equals(reflectClass(WannabeFunction),
+                mm.owner);
+  Expect.isTrue(mm.isRegularMethod);
+  Expect.equals(const Symbol("int"), mm.returnType.simpleName);
+  Expect.equals(const Symbol("int"), mm.parameters[0].type.simpleName);
+  Expect.equals(const Symbol("int"), mm.parameters[1].type.simpleName);
+
+  ClassMirror km = cm.type;
+  Expect.equals(reflectClass(WannabeFunction), km);
+  Expect.equals(const Symbol("WannabeFunction"), km.simpleName);
+  Expect.equals(mm, km.members[const Symbol("call")]);
+  Expect.setEquals([const Symbol("call"), const Symbol("method")],
+                   km.members.keys);
+}
diff --git a/tests/lib/mirrors/generics_test.dart b/tests/lib/mirrors/generics_test.dart
new file mode 100644
index 0000000..dcb9093
--- /dev/null
+++ b/tests/lib/mirrors/generics_test.dart
@@ -0,0 +1,133 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.type_arguments_test;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class A<T> {}
+class B extends A {}            // Same as class B extends A<dynamic>.
+class C extends A<num, int> {}  // Same as class C extends A<dynamic>.
+class D extends A<int> {}
+class E<S> extends A<S> {}
+class F<R> extends A<int> {}
+class G {}
+
+typeParameters(mirror, parameterNames) {
+  Expect.listEquals(parameterNames.map((n) => new Symbol(n)).toList(),
+                    mirror.typeVariables.keys.toList());
+}
+
+typeArguments(mirror, argumentMirrors) {
+  Expect.listEquals(argumentMirrors,
+                    mirror.typeArguments.values.toList());
+  if (!mirror.isOriginalDeclaration) {
+    Expect.listEquals(mirror.typeVariables.keys.toList(),
+                      mirror.typeArguments.keys.toList());
+  }
+}
+
+main() {
+  // Declarations.
+  typeParameters(reflectClass(A), ['T']);
+  typeParameters(reflectClass(B), []);
+  typeParameters(reflectClass(C), []);
+  typeParameters(reflectClass(D), []);
+  typeParameters(reflectClass(E), ['S']);
+  typeParameters(reflectClass(F), ['R']);
+  typeParameters(reflectClass(G), []);
+
+  typeArguments(reflectClass(A), []);
+  typeArguments(reflectClass(B), []);
+  typeArguments(reflectClass(C), []);
+  typeArguments(reflectClass(D), []);
+  typeArguments(reflectClass(E), []);
+  typeArguments(reflectClass(F), []);
+  typeArguments(reflectClass(G), []);
+
+  Expect.isTrue(reflectClass(A).isOriginalDeclaration);
+  Expect.isTrue(reflectClass(B).isOriginalDeclaration);
+  Expect.isTrue(reflectClass(C).isOriginalDeclaration);
+  Expect.isTrue(reflectClass(D).isOriginalDeclaration);
+  Expect.isTrue(reflectClass(E).isOriginalDeclaration);
+  Expect.isTrue(reflectClass(F).isOriginalDeclaration);
+  Expect.isTrue(reflectClass(G).isOriginalDeclaration);
+
+  Expect.equals(reflectClass(A), reflectClass(A).originalDeclaration);
+  Expect.equals(reflectClass(B), reflectClass(B).originalDeclaration);
+  Expect.equals(reflectClass(C), reflectClass(C).originalDeclaration);
+  Expect.equals(reflectClass(D), reflectClass(D).originalDeclaration);
+  Expect.equals(reflectClass(E), reflectClass(E).originalDeclaration);
+  Expect.equals(reflectClass(F), reflectClass(F).originalDeclaration);
+  Expect.equals(reflectClass(G), reflectClass(G).originalDeclaration);
+
+  // Instantiations.
+  typeParameters(reflect(new A<num>()).type, ['T']);
+  typeParameters(reflect(new B<num>()).type, []);
+  typeParameters(reflect(new C()).type, []);
+  typeParameters(reflect(new D()).type, []);
+  typeParameters(reflect(new E()).type, ['S']);
+  typeParameters(reflect(new F<num>()).type, ['R']);
+  typeParameters(reflect(new G()).type, []);
+
+  var numMirror = reflectClass(num);
+  typeArguments(reflect(new A<num>()).type, [numMirror]);
+  typeArguments(reflect(new B()).type, []);
+  typeArguments(reflect(new C()).type, []);
+  typeArguments(reflect(new D()).type, []);
+  typeArguments(reflect(new E<num>()).type, [numMirror]);
+  typeArguments(reflect(new F<num>()).type, [numMirror]);
+  typeArguments(reflect(new G()).type, []);
+
+  Expect.isFalse(reflect(new A<num>()).type.isOriginalDeclaration);
+  Expect.isTrue(reflect(new B()).type.isOriginalDeclaration);
+  Expect.isTrue(reflect(new C()).type.isOriginalDeclaration);
+  Expect.isTrue(reflect(new D()).type.isOriginalDeclaration);
+  Expect.isFalse(reflect(new E<num>()).type.isOriginalDeclaration);
+  Expect.isFalse(reflect(new F<num>()).type.isOriginalDeclaration);
+  Expect.isTrue(reflect(new G()).type.isOriginalDeclaration);
+
+  Expect.equals(reflectClass(A),
+                reflect(new A<num>()).type.originalDeclaration);
+  Expect.equals(reflectClass(B),
+                reflect(new B()).type.originalDeclaration);
+  Expect.equals(reflectClass(C),
+                reflect(new C()).type.originalDeclaration);
+  Expect.equals(reflectClass(D),
+                reflect(new D()).type.originalDeclaration);
+  Expect.equals(reflectClass(E),
+                reflect(new E<num>()).type.originalDeclaration);
+  Expect.equals(reflectClass(F),
+                reflect(new F<num>()).type.originalDeclaration);
+  Expect.equals(reflectClass(G),
+                reflect(new G()).type.originalDeclaration);
+
+  Expect.notEquals(reflect(new A<num>()).type,
+                   reflect(new A<num>()).type.originalDeclaration);
+  Expect.equals(reflect(new B()).type,
+                reflect(new B()).type.originalDeclaration);
+  Expect.equals(reflect(new C()).type,
+                reflect(new C()).type.originalDeclaration);
+  Expect.equals(reflect(new D()).type,
+                reflect(new D()).type.originalDeclaration);
+  Expect.notEquals(reflect(new E<num>()).type,
+                   reflect(new E<num>()).type.originalDeclaration);
+  Expect.notEquals(reflect(new F<num>()).type,
+                   reflect(new F<num>()).type.originalDeclaration);
+  Expect.equals(reflect(new G()).type,
+                reflect(new G()).type.originalDeclaration);
+
+  // Library members are all uninstantaited generics or non-generics.
+  currentMirrorSystem().libraries.values.forEach((libraryMirror) {
+    libraryMirror.classes.values.forEach((classMirror) {
+      // TODO(12282): Deal with generic typedefs.
+      if (classMirror is! TypedefMirror) {
+        Expect.isTrue(classMirror.isOriginalDeclaration);
+        Expect.equals(classMirror, classMirror.originalDeclaration);
+      }
+    });
+  });
+}
diff --git a/tests/lib/mirrors/invoke_test.dart b/tests/lib/mirrors/invoke_test.dart
new file mode 100644
index 0000000..e306ca2
--- /dev/null
+++ b/tests/lib/mirrors/invoke_test.dart
@@ -0,0 +1,355 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.invoke_test;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+import '../../async_helper.dart';
+
+class C {
+  var field;
+  C() : this.field = 'default';
+  C.named(this.field);
+
+  get getter => 'get $field';
+  set setter(v) => field = 'set $v';
+  method(x, y, z) => '$x+$y+$z';
+  toString() => 'a C';
+  
+  noSuchMethod(invocation) => 'DNU';
+
+  static var staticField = 'initial';
+  static get staticGetter => 'sget $staticField';
+  static set staticSetter(v) => staticField = 'sset $v';
+  static staticFunction(x, y) => "($x,$y)";
+}
+
+var libraryField = 'a priori';
+get libraryGetter => 'lget $libraryField';
+set librarySetter(v) => libraryField = 'lset $v';
+libraryFunction(x,y) => '$x$y';
+
+Future expectValueThen(Future future, Function onValue) {
+  asyncStart();
+  wrappedOnValue(resultIn) { 
+    var resultOut = onValue(resultIn);
+    asyncEnd();
+    return resultOut;
+  }
+  onError(e) {
+    Expect.fail("Value expected. ($e)");
+  }
+  return future.then(wrappedOnValue, onError: onError);
+}
+
+Future expectError(Future future, Function errorPredicate, String reason) {
+  asyncStart();
+  onValue(result) { 
+    Expect.fail("Error expected ($reason)");
+  }
+  onError(e) {
+    asyncEnd();
+    if (!errorPredicate(e)) {
+      Expect.fail("Unexpected error ($reason)");
+    }
+  }
+  return future.then(onValue, onError: onError);
+}
+
+bool isNoSuchMethodError(e) {
+  return e is NoSuchMethodError;
+}
+
+testSync() {
+  var result;
+
+  // InstanceMirror invoke
+  C c = new C();
+  InstanceMirror im = reflect(c);
+  result = im.invoke(const Symbol('method'), [2,4,8]);
+  Expect.equals('2+4+8', result.reflectee);
+  result = im.invoke(const Symbol('doesntExist'), [2,4,8]);
+  Expect.equals('DNU', result.reflectee);
+  result = im.invoke(const Symbol('method'), [2,4]);  // Wrong arity.
+  Expect.equals('DNU', result.reflectee);
+
+  // InstanceMirror invokeGetter
+  result = im.getField(const Symbol('getter'));
+  Expect.equals('get default', result.reflectee);
+  result = im.getField(const Symbol('field'));
+  Expect.equals('default', result.reflectee);
+  result = im.getField(const Symbol('doesntExist'));
+  Expect.equals('DNU', result.reflectee);
+
+  // InstanceMirror invokeSetter
+  result = im.setField(const Symbol('setter'), 'foo');
+  Expect.equals('foo', result.reflectee);
+  Expect.equals('set foo', c.field);
+  Expect.equals('set foo', im.getField(const Symbol('field')).reflectee);
+  result = im.setField(const Symbol('field'), 'bar');
+  Expect.equals('bar', result.reflectee);
+  Expect.equals('bar', c.field);
+  Expect.equals('bar', im.getField(const Symbol('field')).reflectee);
+  result = im.setField(const Symbol('doesntExist'), 'bar');
+  Expect.equals('bar', result.reflectee);
+
+  // ClassMirror invoke
+  ClassMirror cm = reflectClass(C);
+  result = cm.invoke(const Symbol('staticFunction'),[3,4]);
+  Expect.equals('(3,4)', result.reflectee);
+  Expect.throws(() => cm.invoke(const Symbol('doesntExist'),[3,4]),
+                isNoSuchMethodError,
+                'Not defined');
+  Expect.throws(() => cm.invoke(const Symbol('staticFunction'),[3]),
+                isNoSuchMethodError,
+                'Wrong arity');
+
+  // ClassMirror invokeGetter
+  result = cm.getField(const Symbol('staticGetter'));
+  Expect.equals('sget initial', result.reflectee);
+  result = cm.getField(const Symbol('staticField'));
+  Expect.equals('initial', result.reflectee);
+  Expect.throws(() => cm.getField(const Symbol('doesntExist')),
+                isNoSuchMethodError,
+                'Not defined');
+
+  // ClassMirror invokeSetter
+  result = cm.setField(const Symbol('staticSetter'), 'sfoo');
+  Expect.equals('sfoo', result.reflectee);
+  Expect.equals('sset sfoo', C.staticField);
+  Expect.equals('sset sfoo',
+                cm.getField(const Symbol('staticField')).reflectee);
+  result = cm.setField(const Symbol('staticField'), 'sbar');
+  Expect.equals('sbar', result.reflectee);
+  Expect.equals('sbar', C.staticField);
+  Expect.equals('sbar', cm.getField(const Symbol('staticField')).reflectee);
+  Expect.throws(() => cm.setField(const Symbol('doesntExist'), 'sbar'),
+                isNoSuchMethodError,
+                'Not defined');
+
+  // ClassMirror invokeConstructor
+  result = cm.newInstance(const Symbol(''), []);
+  Expect.isTrue(result.reflectee is C);
+  Expect.equals('default', result.reflectee.field);
+  result = cm.newInstance(const Symbol('named'), ['my value']);
+  Expect.isTrue(result.reflectee is C);
+  Expect.equals('my value', result.reflectee.field);
+  Expect.throws(() => cm.newInstance(const Symbol('doesntExist'), ['my value']),
+                isNoSuchMethodError,
+                'Not defined');
+  Expect.throws(() => cm.newInstance(const Symbol('named'), []),
+                isNoSuchMethodError,
+                'Wrong arity');
+
+  // LibraryMirror invoke
+  LibraryMirror lm = cm.owner;
+  result = lm.invoke(const Symbol('libraryFunction'),[':',')']);
+  Expect.equals(':)', result.reflectee);
+  Expect.throws(() => lm.invoke(const Symbol('doesntExist'), [':',')']),
+                isNoSuchMethodError,
+                'Not defined');
+  Expect.throws(() => lm.invoke(const Symbol('libraryFunction'), [':']),
+                isNoSuchMethodError,
+                'Wrong arity');
+
+  // LibraryMirror invokeGetter
+  result = lm.getField(const Symbol('libraryGetter'));
+  Expect.equals('lget a priori', result.reflectee);
+  result = lm.getField(const Symbol('libraryField'));
+  Expect.equals('a priori', result.reflectee);
+  Expect.throws(() => lm.getField(const Symbol('doesntExist')),
+                isNoSuchMethodError,
+                'Not defined');
+
+  // LibraryMirror invokeSetter
+  result = lm.setField(const Symbol('librarySetter'), 'lfoo');
+  Expect.equals('lfoo', result.reflectee);
+  Expect.equals('lset lfoo', libraryField);
+  Expect.equals('lset lfoo',
+                lm.getField(const Symbol('libraryField')).reflectee);
+  result = lm.setField(const Symbol('libraryField'), 'lbar');
+  Expect.equals('lbar', result.reflectee);
+  Expect.equals('lbar', libraryField);
+  Expect.equals('lbar', lm.getField(const Symbol('libraryField')).reflectee);
+  Expect.throws(() => lm.setField(const Symbol('doesntExist'), 'lbar'),
+                isNoSuchMethodError,
+                'Not defined');
+}
+
+testAsync() {
+  var future;
+
+  // InstanceMirror invoke
+  C c = new C();
+  InstanceMirror im = reflect(c);
+  future = im.invokeAsync(const Symbol('method'), [2,4,8]);
+  expectValueThen(future, (result) {
+    Expect.equals('2+4+8', result.reflectee);
+  });
+  future = im.invokeAsync(const Symbol('method'), [im,im,im]);
+  expectValueThen(future, (result) {
+    Expect.equals('a C+a C+a C', result.reflectee);
+  });
+  future = im.invokeAsync(const Symbol('doesntExist'), [2,4,8]);
+  expectValueThen(future, (result) {
+    Expect.equals('DNU', result.reflectee);
+  });
+  future = im.invokeAsync(const Symbol('method'), [2, 4]);  // Wrong arity.
+  expectValueThen(future, (result) {
+    Expect.equals('DNU', result.reflectee);
+  });
+
+  // InstanceMirror invokeGetter
+  future = im.getFieldAsync(const Symbol('getter'));
+  expectValueThen(future, (result) {
+    Expect.equals('get default', result.reflectee);
+  });
+  future = im.getFieldAsync(const Symbol('field'));
+  expectValueThen(future, (result) {
+    Expect.equals('default', result.reflectee);
+  });
+  future = im.getFieldAsync(const Symbol('doesntExist'));
+  expectValueThen(future, (result) {
+    Expect.equals('DNU', result.reflectee);
+  });
+
+  // InstanceMirror invokeSetter
+  future = im.setFieldAsync(const Symbol('setter'), 'foo');
+  expectValueThen(future, (result) {
+    Expect.equals('foo', result.reflectee);
+    Expect.equals('set foo', c.field);
+    return im.setFieldAsync(const Symbol('field'), 'bar');
+  }).then((result) {
+    Expect.equals('bar', result.reflectee);
+    Expect.equals('bar', c.field);
+    return im.setFieldAsync(const Symbol('field'), im);
+  }).then((result) {
+    Expect.equals(im.reflectee, result.reflectee);
+    Expect.equals(c, c.field);
+  });
+  future = im.setFieldAsync(const Symbol('doesntExist'), 'bar');
+  expectValueThen(future, (result) {
+      Expect.equals('bar', result.reflectee);
+  });
+
+
+  // ClassMirror invoke
+  ClassMirror cm = reflectClass(C);
+  future = cm.invokeAsync(const Symbol('staticFunction'),[3,4]);
+  expectValueThen(future, (result) {
+    Expect.equals('(3,4)', result.reflectee);
+  });
+  future = cm.invokeAsync(const Symbol('staticFunction'),[im,im]);
+  expectValueThen(future, (result) {
+    Expect.equals('(a C,a C)', result.reflectee);
+  });
+  future = cm.invokeAsync(const Symbol('doesntExist'),[im,im]);
+  expectError(future, isNoSuchMethodError, 'Not defined');
+  future = cm.invokeAsync(const Symbol('staticFunction'),[3]);
+  expectError(future, isNoSuchMethodError, 'Wrong arity');
+
+  // ClassMirror invokeGetter
+  C.staticField = 'initial';  // Reset from synchronous test.
+  future = cm.getFieldAsync(const Symbol('staticGetter'));
+  expectValueThen(future, (result) {
+    Expect.equals('sget initial', result.reflectee);
+  });
+  future = cm.getFieldAsync(const Symbol('staticField'));
+  expectValueThen(future, (result) {
+    Expect.equals('initial', result.reflectee);
+  });
+  future = cm.getFieldAsync(const Symbol('doesntExist'));
+  expectError(future, isNoSuchMethodError, 'Not defined');
+
+  // ClassMirror invokeSetter
+  future = cm.setFieldAsync(const Symbol('staticSetter'), 'sfoo');
+  expectValueThen(future, (result) {
+    Expect.equals('sfoo', result.reflectee);
+    Expect.equals('sset sfoo', C.staticField);
+    return cm.setFieldAsync(const Symbol('staticField'), 'sbar');
+  }).then((result) {
+    Expect.equals('sbar', result.reflectee);
+    Expect.equals('sbar', C.staticField);
+    return cm.setFieldAsync(const Symbol('staticField'), im);;
+  }).then((result) {
+    Expect.equals(im.reflectee, result.reflectee);
+    Expect.equals(c, C.staticField);
+  });
+  future = cm.setFieldAsync(const Symbol('doesntExist'), 'sbar');
+  expectError(future, isNoSuchMethodError, 'Not defined');
+
+  // ClassMirror invokeConstructor
+  future = cm.newInstanceAsync(const Symbol(''), []);
+  expectValueThen(future, (result) {
+    Expect.isTrue(result.reflectee is C);
+    Expect.equals('default', result.reflectee.field);
+  });
+  future = cm.newInstanceAsync(const Symbol('named'), ['my value']);
+  expectValueThen(future, (result) {
+    Expect.isTrue(result.reflectee is C);
+    Expect.equals('my value', result.reflectee.field);
+  });
+  future = cm.newInstanceAsync(const Symbol('named'), [im]);
+  expectValueThen(future, (result) {
+    Expect.isTrue(result.reflectee is C);
+    Expect.equals(c, result.reflectee.field);
+  });
+  future = cm.newInstanceAsync(const Symbol('doesntExist'), ['my value']);
+  expectError(future, isNoSuchMethodError, 'Not defined');
+  future = cm.newInstanceAsync(const Symbol('named'), []);
+  expectError(future, isNoSuchMethodError, 'Wrong arity');
+
+
+  // LibraryMirror invoke
+  LibraryMirror lm = cm.owner;
+  future = lm.invokeAsync(const Symbol('libraryFunction'),[':',')']);
+  expectValueThen(future, (result) {
+    Expect.equals(':)', result.reflectee);
+  });
+  future = lm.invokeAsync(const Symbol('libraryFunction'),[im,im]);
+  expectValueThen(future, (result) {
+    Expect.equals('a Ca C', result.reflectee);
+  });
+  future = lm.invokeAsync(const Symbol('doesntExist'),[im,im]);
+  expectError(future, isNoSuchMethodError, 'Not defined');
+  future = lm.invokeAsync(const Symbol('libraryFunction'),[':']);
+  expectError(future, isNoSuchMethodError, 'Wrong arity');
+
+  // LibraryMirror invokeGetter
+  libraryField = 'a priori'; // Reset from synchronous test.
+  future = lm.getFieldAsync(const Symbol('libraryGetter'));
+  expectValueThen(future, (result) {
+    Expect.equals('lget a priori', result.reflectee);
+  });
+  future = lm.getFieldAsync(const Symbol('libraryField'));
+  expectValueThen(future, (result) {
+    Expect.equals('a priori', result.reflectee);
+  });
+  future = lm.getFieldAsync(const Symbol('doesntExist'));
+  expectError(future, isNoSuchMethodError, 'Not defined');
+
+  // LibraryMirror invokeSetter
+  future = lm.setFieldAsync(const Symbol('librarySetter'), 'lfoo');
+  expectValueThen(future, (result) {
+    Expect.equals('lfoo', result.reflectee);
+    Expect.equals('lset lfoo', libraryField);
+    return lm.setFieldAsync(const Symbol('libraryField'), 'lbar');
+  }).then((result) {
+    Expect.equals('lbar', result.reflectee);
+    Expect.equals('lbar', libraryField);
+    return lm.setFieldAsync(const Symbol('libraryField'), im);
+  }).then((result) {
+    Expect.equals(im.reflectee, result.reflectee);
+    Expect.equals(c, libraryField);
+  });
+  future = lm.setFieldAsync(const Symbol('doesntExist'), 'lbar');
+  expectError(future, isNoSuchMethodError, 'Not defined');
+}
+
+main() {
+  testSync();
+  testAsync();
+}
diff --git a/tests/lib/mirrors/library_metadata_test.dart b/tests/lib/mirrors/library_metadata_test.dart
index 259e398..5bb0cec 100644
--- a/tests/lib/mirrors/library_metadata_test.dart
+++ b/tests/lib/mirrors/library_metadata_test.dart
@@ -13,4 +13,6 @@
   MirrorSystem mirrors = currentMirrorSystem();
   checkMetadata(mirrors.findLibrary(const Symbol('test.library_metadata_test')).first,
                 [string, symbol]);
+  checkMetadata(mirrors.findLibrary(const Symbol('test.metadata_test')).first,
+                []);
 }
diff --git a/tests/lib/mirrors/metadata_test.dart b/tests/lib/mirrors/metadata_test.dart
index 6db3e55..164a5ae 100644
--- a/tests/lib/mirrors/metadata_test.dart
+++ b/tests/lib/mirrors/metadata_test.dart
@@ -20,6 +20,7 @@
 
   @string @symbol @string
   myMethod() => 1;
+  myOtherMethod() => 2;
 }
 
 checkMetadata(DeclarationMirror mirror, List expectedMetadata) {
@@ -57,6 +58,8 @@
   checkMetadata(function, [symbol, string, symbol]);
   MethodMirror method = myClassMirror.methods[const Symbol('myMethod')];
   checkMetadata(method, [string, symbol, string]);
+  method = myClassMirror.methods[const Symbol('myOtherMethod')];
+  checkMetadata(method, []);
 
   VariableMirror xMirror = myClassMirror.variables[const Symbol('x')];
   checkMetadata(xMirror, [hest, hest, symbol]);
diff --git a/tests/lib/mirrors/mixin_members_test.dart b/tests/lib/mirrors/mixin_members_test.dart
new file mode 100644
index 0000000..4b82534
--- /dev/null
+++ b/tests/lib/mirrors/mixin_members_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:mirrors";
+
+import "package:expect/expect.dart";
+
+class Fooer {
+  foo1();
+}
+
+class S implements Fooer {
+  foo1() {}
+  foo2() {}
+}
+
+class M1 {
+  bar1() {}
+  bar2() {}
+}
+
+class M2 {
+  baz1() {}
+  baz2() {}
+}
+
+class C extends S with M1, M2 {}
+
+main() {
+  ClassMirror cm = reflectClass(C);
+  Classmirror sM1M2 = cm.superclass;
+  Classmirror sM1 = sM1M2.superclass;
+  ClassMirror s = sM1.superclass;
+  Expect.equals(0, cm.members.length);
+  Expect.setEquals(sM1M2.members.keys,
+                   [const Symbol("baz1"), const Symbol("baz2")]);
+  Expect.setEquals(sM1M2.superinterfaces.map((e) => e.simpleName),
+                   [const Symbol("M2")]);
+  Expect.setEquals(sM1.members.keys,
+                   [const Symbol("bar1"), const Symbol("bar2")]);
+  Expect.setEquals(sM1.superinterfaces.map((e) => e.simpleName),
+                   [const Symbol("M1")]);
+  Expect.setEquals(s.members.keys.toSet(),
+                   [const Symbol("foo1"), const Symbol("foo2")]);
+  Expect.setEquals(s.superinterfaces.map((e) => e.simpleName),
+                   [const Symbol("Fooer")]);
+  Expect.equals(true, reflectClass(S) == s);
+}
diff --git a/tests/standalone/assert_test.dart b/tests/standalone/assert_test.dart
index af63a68..add14e3 100644
--- a/tests/standalone/assert_test.dart
+++ b/tests/standalone/assert_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=--enable_asserts
+
 // Dart test program testing assert statements.
+
 import "package:expect/expect.dart";
 
 class AssertTest {
@@ -11,15 +13,9 @@
       assert(false);
       Expect.fail("Assertion 'false' didn't fail.");
     } on AssertionError catch (error) {
-      Expect.equals("false", error.failedAssertion);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("assert_test.dart", subs);
-      Expect.equals(11, error.line);
-      Expect.equals(14, error.column);
+      Expect.isTrue(error.toString().contains("'false'"));
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "assert_test.dart:13:14"));
     }
   }
   static testClosure() {
@@ -27,15 +23,9 @@
       assert(() => false);
       Expect.fail("Assertion '() => false' didn't fail.");
     } on AssertionError catch (error) {
-      Expect.equals("() => false", error.failedAssertion);
-      int pos = error.url.lastIndexOf("/", error.url.length);
-      if (pos == -1) {
-        pos = error.url.lastIndexOf("\\", error.url.length);
-      }
-      String subs = error.url.substring(pos + 1, error.url.length);
-      Expect.equals("assert_test.dart", subs);
-      Expect.equals(27, error.line);
-      Expect.equals(14, error.column);
+      Expect.isTrue(error.toString().contains("'() => false'"));
+      Expect.isTrue(error.stackTrace.toString().contains(
+          "assert_test.dart:23:14"));
     }
   }
 
diff --git a/tests/standalone/io/dependency_graph_test.dart b/tests/standalone/io/dependency_graph_test.dart
new file mode 100644
index 0000000..495b9ea
--- /dev/null
+++ b/tests/standalone/io/dependency_graph_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.
+
+import 'package:expect/expect.dart';
+
+import '../../../tools/testing/dart/dependency_graph.dart' as graph;
+
+main() {
+  var dgraph = new graph.Graph();
+  var numberOfEvents = 0;
+  var eventAssertions = [];
+
+  graph.Node newNode(int i, List deps) {
+    graph.Node node = dgraph.newNode(i, deps);
+    Expect.isTrue(node.userData == i);
+    Expect.isTrue(dgraph.nodes.contains(node));
+    for (var dep in deps) {
+      Expect.isTrue(node.dependencies.contains(dep));
+      Expect.isTrue(dep.neededFor.contains(node));
+    }
+
+    numberOfEvents++;
+    eventAssertions.add((event) {
+      Expect.isTrue(event is graph.NodeAddedEvent);
+      Expect.isTrue(event.node == node);
+    });
+
+    return node;
+  }
+
+  changeState(graph.Node node, graph.NodeState newState) {
+    var oldState = node.state;
+
+    dgraph.changeState(node, newState);
+    Expect.isTrue(node.state == newState);
+
+    numberOfEvents++;
+    eventAssertions.add((event) {
+      Expect.isTrue(event is graph.StateChangedEvent);
+      Expect.isTrue(event.node == node);
+      Expect.isTrue(event.from == oldState);
+      Expect.isTrue(event.to == newState);
+    });
+  }
+
+  var node1, node2, node3;
+
+  node1 = newNode(1, []);
+  changeState(node1, graph.NodeState.Processing);
+  node2 = newNode(2, [node1]);
+  changeState(node1, graph.NodeState.Successful);
+  node3 = newNode(3, [node1, node2]);
+  changeState(node2, graph.NodeState.Failed);
+  changeState(node3, graph.NodeState.UnableToRun);
+
+  dgraph.events.take(numberOfEvents).toList().then((events) {
+    for (var i=0; i<events.length; i++) {
+      eventAssertions[i](events[i]);
+    }
+  });
+}
diff --git a/tests/standalone/io/file_constructor_test.dart b/tests/standalone/io/file_constructor_test.dart
index 4ed7bb7..251e1ad 100644
--- a/tests/standalone/io/file_constructor_test.dart
+++ b/tests/standalone/io/file_constructor_test.dart
@@ -20,8 +20,8 @@
     new File(1);
     Expect.fail('Error expected.');
   } on ArgumentError catch(e) {
-    if (developerMode) throw;
+    if (developerMode) rethrow;
   } on TypeError catch(e) {
-    if (!developerMode) throw;
+    if (!developerMode) rethrow;
   }
 }
diff --git a/tests/standalone/io/platform_test.dart b/tests/standalone/io/platform_test.dart
index ce6e977..1677e67a 100644
--- a/tests/standalone/io/platform_test.dart
+++ b/tests/standalone/io/platform_test.dart
@@ -3,9 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
+import "dart:async";
 import "dart:io";
+import "dart:isolate";
 
-main() {
+test() {
   Expect.isTrue(Platform.numberOfProcessors > 0);
   var os = Platform.operatingSystem;
   Expect.isTrue(os == "android" || os == "linux" || os == "macos" ||
@@ -24,3 +26,47 @@
   Expect.isTrue(Platform.script.replaceAll('\\', '/').
                 endsWith('tests/standalone/io/platform_test.dart'));
 }
+
+void f() {
+  port.receive((msg, reply) {
+    if (msg == "Platform.executable") {
+      reply.send(Platform.executable);
+    }
+    if (msg == "Platform.script") {
+      reply.send(Platform.script);
+    }
+    if (msg == "new Options().executable") {
+      reply.send(new Options().executable);
+    }
+    if (msg == "new Options().script") {
+      reply.send(new Options().script);
+    }
+    if (msg == "close") {
+      reply.send("closed");
+      port.close();
+    }
+  });
+}
+
+testIsolate() {
+  var port = new ReceivePort();
+  var sendPort = spawnFunction(f);
+  Future.wait([sendPort.call("Platform.executable"),
+               sendPort.call("Platform.script"),
+               sendPort.call("new Options().executable"),
+               sendPort.call("new Options().script")])
+  .then((results) {
+    Expect.equals(Platform.executable, results[0]);
+    Expect.equals(Platform.executable, results[2]);
+    Uri uri = Uri.parse(results[1]);
+    Expect.equals(uri, Uri.parse(results[3]));
+    Expect.equals("file", uri.scheme);
+    Expect.isTrue(uri.path.endsWith('tests/standalone/io/platform_test.dart'));
+    sendPort.call("close").then((_) => port.close());
+  });
+}
+
+main() {
+  test();
+  testIsolate();
+}
diff --git a/tests/standalone/io/skipping_dart2js_compilations_test.dart b/tests/standalone/io/skipping_dart2js_compilations_test.dart
index 063caed..d2be72e 100644
--- a/tests/standalone/io/skipping_dart2js_compilations_test.dart
+++ b/tests/standalone/io/skipping_dart2js_compilations_test.dart
@@ -122,17 +122,15 @@
   }
 }
 
-class TestCompletedHandler {
+class CommandCompletedHandler {
   FileUtils fileUtils;
   DateTime _expectedTimestamp;
   bool _shouldHaveRun;
 
-  TestCompletedHandler(FileUtils this.fileUtils, bool this._shouldHaveRun);
+  CommandCompletedHandler(FileUtils this.fileUtils, bool this._shouldHaveRun);
 
-  void processCompletedTest(runner.TestCase testCase) {
-    var output = testCase.lastCommandOutput;
-
-    Expect.isFalse(output.unexpectedOutput);
+  void processCompletedTest(CommandOutput output) {
+    Expect.isTrue(output.exitCode == 0);
     Expect.isTrue(output.stderr.length == 0);
     if (_shouldHaveRun) {
       Expect.isTrue(output.stdout.length == 0);
@@ -145,7 +143,7 @@
   }
 }
 
-runner.TestCase makeTestCase(String testName, FileUtils fileUtils) {
+runner.Command makeCompilationCommand(String testName, FileUtils fileUtils) {
   var config = new options.TestOptionsParser().parse(['--timeout', '2'])[0];
   var createFileScript = join(dirname(Platform.script),
       'skipping_dart2js_compilations_helper.dart');
@@ -153,19 +151,14 @@
   var arguments = [createFileScript, fileUtils.scriptOutputPath.toNativePath()];
   var bootstrapDeps = [
       Uri.parse("file://${fileUtils.testSnapshotFilePath}")];
-  var commands = [new runner.CompilationCommand(
+  return runner.CommandBuilder.instance.getCompilationCommand(
       'dart2js',
       fileUtils.testJsFilePath.toNativePath(),
       false,
       bootstrapDeps,
       executable,
-      arguments)];
-  return new runner.TestCase(
-      testName,
-      commands,
-      config,
-      (_) {},
-      new Set<String>.from([status.PASS]));
+      arguments,
+      'ReleaseIA32');
 }
 
 void main() {
@@ -213,11 +206,11 @@
     fs_upToDate.touchFile(fs_upToDate.testJs);
 
     Future runTest(String name, FileUtils fileUtils, bool shouldRun) {
-      var completedHandler = new TestCompletedHandler(fileUtils, shouldRun);
-      var testCase = makeTestCase(name, fileUtils);
-      var process = new runner.RunningProcess(testCase, testCase.commands[0]);
-      return process.start().then((_) {
-        completedHandler.processCompletedTest(testCase);
+      var completedHandler = new CommandCompletedHandler(fileUtils, shouldRun);
+      var command = makeCompilationCommand(name, fileUtils);
+      var process = new runner.RunningProcess(command, 60);
+      return process.run().then((CommandOutput output) {
+        completedHandler.processCompletedTest(output);
       });
     }
     // We run the tests in sequence, so that if one of them failes we clean up
diff --git a/tests/standalone/io/test_runner_test.dart b/tests/standalone/io/test_runner_test.dart
index d07558a..1bb41df 100644
--- a/tests/standalone/io/test_runner_test.dart
+++ b/tests/standalone/io/test_runner_test.dart
@@ -8,6 +8,7 @@
 import "dart:utf";
 import "../../../tools/testing/dart/test_runner.dart";
 import "../../../tools/testing/dart/test_suite.dart";
+import "../../../tools/testing/dart/test_progress.dart" as progress;
 import "../../../tools/testing/dart/status_file_parser.dart";
 import "../../../tools/testing/dart/test_options.dart";
 import "process_test_util.dart";
@@ -22,13 +23,12 @@
   // Used as TestCase.completedCallback.
   static processCompletedTest(TestCase testCase) {
     numCompletedTests++;
-    CommandOutput output = testCase.lastCommandOutput;
     if (testCase.displayName == "fail-unexpected") {
-      if (!output.unexpectedOutput) {
+      if (!testCase.unexpectedOutput) {
         throw "Expected fail-unexpected";
       }
     } else {
-      if (output.unexpectedOutput) {
+      if (testCase.unexpectedOutput) {
         throw "Unexpected fail";
       }
     }
@@ -71,16 +71,16 @@
   }
 
   TestCase _makeNormalTestCase(name, expectations) {
-    var command = new Command('custom',
-                              Platform.executable,
-                              [Platform.script, name]);
+    var command = CommandBuilder.instance.getCommand(
+        'custom', Platform.executable, [Platform.script, name],
+        'ReleaseIA32');
     return _makeTestCase(name, DEFAULT_TIMEOUT, command, expectations);
   }
 
   _makeCrashTestCase(name, expectations) {
-    var crashCommand = new Command('custom_crash',
-                                   getProcessTestFileName(),
-                                   ["0", "0", "1", "1"]);
+    var crashCommand = CommandBuilder.instance.getCommand(
+        'custom_crash', getProcessTestFileName(), ["0", "0", "1", "1"],
+        'ReleaseIA32');
     // The crash test sometimes times out. Run it with a large timeout
     // to help diagnose the delay.
     // The test loads a new executable, which may sometimes take a long time.
@@ -95,7 +95,6 @@
     return new TestCase(name,
                         [command],
                         configuration,
-                        TestController.processCompletedTest,
                         new Set<String>.from(expectations));
   }
 }
@@ -103,8 +102,15 @@
 void testProcessQueue() {
   var maxProcesses = 2;
   var maxBrowserProcesses = maxProcesses;
-  new ProcessQueue(maxProcesses, maxBrowserProcesses,
-      new DateTime.now(), [new CustomTestSuite()], [], TestController.finished);
+  new ProcessQueue({'noBatch' : true}, maxProcesses, maxBrowserProcesses,
+      new DateTime.now(), [new CustomTestSuite()],
+      [new EventListener()], TestController.finished);
+}
+
+class EventListener extends progress.EventListener{
+  void done(TestCase test) {
+    TestController.processCompletedTest(test);
+  }
 }
 
 void main() {
diff --git a/tests/standalone/io/uri_platform_test.dart b/tests/standalone/io/uri_platform_test.dart
new file mode 100644
index 0000000..599f2a8
--- /dev/null
+++ b/tests/standalone/io/uri_platform_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import "dart:io";
+
+main() {
+  if (Platform.isWindows) {
+    Expect.equals("a\\b", Uri.parse("a/b").toFilePath());
+    Expect.equals("a\\b\\", Uri.parse("a/b/").toFilePath());
+    Expect.equals("a b", Uri.parse("a%20b").toFilePath());
+    Expect.equals("\\a b", Uri.parse("file:///a%20b").toFilePath());
+    Expect.equals("\\a\\b", Uri.parse("file:///a/b").toFilePath());
+    Expect.equals("C:\\", Uri.parse("file:///C:").toFilePath());
+    Expect.equals("C:\\", Uri.parse("file:///C:/").toFilePath());
+    Expect.equals("\\\\host\\a\\b", Uri.parse("file://host/a/b").toFilePath());
+
+    Expect.equals("a\\b", new Uri.file("a/b").toFilePath());
+    Expect.equals("a\\b", new Uri.file("a\\b").toFilePath());
+    Expect.equals("\\a\\b", new Uri.file("/a/b").toFilePath());
+    Expect.equals("\\a\\b", new Uri.file("\\a\\b").toFilePath());
+    Expect.equals("\\a\\b", new Uri.file("\\a/b").toFilePath());
+    Expect.equals("\\a\\b", new Uri.file("/a\\b").toFilePath());
+  } else {
+    Expect.equals("a/b", Uri.parse("a/b").toFilePath());
+    Expect.equals("a/b/", Uri.parse("a/b/").toFilePath());
+    Expect.equals("a b", Uri.parse("a%20b").toFilePath());
+    Expect.equals("/a b", Uri.parse("file:///a%20b").toFilePath());
+    Expect.equals("/a/b", Uri.parse("file:///a/b").toFilePath());
+    Expect.equals("/C:", Uri.parse("file:///C:").toFilePath());
+    Expect.equals("/C:/", Uri.parse("file:///C:/").toFilePath());
+    Expect.throws(() => Uri.parse("file://host/a/b").toFilePath(),
+                  (e) => e is UnsupportedError);
+
+    Expect.equals("a/b", new Uri.file("a/b").toFilePath());
+    Expect.equals("a\\b", new Uri.file("a\\b").toFilePath());
+  }
+}
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index abac10e..d16ecc4 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -11,6 +11,16 @@
 
 [ $runtime == vm ]
 package/package_isolate_test: Fail # http://dartbug.com/7520.
+vmservice/isolate_echo_test: Pass, Fail # Issue: 12294
+vmservice/isolate_list_test: Pass, Fail # Issue: 12294
+vmservice/isolate_stacktrace_command_test: Pass, Fail # Issue: 12294
+vmservice/unknown_isolate_command_test: Pass, Fail # Issue: 12294
+
+[ $runtime == vm && $system == windows ]
+vmservice/isolate_class_test: Pass, Fail # Issue: 12294
+vmservice/isolate_code_test: Pass, Fail # Issue: 12294
+vmservice/isolate_function_test: Pass, Fail # Issue: 12294
+vmservice/isolate_library_test: Pass, Fail # Issue: 12294
 
 [ $runtime == vm && $checked ]
 # These tests have type errors on purpose.
@@ -152,6 +162,9 @@
 oom_error_stacktrace_test: Skip # Fails on Linux
 io/web_socket_ping_test: Skip # TODO(ajohnsen): Timeout issue
 
+[ $arch == simarm ]
+io/test_runner_test: Pass, Fail # Issue: 12239
+
 [ $arch == mips ]
 *: Skip
 
diff --git a/tests/standalone/vmservice/isolate_bad_class_test.dart b/tests/standalone/vmservice/isolate_bad_class_test.dart
new file mode 100644
index 0000000..4d84afa
--- /dev/null
+++ b/tests/standalone/vmservice/isolate_bad_class_test.dart
@@ -0,0 +1,58 @@
+// 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 isolate_bad_class_test;
+
+import 'dart:async';
+import 'test_helper.dart';
+import 'package:expect/expect.dart';
+
+class NullCollectionTest extends VmServiceRequestHelper {
+  NullCollectionTest(port, id, collection) :
+      super('http://127.0.0.1:$port/isolates/$id/$collection/9999999');
+
+  onRequestCompleted(Map reply) {
+    Expect.equals('null', reply['type']);
+  }
+}
+
+class BadCollectionTest extends VmServiceRequestHelper {
+  BadCollectionTest(port, id, collection) :
+      super('http://127.0.0.1:$port/isolates/$id/$collection');
+
+  onRequestCompleted(Map reply) {
+    Expect.equals('error', reply['type']);
+  }
+}
+
+class IsolateListTest extends VmServiceRequestHelper {
+  IsolateListTest(port) : super('http://127.0.0.1:$port/isolates');
+
+  int _isolateId;
+  onRequestCompleted(Map reply) {
+    IsolateListTester tester = new IsolateListTester(reply);
+    tester.checkIsolateCount(1);
+    tester.checkIsolateNameContains('unknown_isolate_command_script.dart');
+    _isolateId = reply['members'][0]['id'];
+  }
+}
+
+main() {
+  var process = new TestLauncher('unknown_isolate_command_script.dart');
+  process.launch().then((port) {
+    var test = new IsolateListTest(port);
+    test.makeRequest().then((_) {
+      var badCollectionRequest =
+          new BadCollectionTest(port, test._isolateId,
+                                'classes').makeRequest();
+      var nullCollectionRequest =
+          new NullCollectionTest(port, test._isolateId,
+                                 'classes').makeRequest();
+      var requests = Future.wait([badCollectionRequest, nullCollectionRequest]);
+      requests.then((_) {
+        process.requestExit();
+      });
+    });
+  });
+}
diff --git a/tests/standalone/vmservice/isolate_bad_code_test.dart b/tests/standalone/vmservice/isolate_bad_code_test.dart
new file mode 100644
index 0000000..fc6ef68
--- /dev/null
+++ b/tests/standalone/vmservice/isolate_bad_code_test.dart
@@ -0,0 +1,58 @@
+// 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 isolate_bad_code_test;
+
+import 'dart:async';
+import 'test_helper.dart';
+import 'package:expect/expect.dart';
+
+class NullCollectionTest extends VmServiceRequestHelper {
+  NullCollectionTest(port, id, collection) :
+      super('http://127.0.0.1:$port/isolates/$id/$collection/50');
+
+  onRequestCompleted(Map reply) {
+    Expect.equals('null', reply['type']);
+  }
+}
+
+class BadCollectionTest extends VmServiceRequestHelper {
+  BadCollectionTest(port, id, collection) :
+      super('http://127.0.0.1:$port/isolates/$id/$collection');
+
+  onRequestCompleted(Map reply) {
+    Expect.equals('error', reply['type']);
+  }
+}
+
+class IsolateListTest extends VmServiceRequestHelper {
+  IsolateListTest(port) : super('http://127.0.0.1:$port/isolates');
+
+  int _isolateId;
+  onRequestCompleted(Map reply) {
+    IsolateListTester tester = new IsolateListTester(reply);
+    tester.checkIsolateCount(1);
+    tester.checkIsolateNameContains('unknown_isolate_command_script.dart');
+    _isolateId = reply['members'][0]['id'];
+  }
+}
+
+main() {
+  var process = new TestLauncher('unknown_isolate_command_script.dart');
+  process.launch().then((port) {
+    var test = new IsolateListTest(port);
+    test.makeRequest().then((_) {
+      var badCollectionRequest =
+          new BadCollectionTest(port, test._isolateId,
+                                'codes').makeRequest();
+      var nullCollectionRequest =
+          new NullCollectionTest(port, test._isolateId,
+                                 'codes').makeRequest();
+      var requests = Future.wait([badCollectionRequest, nullCollectionRequest]);
+      requests.then((_) {
+        process.requestExit();
+      });
+    });
+  });
+}
diff --git a/tests/standalone/vmservice/isolate_bad_function_test.dart b/tests/standalone/vmservice/isolate_bad_function_test.dart
new file mode 100644
index 0000000..3b6c414
--- /dev/null
+++ b/tests/standalone/vmservice/isolate_bad_function_test.dart
@@ -0,0 +1,58 @@
+// 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 isolate_bad_function_test;
+
+import 'dart:async';
+import 'test_helper.dart';
+import 'package:expect/expect.dart';
+
+class NullCollectionTest extends VmServiceRequestHelper {
+  NullCollectionTest(port, id, collection) :
+      super('http://127.0.0.1:$port/isolates/$id/$collection/-99');
+
+  onRequestCompleted(Map reply) {
+    Expect.equals('null', reply['type']);
+  }
+}
+
+class BadCollectionTest extends VmServiceRequestHelper {
+  BadCollectionTest(port, id, collection) :
+      super('http://127.0.0.1:$port/isolates/$id/$collection');
+
+  onRequestCompleted(Map reply) {
+    Expect.equals('error', reply['type']);
+  }
+}
+
+class IsolateListTest extends VmServiceRequestHelper {
+  IsolateListTest(port) : super('http://127.0.0.1:$port/isolates');
+
+  int _isolateId;
+  onRequestCompleted(Map reply) {
+    IsolateListTester tester = new IsolateListTester(reply);
+    tester.checkIsolateCount(1);
+    tester.checkIsolateNameContains('unknown_isolate_command_script.dart');
+    _isolateId = reply['members'][0]['id'];
+  }
+}
+
+main() {
+  var process = new TestLauncher('unknown_isolate_command_script.dart');
+  process.launch().then((port) {
+    var test = new IsolateListTest(port);
+    test.makeRequest().then((_) {
+      var badCollectionRequest =
+          new BadCollectionTest(port, test._isolateId,
+                                'functions').makeRequest();
+      var nullCollectionRequest =
+          new NullCollectionTest(port, test._isolateId,
+                                 'functions').makeRequest();
+      var requests = Future.wait([badCollectionRequest, nullCollectionRequest]);
+      requests.then((_) {
+        process.requestExit();
+      });
+    });
+  });
+}
diff --git a/tests/standalone/vmservice/isolate_bad_library_test.dart b/tests/standalone/vmservice/isolate_bad_library_test.dart
new file mode 100644
index 0000000..c7d2c54
--- /dev/null
+++ b/tests/standalone/vmservice/isolate_bad_library_test.dart
@@ -0,0 +1,55 @@
+// 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 isolate_bad_library_test;
+
+import 'dart:async';
+import 'test_helper.dart';
+import 'package:expect/expect.dart';
+
+class NullCollectionTest extends VmServiceRequestHelper {
+  NullCollectionTest(port, id, collection) :
+      super('http://127.0.0.1:$port/isolates/$id/$collection/-100');
+
+  onRequestCompleted(Map reply) {
+    Expect.equals('null', reply['type']);
+  }
+}
+
+class BadCollectionTest extends VmServiceRequestHelper {
+  BadCollectionTest(port, id, collection) :
+      super('http://127.0.0.1:$port/isolates/$id/$collection');
+
+  onRequestCompleted(Map reply) {
+    Expect.equals('error', reply['type']);
+  }
+}
+
+class IsolateListTest extends VmServiceRequestHelper {
+  IsolateListTest(port) : super('http://127.0.0.1:$port/isolates');
+
+  int _isolateId;
+  onRequestCompleted(Map reply) {
+    IsolateListTester tester = new IsolateListTester(reply);
+    tester.checkIsolateCount(1);
+    tester.checkIsolateNameContains('unknown_isolate_command_script.dart');
+    _isolateId = reply['members'][0]['id'];
+  }
+}
+
+main() {
+  var process = new TestLauncher('unknown_isolate_command_script.dart');
+  process.launch().then((port) {
+    var test = new IsolateListTest(port);
+    test.makeRequest().then((_) {
+      var nullCollectionRequest =
+          new NullCollectionTest(port, test._isolateId,
+                                 'libraries').makeRequest();
+      var requests = Future.wait([nullCollectionRequest]);
+      requests.then((_) {
+        process.requestExit();
+      });
+    });
+  });
+}
diff --git a/tests/standalone/vmservice/isolate_class_test.dart b/tests/standalone/vmservice/isolate_class_test.dart
new file mode 100644
index 0000000..3f9064e
--- /dev/null
+++ b/tests/standalone/vmservice/isolate_class_test.dart
@@ -0,0 +1,82 @@
+// 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 isolate_class_test;
+
+import 'dart:async';
+import 'test_helper.dart';
+import 'package:expect/expect.dart';
+
+class ClassTest extends VmServiceRequestHelper {
+  ClassTest(port, id, classId) :
+      super('http://127.0.0.1:$port/isolates/$id/classes/$classId');
+
+  onRequestCompleted(Map reply) {
+    Expect.equals('Class', reply['type']);
+    Expect.equals('C', reply['name']);
+    Expect.equals('isolate_stacktrace_command_script',
+                  reply['library']['name']);
+  }
+}
+
+class LibraryTest extends VmServiceRequestHelper {
+  LibraryTest(port, id, libId) :
+      super('http://127.0.0.1:$port/isolates/$id/libraries/$libId');
+
+  int _classId;
+  onRequestCompleted(Map reply) {
+    Expect.equals('Library', reply['type']);
+    Expect.equals('isolate_stacktrace_command_script', reply['name']);
+    Expect.equals(1, reply['classes'].length);
+    Expect.equals('@Class', reply['classes'][0]['type']);
+    Expect.equals('C', reply['classes'][0]['name']);
+    _classId = reply['classes'][0]['id'];
+  }
+}
+
+class RootLibraryTest extends VmServiceRequestHelper {
+  RootLibraryTest(port, id) :
+      super('http://127.0.0.1:$port/isolates/$id/libraries');
+
+  int _libId;
+  onRequestCompleted(Map reply) {
+    Expect.equals('@Library', reply['type']);
+    Expect.equals('isolate_stacktrace_command_script', reply['name']);
+    _libId = reply['id'];
+  }
+}
+
+class IsolateListTest extends VmServiceRequestHelper {
+  IsolateListTest(port) : super('http://127.0.0.1:$port/isolates');
+
+  int _isolateId;
+  onRequestCompleted(Map reply) {
+    IsolateListTester tester = new IsolateListTester(reply);
+    tester.checkIsolateCount(2);
+    tester.checkIsolateNameContains('isolate_stacktrace_command_script.dart');
+    _isolateId = tester.checkIsolateNameContains('myIsolateName');
+  }
+}
+
+main() {
+  var process = new TestLauncher('isolate_stacktrace_command_script.dart');
+  process.launch().then((port) {
+    var test = new IsolateListTest(port);
+    test.makeRequest().then((_) {
+      var rootLibraryTest =
+          new RootLibraryTest(port, test._isolateId);
+      rootLibraryTest.makeRequest().then((_) {
+        var libraryTest = new LibraryTest(port, test._isolateId,
+                                          rootLibraryTest._libId);
+        libraryTest.makeRequest().then((_) {
+          var classTest = new ClassTest(port, test._isolateId,
+                                        libraryTest._classId);
+          classTest.makeRequest().then((_) {
+            process.requestExit();
+          });
+        });
+      });
+    });
+  });
+}
diff --git a/tests/standalone/vmservice/isolate_code_test.dart b/tests/standalone/vmservice/isolate_code_test.dart
new file mode 100644
index 0000000..8ce58dd
--- /dev/null
+++ b/tests/standalone/vmservice/isolate_code_test.dart
@@ -0,0 +1,81 @@
+// 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 isolate_class_test;
+
+import 'dart:async';
+import 'test_helper.dart';
+import 'package:expect/expect.dart';
+
+class CodeATest extends VmServiceRequestHelper {
+  CodeATest(port, id, codeId) :
+      super('http://127.0.0.1:$port/isolates/$id/codes/$codeId');
+
+  onRequestCompleted(Map reply) {
+    Expect.equals('Code', reply['type']);
+    Expect.equals('a', reply['function']['name']);
+    Expect.isTrue(reply['disassembly'].length > 0);
+  }
+}
+
+class CodeCTest extends VmServiceRequestHelper {
+  CodeCTest(port, id, codeId) :
+      super('http://127.0.0.1:$port/isolates/$id/codes/$codeId');
+
+  onRequestCompleted(Map reply) {
+    Expect.equals('Code', reply['type']);
+    Expect.equals('C.c', reply['function']['name']);
+    Expect.isTrue(reply['disassembly'].length > 0);
+  }
+}
+
+class StackTraceTest extends VmServiceRequestHelper {
+  StackTraceTest(port, id) :
+      super('http://127.0.0.1:$port/isolates/$id/stacktrace');
+
+  int _aId;
+  int _cId;
+  onRequestCompleted(Map reply) {
+    Expect.equals('StackTrace', reply['type']);
+    List members = reply['members'];
+    Expect.equals('a', members[0]['name']);
+    _aId = members[0]['code']['id'];
+    Expect.equals('c', members[2]['name']);
+    _cId = members[2]['code']['id'];
+  }
+}
+
+class IsolateListTest extends VmServiceRequestHelper {
+  IsolateListTest(port) : super('http://127.0.0.1:$port/isolates');
+
+  int _isolateId;
+  onRequestCompleted(Map reply) {
+    IsolateListTester tester = new IsolateListTester(reply);
+    tester.checkIsolateCount(2);
+    tester.checkIsolateNameContains('isolate_stacktrace_command_script.dart');
+    _isolateId = tester.checkIsolateNameContains('myIsolateName');
+  }
+}
+
+main() {
+  var process = new TestLauncher('isolate_stacktrace_command_script.dart');
+  process.launch().then((port) {
+    var test = new IsolateListTest(port);
+    test.makeRequest().then((_) {
+      var stackTraceTest =
+          new StackTraceTest(port, test._isolateId);
+      stackTraceTest.makeRequest().then((_) {
+        var codeATest = new CodeATest(port, test._isolateId,
+                                      stackTraceTest._aId);
+        var codeCTest = new CodeCTest(port, test._isolateId,
+                                      stackTraceTest._cId);
+        var requests = Future.wait([codeATest.makeRequest(),
+                                    codeCTest.makeRequest()]);
+        requests.then((_) {
+          process.requestExit();
+        });
+      });
+    });
+  });
+}
diff --git a/tests/standalone/vmservice/isolate_echo_script.dart b/tests/standalone/vmservice/isolate_echo_script.dart
new file mode 100644
index 0000000..a727441
--- /dev/null
+++ b/tests/standalone/vmservice/isolate_echo_script.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library isolate_echo_script;
+
+import 'dart:io';
+
+main() {
+  print(''); // Print blank line to signal that we are ready.
+
+  // Wait until signaled from spawning test.
+  stdin.first.then((_) => exit(0));
+}
diff --git a/tests/standalone/vmservice/isolate_echo_test.dart b/tests/standalone/vmservice/isolate_echo_test.dart
new file mode 100644
index 0000000..f5ed761
--- /dev/null
+++ b/tests/standalone/vmservice/isolate_echo_test.dart
@@ -0,0 +1,60 @@
+// 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 isolate_echo_test;
+
+import 'test_helper.dart';
+import 'package:expect/expect.dart';
+
+class EchoRequestTest extends VmServiceRequestHelper {
+  EchoRequestTest(port, id) :
+      super('http://127.0.0.1:$port/isolates/$id/_echo/foo/bar?a=b&k=&d=e&z=w');
+
+  onRequestCompleted(Map reply) {
+    Expect.equals('message', reply['type']);
+
+    Expect.equals(3, reply['message']['arguments'].length);
+    Expect.equals('_echo', reply['message']['arguments'][0]);
+    Expect.equals('foo', reply['message']['arguments'][1]);
+    Expect.equals('bar', reply['message']['arguments'][2]);
+
+    Expect.equals(4, reply['message']['option_keys'].length);
+    Expect.equals('a', reply['message']['option_keys'][0]);
+    Expect.equals('k', reply['message']['option_keys'][1]);
+    Expect.equals('d', reply['message']['option_keys'][2]);
+    Expect.equals('z', reply['message']['option_keys'][3]);
+
+    Expect.equals(4, reply['message']['option_values'].length);
+    Expect.equals('b', reply['message']['option_values'][0]);
+    Expect.equals('', reply['message']['option_values'][1]);
+    Expect.equals('e', reply['message']['option_values'][2]);
+    Expect.equals('w', reply['message']['option_values'][3]);
+  }
+}
+
+class IsolateListTest extends VmServiceRequestHelper {
+  IsolateListTest(port) : super('http://127.0.0.1:$port/isolates');
+
+  int _isolateId;
+  onRequestCompleted(Map reply) {
+    IsolateListTester tester = new IsolateListTester(reply);
+    tester.checkIsolateCount(1);
+    tester.checkIsolateNameContains('isolate_echo_script.dart');
+    _isolateId = reply['members'][0]['id'];
+  }
+}
+
+
+main() {
+  var process = new TestLauncher('isolate_echo_script.dart');
+  process.launch().then((port) {
+    var test = new IsolateListTest(port);
+    test.makeRequest().then((_) {
+      var echoRequestTest = new EchoRequestTest(port, test._isolateId);
+      echoRequestTest.makeRequest().then((_) {
+        process.requestExit();
+      });
+    });
+  });
+}
diff --git a/tests/standalone/vmservice/isolate_function_test.dart b/tests/standalone/vmservice/isolate_function_test.dart
new file mode 100644
index 0000000..369616b
--- /dev/null
+++ b/tests/standalone/vmservice/isolate_function_test.dart
@@ -0,0 +1,80 @@
+// 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 isolate_class_test;
+
+import 'dart:async';
+import 'test_helper.dart';
+import 'package:expect/expect.dart';
+
+class MethodTest extends VmServiceRequestHelper {
+  MethodTest(port, id, functionId) :
+      super('http://127.0.0.1:$port/isolates/$id/functions/$functionId');
+  onRequestCompleted(Map reply) {
+    Expect.equals('Function', reply['type']);
+    Expect.equals('C.c', reply['name']);
+    Expect.equals(false, reply['is_static']);
+  }
+}
+
+class FunctionTest extends VmServiceRequestHelper {
+  FunctionTest(port, id, functionId) :
+      super('http://127.0.0.1:$port/isolates/$id/functions/$functionId');
+
+  onRequestCompleted(Map reply) {
+    Expect.equals('Function', reply['type']);
+    Expect.equals('a', reply['name']);
+    Expect.equals(true, reply['is_static']);
+  }
+}
+
+class StackTraceTest extends VmServiceRequestHelper {
+  StackTraceTest(port, id) :
+      super('http://127.0.0.1:$port/isolates/$id/stacktrace');
+
+  int _aId;
+  int _cId;
+  onRequestCompleted(Map reply) {
+    Expect.equals('StackTrace', reply['type']);
+    List members = reply['members'];
+    Expect.equals('a', members[0]['name']);
+    _aId = members[0]['function']['id'];
+    Expect.equals('c', members[2]['name']);
+    _cId = members[2]['function']['id'];
+  }
+}
+
+class IsolateListTest extends VmServiceRequestHelper {
+  IsolateListTest(port) : super('http://127.0.0.1:$port/isolates');
+
+  int _isolateId;
+  onRequestCompleted(Map reply) {
+    IsolateListTester tester = new IsolateListTester(reply);
+    tester.checkIsolateCount(2);
+    tester.checkIsolateNameContains('isolate_stacktrace_command_script.dart');
+    _isolateId = tester.checkIsolateNameContains('myIsolateName');
+  }
+}
+
+main() {
+  var process = new TestLauncher('isolate_stacktrace_command_script.dart');
+  process.launch().then((port) {
+    var test = new IsolateListTest(port);
+    test.makeRequest().then((_) {
+      var stackTraceTest =
+          new StackTraceTest(port, test._isolateId);
+      stackTraceTest.makeRequest().then((_) {
+        var functionTest = new FunctionTest(port, test._isolateId,
+                                            stackTraceTest._aId);
+        functionTest.makeRequest().then((_) {
+          var methodTest = new MethodTest(port, test._isolateId,
+                                          stackTraceTest._cId);
+          methodTest.makeRequest().then((_) {
+            process.requestExit();
+          });
+        });
+      });
+    });
+  });
+}
diff --git a/tests/standalone/vmservice/isolate_library_test.dart b/tests/standalone/vmservice/isolate_library_test.dart
new file mode 100644
index 0000000..31d269b
--- /dev/null
+++ b/tests/standalone/vmservice/isolate_library_test.dart
@@ -0,0 +1,61 @@
+// 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 isolate_library_test;
+
+import 'dart:async';
+import 'test_helper.dart';
+import 'package:expect/expect.dart';
+
+class LibraryTest extends VmServiceRequestHelper {
+  LibraryTest(port, id, libId) :
+      super('http://127.0.0.1:$port/isolates/$id/libraries/$libId');
+
+  onRequestCompleted(Map reply) {
+    Expect.equals('Library', reply['type']);
+    Expect.equals('isolate_stacktrace_command_script', reply['name']);
+  }
+}
+
+class RootLibraryTest extends VmServiceRequestHelper {
+  RootLibraryTest(port, id) :
+      super('http://127.0.0.1:$port/isolates/$id/libraries');
+
+  int _libId;
+  onRequestCompleted(Map reply) {
+    Expect.equals('@Library', reply['type']);
+    Expect.equals('isolate_stacktrace_command_script', reply['name']);
+    _libId = reply['id'];
+  }
+}
+
+class IsolateListTest extends VmServiceRequestHelper {
+  IsolateListTest(port) : super('http://127.0.0.1:$port/isolates');
+
+  int _isolateId;
+  onRequestCompleted(Map reply) {
+    IsolateListTester tester = new IsolateListTester(reply);
+    tester.checkIsolateCount(2);
+    tester.checkIsolateNameContains('isolate_stacktrace_command_script.dart');
+    _isolateId = tester.checkIsolateNameContains('myIsolateName');
+  }
+}
+
+main() {
+  var process = new TestLauncher('isolate_stacktrace_command_script.dart');
+  process.launch().then((port) {
+    var test = new IsolateListTest(port);
+    test.makeRequest().then((_) {
+      var rootLibraryTest =
+          new RootLibraryTest(port, test._isolateId);
+      rootLibraryTest.makeRequest().then((_) {
+        var libraryTest = new LibraryTest(port, test._isolateId,
+                                          rootLibraryTest._libId);
+        libraryTest.makeRequest().then((_) {
+          process.requestExit();
+        });
+      });
+    });
+  });
+}
diff --git a/tests/standalone/vmservice/isolate_stacktrace_command_script.dart b/tests/standalone/vmservice/isolate_stacktrace_command_script.dart
index a573126..b9bbccf 100644
--- a/tests/standalone/vmservice/isolate_stacktrace_command_script.dart
+++ b/tests/standalone/vmservice/isolate_stacktrace_command_script.dart
@@ -9,6 +9,7 @@
 
 void a() {
   int x = 0;
+  print(''); // Print blank line to signal that we are ready.
   while (true) {
     x &= x;
   }
@@ -30,7 +31,6 @@
 
 main() {
   spawnFunction(myIsolateName);
-  print(''); // Print blank line to signal that we are ready.
   // Wait until signaled from spawning test.
   stdin.first.then((_) => exit(0));
 }
diff --git a/tests/standalone/vmservice/multiple_isolate_list_script.dart b/tests/standalone/vmservice/multiple_isolate_list_script.dart
index 21e6a0a..128f61a 100644
--- a/tests/standalone/vmservice/multiple_isolate_list_script.dart
+++ b/tests/standalone/vmservice/multiple_isolate_list_script.dart
@@ -8,7 +8,9 @@
 import 'dart:isolate';
 
 void isolateMain1() {
-  // Die immediately.
+  // Spawn another isolate.
+  spawnFunction(myIsolateName);
+  // Kill this isolate.
   port.close();
 }
 
@@ -17,12 +19,11 @@
   port.receive((a, b) {
     port.close();
   });
+  print(''); // Print blank line to signal that we are ready.
 }
 
 main() {
   spawnFunction(isolateMain1);
-  spawnFunction(myIsolateName);
-  print(''); // Print blank line to signal that we are ready.
   // Wait until signaled from spawning test.
   stdin.first.then((_) => exit(0));
 }
diff --git a/tests/standalone/vmservice/test_helper.dart b/tests/standalone/vmservice/test_helper.dart
index 7e95539..e3f51c5 100644
--- a/tests/standalone/vmservice/test_helper.dart
+++ b/tests/standalone/vmservice/test_helper.dart
@@ -25,6 +25,7 @@
         return response
             .fold(new BytesBuilder(), (b, d) => b..add(d))
             .then((builder) {
+              print('** GET: $uri');
               _requestCompleted(builder.takeBytes(), response);
             });
       }).catchError((error) {
@@ -41,6 +42,7 @@
       onRequestFailed(e);
       return;
     }
+    print('** Response: $replyAsString');
     var reply;
     try {
       reply = JSON.parse(replyAsString);
@@ -85,6 +87,7 @@
 
   Future<int> launch() {
     String dartExecutable = Platform.executable;
+    print('** Launching $scriptPath');
     return Process.start(dartExecutable,
                          ['--enable-vm-service:0', scriptPath]).then((p) {
 
@@ -108,6 +111,7 @@
           completer.complete(portNumber);
           // Stop repeat completions.
           first = false;
+          print('** Signaled to run test queries on $portNumber');
         }
         print(line);
       });
@@ -123,6 +127,7 @@
   }
 
   void requestExit() {
+    print('** Requesting script to exit.');
     process.stdin.add([32, 13, 10]);
   }
 }
diff --git a/tools/VERSION b/tools/VERSION
index b81bbdd..4a9b649 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 6
-BUILD 15
-PATCH 3
+BUILD 16
+PATCH 0
diff --git a/tools/dom/docs/docs.json b/tools/dom/docs/docs.json
index 7ce71fb..eb0de65 100644
--- a/tools/dom/docs/docs.json
+++ b/tools/dom/docs/docs.json
@@ -601,7 +601,7 @@
           "   *",
           "   *     var request = new HttpRequest();",
           "   *     request.open('GET', 'http://dartlang.org')",
-          "   *     request.onLoad.add((event) => print('Request complete'));",
+          "   *     request.onLoad.listen((event) => print('Request complete'));",
           "   *",
           "   * is the (more verbose) equivalent of",
           "   *",
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 5d067fe..d56916c 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -26,6 +26,30 @@
     },
     "support_level": "stable"
   },
+  "AesCbcParams": {
+    "members": {
+      "iv": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "AesKeyGenParams": {
+    "members": {
+      "length": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "Algorithm": {
+    "members": {
+      "name": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "AnalyserNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AnalyserNode",
     "members": {
@@ -108,6 +132,9 @@
       "noteGrainOn": {},
       "noteOff": {},
       "noteOn": {},
+      "onended": {
+        "support_level": "untriaged"
+      },
       "playbackRate": {},
       "playbackState": {},
       "start": {},
@@ -120,6 +147,9 @@
     "members": {
       "AudioContext": {},
       "activeSourceCount": {},
+      "addEventListener": {
+        "support_level": "untriaged"
+      },
       "createAnalyser": {},
       "createBiquadFilter": {},
       "createBuffer": {},
@@ -140,14 +170,23 @@
       "createMediaStreamSource": {},
       "createOscillator": {},
       "createPanner": {},
+      "createPeriodicWave": {
+        "support_level": "untriaged"
+      },
       "createScriptProcessor": {},
       "createWaveShaper": {},
       "createWaveTable": {},
       "currentTime": {},
       "decodeAudioData": {},
       "destination": {},
+      "dispatchEvent": {
+        "support_level": "untriaged"
+      },
       "listener": {},
       "oncomplete": {},
+      "removeEventListener": {
+        "support_level": "untriaged"
+      },
       "sampleRate": {},
       "startRendering": {}
     },
@@ -479,7 +518,10 @@
       "length": {},
       "parentRule": {},
       "removeProperty": {},
-      "setProperty": {}
+      "setProperty": {},
+      "var": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "stable"
   },
@@ -548,6 +590,29 @@
     },
     "support_level": "deprecated"
   },
+  "CSSVariablesMap": {
+    "members": {
+      "clear": {
+        "support_level": "untriaged"
+      },
+      "delete": {
+        "support_level": "untriaged"
+      },
+      "get": {
+        "support_level": "untriaged"
+      },
+      "has": {
+        "support_level": "untriaged"
+      },
+      "set": {
+        "support_level": "untriaged"
+      },
+      "size": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CSSViewportRule": {
     "members": {
       "style": {
@@ -811,6 +876,12 @@
     "comment": "http://www.w3.org/TR/ime-api/#idl-def-Composition",
     "members": {
       "caret": {},
+      "selectionEnd": {
+        "support_level": "untriaged"
+      },
+      "selectionStart": {
+        "support_level": "untriaged"
+      },
       "text": {}
     },
     "support_level": "experimental"
@@ -917,6 +988,29 @@
     },
     "support_level": "experimental"
   },
+  "CryptoOperation": {
+    "members": {
+      "abort": {
+        "support_level": "untriaged"
+      },
+      "algorithm": {
+        "support_level": "untriaged"
+      },
+      "finish": {
+        "support_level": "untriaged"
+      },
+      "process": {
+        "support_level": "untriaged"
+      },
+      "processByteBuffer": {
+        "support_level": "untriaged"
+      },
+      "processTypedData": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "CustomElementConstructor": {
     "comment": "https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-custom-element-constructor-generation",
     "dart_action": "suppress",
@@ -1243,6 +1337,17 @@
     },
     "support_level": "experimental"
   },
+  "DedicatedWorkerGlobalScope": {
+    "members": {
+      "onmessage": {
+        "support_level": "untriaged"
+      },
+      "postMessage": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "DelayNode": {
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#DelayNode",
     "members": {
@@ -1498,6 +1603,12 @@
       "onkeyup": {},
       "onload": {},
       "onmousedown": {},
+      "onmouseenter": {
+        "support_level": "untriaged"
+      },
+      "onmouseleave": {
+        "support_level": "untriaged"
+      },
       "onmousemove": {},
       "onmouseout": {},
       "onmouseover": {},
@@ -1753,6 +1864,10 @@
         "dart_action": "stable",
         "support_level": "nonstandard"
       },
+      "createShadowRoot": {
+        "comment": "https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root",
+        "support_level": "experimental"
+      },
       "dataset": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#dom-dataset"
       },
@@ -1855,6 +1970,12 @@
       "onkeyup": {},
       "onload": {},
       "onmousedown": {},
+      "onmouseenter": {
+        "support_level": "untriaged"
+      },
+      "onmouseleave": {
+        "support_level": "untriaged"
+      },
       "onmousemove": {},
       "onmouseout": {},
       "onmouseover": {},
@@ -1918,6 +2039,9 @@
         "support_level": "nonstandard"
       },
       "previousElementSibling": {},
+      "pseudo": {
+        "support_level": "untriaged"
+      },
       "querySelector": {},
       "querySelectorAll": {},
       "remove": {
@@ -1952,6 +2076,10 @@
         "support_level": "deprecated"
       },
       "setAttributeNodeNS": {},
+      "shadowRoot": {
+        "comment": "https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root",
+        "support_level": "experimental"
+      },
       "spellcheck": {
         "comment": "http://blog.whatwg.org/the-road-to-html-5-spellchecking",
         "dart_action": "experimental",
@@ -1973,10 +2101,6 @@
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-translate-attribute",
         "support_level": "experimental"
       },
-      "webkitCreateShadowRoot": {
-        "comment": "https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root",
-        "support_level": "experimental"
-      },
       "webkitGetRegionFlowRanges": {
         "comment": "http://dev.w3.org/csswg/css-regions/#dom-region-getregionflowranges",
         "support_level": "experimental"
@@ -2010,10 +2134,6 @@
         "comment": "https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Element-requestPointerLock-void",
         "support_level": "experimental"
       },
-      "webkitShadowRoot": {
-        "comment": "https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root",
-        "support_level": "experimental"
-      },
       "webkitdropzone": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute",
         "support_level": "experimental"
@@ -2897,6 +3017,9 @@
     "members": {
       "close": {},
       "open": {},
+      "returnValue": {
+        "support_level": "untriaged"
+      },
       "show": {},
       "showModal": {}
     },
@@ -3394,6 +3517,9 @@
         "support_level": "experimental"
       },
       "indeterminate": {},
+      "inputMode": {
+        "support_level": "untriaged"
+      },
       "labels": {
         "comment": "http://www.w3.org/TR/html5/forms.html#dom-lfe-labels"
       },
@@ -4389,6 +4515,9 @@
       },
       "disabled": {},
       "form": {},
+      "inputMode": {
+        "support_level": "untriaged"
+      },
       "labels": {
         "comment": "http://www.w3.org/TR/html5/forms.html#dom-lfe-labels",
         "dart_action": "unstable"
@@ -4535,6 +4664,14 @@
     },
     "support_level": "stable"
   },
+  "HmacParams": {
+    "members": {
+      "hash": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "IDBAny": {
     "dart_action": "suppress",
     "members": {},
@@ -4578,6 +4715,10 @@
       "name": {},
       "objectStoreNames": {},
       "onabort": {},
+      "onclose": {
+        "comment": "https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540",
+        "support_level": "experimental"
+      },
       "onerror": {},
       "onversionchange": {},
       "removeEventListener": {},
@@ -4730,6 +4871,21 @@
     },
     "support_level": "stable"
   },
+  "ImageBitmap": {
+    "members": {
+      "height": {
+        "support_level": "untriaged"
+      },
+      "width": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "ImageBitmapCallback": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "ImageData": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#imagedata",
     "members": {
@@ -4748,7 +4904,10 @@
       "locale": {},
       "open": {},
       "setCaretRectangle": {},
-      "setExclusionRectangle": {}
+      "setExclusionRectangle": {},
+      "target": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -4782,6 +4941,23 @@
     },
     "support_level": "stable"
   },
+  "Key": {
+    "members": {
+      "algorithm": {
+        "support_level": "untriaged"
+      },
+      "extractable": {
+        "support_level": "untriaged"
+      },
+      "type": {
+        "support_level": "untriaged"
+      },
+      "usages": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "KeyboardEvent": {
     "comment": "http://www.w3.org/TR/DOM-Level-3-Events/#events-KeyboardEvent",
     "members": {
@@ -5829,7 +6005,13 @@
       "frequency": {},
       "noteOff": {},
       "noteOn": {},
+      "onended": {
+        "support_level": "untriaged"
+      },
       "playbackState": {},
+      "setPeriodicWave": {
+        "support_level": "untriaged"
+      },
       "setWaveTable": {},
       "start": {},
       "stop": {},
@@ -6099,6 +6281,10 @@
     },
     "support_level": "stable"
   },
+  "PeriodicWave": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "Plugin": {
     "members": {
       "__getter__": {},
@@ -6180,11 +6366,40 @@
     "support_level": "stable"
   },
   "Promise": {
-    "members": {},
+    "members": {
+      "_any": {
+        "support_level": "untriaged"
+      },
+      "every": {
+        "support_level": "untriaged"
+      },
+      "fulfill": {
+        "support_level": "untriaged"
+      },
+      "reject": {
+        "support_level": "untriaged"
+      },
+      "resolve": {
+        "support_level": "untriaged"
+      },
+      "some": {
+        "support_level": "untriaged"
+      }
+    },
     "support_level": "untriaged"
   },
   "PromiseResolver": {
-    "members": {},
+    "members": {
+      "fulfill": {
+        "support_level": "untriaged"
+      },
+      "reject": {
+        "support_level": "untriaged"
+      },
+      "resolve": {
+        "support_level": "untriaged"
+      }
+    },
     "support_level": "untriaged"
   },
   "RGBColor": {
@@ -7089,7 +7304,13 @@
       "id": {},
       "ownerSVGElement": {},
       "viewportElement": {},
-      "xmlbase": {}
+      "xmlbase": {},
+      "xmllang": {
+        "support_level": "untriaged"
+      },
+      "xmlspace": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "stable"
   },
@@ -7097,9 +7318,15 @@
     "comment": "http://www.w3.org/TR/SVG/struct.html#InterfaceSVGElementInstance",
     "dart_action": "unstable",
     "members": {
+      "addEventListener": {
+        "support_level": "untriaged"
+      },
       "childNodes": {},
       "correspondingElement": {},
       "correspondingUseElement": {},
+      "dispatchEvent": {
+        "support_level": "untriaged"
+      },
       "firstChild": {},
       "lastChild": {},
       "nextSibling": {},
@@ -7129,6 +7356,12 @@
       "onkeyup": {},
       "onload": {},
       "onmousedown": {},
+      "onmouseenter": {
+        "support_level": "untriaged"
+      },
+      "onmouseleave": {
+        "support_level": "untriaged"
+      },
       "onmousemove": {},
       "onmouseout": {},
       "onmouseover": {},
@@ -7147,7 +7380,10 @@
       "onsubmit": {},
       "onunload": {},
       "parentNode": {},
-      "previousSibling": {}
+      "previousSibling": {},
+      "removeEventListener": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "stable"
   },
@@ -8037,6 +8273,44 @@
     },
     "support_level": "stable"
   },
+  "SVGGraphicsElement": {
+    "members": {
+      "farthestViewportElement": {
+        "support_level": "untriaged"
+      },
+      "getBBox": {
+        "support_level": "untriaged"
+      },
+      "getCTM": {
+        "support_level": "untriaged"
+      },
+      "getScreenCTM": {
+        "support_level": "untriaged"
+      },
+      "getTransformToElement": {
+        "support_level": "untriaged"
+      },
+      "hasExtension": {
+        "support_level": "untriaged"
+      },
+      "nearestViewportElement": {
+        "support_level": "untriaged"
+      },
+      "requiredExtensions": {
+        "support_level": "untriaged"
+      },
+      "requiredFeatures": {
+        "support_level": "untriaged"
+      },
+      "systemLanguage": {
+        "support_level": "untriaged"
+      },
+      "transform": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "SVGHKernElement": {
     "comment": "http://www.w3.org/TR/SVG/fonts.html#InterfaceSVGHKernElement",
     "dart_action": "unstable",
@@ -9661,6 +9935,9 @@
       "originalPolicy": {},
       "referrer": {},
       "sourceFile": {},
+      "statusCode": {
+        "support_level": "untriaged"
+      },
       "violatedDirective": {}
     },
     "support_level": "experimental"
@@ -9754,6 +10031,14 @@
     },
     "support_level": "nonstandard"
   },
+  "SharedWorkerGlobalScope": {
+    "members": {
+      "name": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "SourceBuffer": {
     "comment": "https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#sourcebuffer",
     "members": {
@@ -9767,6 +10052,9 @@
       "appendBuffer": {
         "support_level": "untriaged"
       },
+      "appendBufferView": {
+        "support_level": "untriaged"
+      },
       "buffered": {},
       "dispatchEvent": {
         "support_level": "untriaged"
@@ -9951,6 +10239,12 @@
     "comment": "https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section",
     "members": {
       "SpeechSynthesisUtterance": {},
+      "addEventListener": {
+        "support_level": "untriaged"
+      },
+      "dispatchEvent": {
+        "support_level": "untriaged"
+      },
       "lang": {},
       "onboundary": {},
       "onend": {},
@@ -9961,6 +10255,9 @@
       "onstart": {},
       "pitch": {},
       "rate": {},
+      "removeEventListener": {
+        "support_level": "untriaged"
+      },
       "text": {},
       "voice": {},
       "volume": {}
@@ -10093,7 +10390,26 @@
     "support_level": "stable"
   },
   "SubtleCrypto": {
-    "members": {},
+    "members": {
+      "decrypt": {
+        "support_level": "untriaged"
+      },
+      "digest": {
+        "support_level": "untriaged"
+      },
+      "encrypt": {
+        "support_level": "untriaged"
+      },
+      "importKey": {
+        "support_level": "untriaged"
+      },
+      "sign": {
+        "support_level": "untriaged"
+      },
+      "verify": {
+        "support_level": "untriaged"
+      }
+    },
     "support_level": "untriaged"
   },
   "Text": {
@@ -11405,6 +11721,9 @@
       "closed": {},
       "confirm": {},
       "console": {},
+      "createImageBitmap": {
+        "support_level": "untriaged"
+      },
       "crypto": {
         "comment": "http://www.w3.org/TR/WebCryptoAPI/",
         "support_level": "experimental"
@@ -11501,6 +11820,12 @@
       "onloadstart": {},
       "onmessage": {},
       "onmousedown": {},
+      "onmouseenter": {
+        "support_level": "untriaged"
+      },
+      "onmouseleave": {
+        "support_level": "untriaged"
+      },
       "onmousemove": {},
       "onmouseout": {},
       "onmouseover": {},
@@ -11686,6 +12011,17 @@
     },
     "support_level": "stable"
   },
+  "WindowBase64": {
+    "members": {
+      "atob": {
+        "support_level": "untriaged"
+      },
+      "btoa": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "WindowTimers": {
     "members": {
       "clearInterval": {
@@ -11708,11 +12044,20 @@
     "dart_action": "experimental",
     "members": {
       "Worker": {},
+      "addEventListener": {
+        "support_level": "untriaged"
+      },
+      "dispatchEvent": {
+        "support_level": "untriaged"
+      },
       "onerror": {
         "support_level": "untriaged"
       },
       "onmessage": {},
       "postMessage": {},
+      "removeEventListener": {
+        "support_level": "untriaged"
+      },
       "terminate": {}
     },
     "support_level": "stable"
@@ -11804,6 +12149,95 @@
     },
     "support_level": "untriaged"
   },
+  "WorkerGlobalScope": {
+    "members": {
+      "PERSISTENT": {
+        "support_level": "untriaged"
+      },
+      "TEMPORARY": {
+        "support_level": "untriaged"
+      },
+      "addEventListener": {
+        "support_level": "untriaged"
+      },
+      "atob": {
+        "support_level": "untriaged"
+      },
+      "btoa": {
+        "support_level": "untriaged"
+      },
+      "clearInterval": {
+        "support_level": "untriaged"
+      },
+      "clearTimeout": {
+        "support_level": "untriaged"
+      },
+      "close": {
+        "support_level": "untriaged"
+      },
+      "crypto": {
+        "support_level": "untriaged"
+      },
+      "dispatchEvent": {
+        "support_level": "untriaged"
+      },
+      "importScripts": {
+        "support_level": "untriaged"
+      },
+      "indexedDB": {
+        "support_level": "untriaged"
+      },
+      "location": {
+        "support_level": "untriaged"
+      },
+      "navigator": {
+        "support_level": "untriaged"
+      },
+      "onerror": {
+        "support_level": "untriaged"
+      },
+      "openDatabase": {
+        "support_level": "untriaged"
+      },
+      "openDatabaseSync": {
+        "support_level": "untriaged"
+      },
+      "performance": {
+        "support_level": "untriaged"
+      },
+      "removeEventListener": {
+        "support_level": "untriaged"
+      },
+      "self": {
+        "support_level": "untriaged"
+      },
+      "setInterval": {
+        "support_level": "untriaged"
+      },
+      "setTimeout": {
+        "support_level": "untriaged"
+      },
+      "webkitIndexedDB": {
+        "support_level": "untriaged"
+      },
+      "webkitNotifications": {
+        "support_level": "untriaged"
+      },
+      "webkitRequestFileSystem": {
+        "support_level": "untriaged"
+      },
+      "webkitRequestFileSystemSync": {
+        "support_level": "untriaged"
+      },
+      "webkitResolveLocalFileSystemSyncURL": {
+        "support_level": "untriaged"
+      },
+      "webkitResolveLocalFileSystemURL": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "WorkerLocation": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workerlocation",
     "members": {
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index 8c9035b..e7be42c 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -19,7 +19,7 @@
 interface AudioParam {
   // TODO(ager): Auto-generate this custom method when the info about retaining
   // typed arrays is in the IDL.
-  [Custom] void setValueCurveAtTime(Float32Array values, float time, float duration);
+  [Custom] void setValueCurveAtTime(Float32Array values, double time, double duration);
 };
 
 [Supplemental]
@@ -35,6 +35,11 @@
 };
 
 [Supplemental]
+interface Node {
+  Node cloneNode([Default=Undefined] optional boolean deep);
+};
+
+[Supplemental]
 interface ScriptProcessorNode {
   [Suppressed] attribute EventListener onaudioprocess;
   [Custom] void _setEventListener(EventListener eventListener);
@@ -333,5 +338,3 @@
 [Supplemental]
 interface Window : EventTarget {};
 
-[Supplemental]
-interface AbstractWorker : EventTarget {};
diff --git a/tools/dom/scripts/dartgenerator.py b/tools/dom/scripts/dartgenerator.py
index 5954d4e..cde0484 100755
--- a/tools/dom/scripts/dartgenerator.py
+++ b/tools/dom/scripts/dartgenerator.py
@@ -200,11 +200,25 @@
       visit(interface)
     return ordered
 
+  def IsEventTarget(self, database, interface):
+    if interface.id == 'EventTarget':
+      return True
+    for parent in interface.parents:
+      parent_name = parent.type.id
+      if database.HasInterface(parent_name):
+        parent_interface = database.GetInterface(parent.type.id)
+        if self.IsEventTarget(database, parent_interface):
+          return True
+    return False
+
   def FixEventTargets(self, database):
     for interface in database.GetInterfaces():
-      # Create fake EventTarget parent interface for interfaces that have
-      # 'EventTarget' extended attribute.
-      if 'EventTarget' in interface.ext_attrs and interface.id != 'EventTarget':
+      if self.IsEventTarget(database, interface):
+        # Add as an attribute for easy querying in generation code.
+        interface.ext_attrs['EventTarget'] = None
+      elif 'EventTarget' in interface.ext_attrs:
+        # Create fake EventTarget parent interface for interfaces that have
+        # 'EventTarget' extended attribute.
         ast = [('Annotation', [('Id', 'WebKit')]),
                ('InterfaceType', ('ScopedName', 'EventTarget'))]
         interface.parents.append(idlnode.IDLParentInterface(ast))
@@ -214,6 +228,8 @@
     for interface in database.GetInterfaces():
       for operation in interface.operations:
         call_with = (operation.ext_attrs.get('CallWith', '').split('|') +
-                     operation.ext_attrs.get('ConstructorCallWith', '').split('|'))
+                     operation.ext_attrs.get('ConstructorCallWith', '').split('|') +
+                     operation.ext_attrs.get('CallWith', '').split('&') +
+                     operation.ext_attrs.get('ConstructorCallWith', '').split('&'))
         if 'ScriptArguments' in call_with:
           operation.arguments.append(ARG)
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index 259b75b..ecbc261 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -398,14 +398,14 @@
   'Window.webkitNotifications': _webkit_experimental_annotations,
   'Window.webkitRequestFileSystem': _file_system_annotations,
   'Window.webkitResolveLocalFileSystemURL': _file_system_annotations,
+  'Element.createShadowRoot': [
+    "@SupportedBrowser(SupportedBrowser.CHROME, '25')",
+    "@Experimental()",
+  ],
   'Element.ontransitionend': _all_but_ie9_annotations,
   # Placeholder to add experimental flag, implementation for this is
   # pending in a separate CL.
   'Element.webkitMatchesSelector': ['@Experimental()'],
-  'Element.webkitCreateShadowRoot': [
-    "@SupportedBrowser(SupportedBrowser.CHROME, '25')",
-    "@Experimental()",
-  ],
   'Event.clipboardData': _webkit_experimental_annotations,
   'FormData': _all_but_ie9_annotations,
   'HashChangeEvent': [
diff --git a/tools/dom/scripts/database.py b/tools/dom/scripts/database.py
index 11f8667..624ad00 100755
--- a/tools/dom/scripts/database.py
+++ b/tools/dom/scripts/database.py
@@ -256,10 +256,6 @@
     def walk(parents):
       for parent in parents:
         parent_name = parent.type.id
-        if parent_name == 'EventTarget':
-          # Currently EventTarget is implemented as a mixin, not a proper
-          # super interface---ignore its members.
-          continue
         if IsDartCollectionType(parent_name):
           result.append(parent_name)
           continue
@@ -271,7 +267,7 @@
     result = []
     if interface.parents:
       parent = interface.parents[0]
-      if IsPureInterface(parent.type.id):
+      if IsPureInterface(parent.type.id) or parent.type.id == 'EventTarget':
         walk(interface.parents)
       else:
         walk(interface.parents[1:])
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 9ec3351..d264a5c 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -17,7 +17,6 @@
     # TODO(sra): DOMStringMap should be a class implementing Map<String,String>.
     'DOMStringMap',
     'ChildNode',
-    'ElementTimeControl',
     'EventListener',
     'MediaQueryListListener',
     'MutationCallback',
@@ -25,15 +24,12 @@
     'SVGExternalResourcesRequired',
     'SVGFilterPrimitiveStandardAttributes',
     'SVGFitToViewBox',
-    'SVGLangSpace',
-    'SVGLocatable',
     'SVGTests',
-    'SVGTransformable',
     'SVGURIReference',
     'SVGZoomAndPan',
     'TimeoutHandler',
+    'WindowBase64',
     'WindowTimers',
-    'WorkerPerformance',
     ])
 
 def IsPureInterface(interface_name):
@@ -694,12 +690,7 @@
     if not self._idl_type.startswith('SVG'):
       return ['"%s.h"' % self.native_type()]
 
-    if self._idl_type in ['SVGNumber', 'SVGPoint']:
-      return ['"SVGPropertyTearOff.h"']
-    if self._idl_type.startswith('SVGPathSeg'):
-      include = self._idl_type.replace('Abs', '').replace('Rel', '')
-    else:
-      include = self._idl_type
+    include = self._idl_type
     return ['"%s.h"' % include] + _svg_supplemental_includes
 
   def receiver(self):
@@ -1108,7 +1099,7 @@
     'SVGLength': TypeData(clazz='SVGTearOff'),
     'SVGLengthList': TypeData(clazz='SVGTearOff', item_type='SVGLength'),
     'SVGMatrix': TypeData(clazz='SVGTearOff'),
-    'SVGNumber': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<float>'),
+    'SVGNumber': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<SVGNumber>'),
     'SVGNumberList': TypeData(clazz='SVGTearOff', item_type='SVGNumber'),
     'SVGPathSegList': TypeData(clazz='SVGTearOff', item_type='SVGPathSeg',
         native_type='SVGPathSegListPropertyTearOff'),
@@ -1150,8 +1141,6 @@
     match = re.match(r'(?:sequence<(\w+)>|(\w+)\[\])$', type_name)
     if match:
       type_data = TypeData('Sequence')
-      if type_name == 'DOMString[]':
-        return DOMStringArrayTypeInfo(type_data, self.TypeInfo('DOMString'))
       item_info = self.TypeInfo(match.group(1) or match.group(2))
       # TODO(vsm): Generalize this code.
       if 'SourceInfo' in type_name:
@@ -1198,8 +1187,11 @@
           type_name, type_data, dart_interface_name, self)
 
     if type_data.clazz == 'BasicTypedList':
-      dart_interface_name = self._renamer.RenameInterface(
-          self._database.GetInterface(type_name))
+      if type_name == 'ArrayBuffer':
+        dart_interface_name = 'ByteBuffer'
+      else:
+        dart_interface_name = self._renamer.RenameInterface(
+            self._database.GetInterface(type_name))
       return BasicTypedListIDLTypeInfo(
           type_name, type_data, dart_interface_name, self)
 
diff --git a/tools/dom/scripts/htmleventgenerator.py b/tools/dom/scripts/htmleventgenerator.py
index b6566af..eee08c6 100644
--- a/tools/dom/scripts/htmleventgenerator.py
+++ b/tools/dom/scripts/htmleventgenerator.py
@@ -70,6 +70,8 @@
   '*.loadedmetadata': ('loadedMetadata', 'Event'),
   '*.message': ('message', 'MessageEvent'),
   '*.mousedown': ('mouseDown', 'MouseEvent'),
+  '*.mouseenter': ('mouseEnter', 'MouseEvent'),
+  '*.mouseleave': ('mouseLeave', 'MouseEvent'),
   '*.mousemove': ('mouseMove', 'MouseEvent'),
   '*.mouseout': ('mouseOut', 'MouseEvent'),
   '*.mouseover': ('mouseOver', 'MouseEvent'),
@@ -153,6 +155,7 @@
   'HTMLMediaElement.webkitkeyerror': ('keyError', 'MediaKeyEvent'),
   'HTMLMediaElement.webkitkeymessage': ('keyMessage', 'MediaKeyEvent'),
   'HTMLMediaElement.webkitneedkey': ('needKey', 'MediaKeyEvent'),
+  'IDBDatabase.close': ('close', 'Event'),
   'IDBDatabase.versionchange': ('versionChange', 'VersionChangeEvent'),
   'IDBOpenDBRequest.blocked': ('blocked', 'Event'),
   'IDBOpenDBRequest.upgradeneeded': ('upgradeNeeded', 'VersionChangeEvent'),
@@ -173,7 +176,6 @@
   'Notification.close': ('close', 'Event'),
   'Notification.display': ('display', 'Event'),
   'Notification.show': ('show', 'Event'),
-  'Performance.webkitresourcetimingbufferfull': ('resourceTimingBufferFull', 'Event'),
   'RTCDTMFSender.tonechange': ('toneChange', 'RtcDtmfToneChangeEvent'),
   'RTCDataChannel.close': ('close', 'Event'),
   'RTCDataChannel.open': ('open', 'Event'),
@@ -184,7 +186,6 @@
   'RTCPeerConnection.negotiationneeded': ('negotiationNeeded', 'Event'),
   'RTCPeerConnection.removestream': ('removeStream', 'MediaStreamEvent'),
   'RTCPeerConnection.signalingstatechange': ('signalingStateChange', 'Event'),
-  'SharedWorkerContext.connect': ('connect', 'Event'),
   'SpeechRecognition.audioend': ('audioEnd', 'Event'),
   'SpeechRecognition.audiostart': ('audioStart', 'Event'),
   'SpeechRecognition.end': ('end', 'Event'),
@@ -271,7 +272,8 @@
           TYPE=event_type)
 
   def EmitStreamGetters(self, interface, custom_events,
-      members_emitter, library_name):
+      members_emitter, library_name, stream_getter_signatures_emitter=None,
+      element_stream_getters_emitter=None):
     events = self._GetEvents(interface, custom_events)
     if not events:
       return
@@ -291,14 +293,33 @@
       annotations = self._metadata.GetFormattedMetadata(
           library_name, interface, annotation_name, '  ')
 
-      members_emitter.Emit(
-          "\n"
-          "  $(ANNOTATIONS)Stream<$TYPE> get $(NAME) => "
-          "$PROVIDER.forTarget(this);\n",
-          ANNOTATIONS=annotations,
-          NAME=getter_name,
-          PROVIDER=provider,
-          TYPE=event_type)
+      isElement = False
+      for parent in self._database.Hierarchy(interface):
+        if parent.id == 'Element':
+          isElement = True
+      # We add the same event stream getters Element, ElementList, and
+      # _FrozenElementList. So, in impl_Element.darttemplate, we have two
+      # additional emitters to add the correct variation of the stream getter
+      # for that context.
+      for emitter in [members_emitter, stream_getter_signatures_emitter,
+          element_stream_getters_emitter]:
+        if emitter == None:
+          continue
+        elem_type = 'Element' if isElement else ''
+        call_name = 'forElement' if isElement else 'forTarget'
+        if emitter == element_stream_getters_emitter:
+          call_name = '_forElementList'
+        emitter.Emit(
+            "\n"
+            "  $(ANNOTATIONS)$(ELEM_TYPE)Stream<$TYPE> get $(NAME)$BODY;\n",
+            ANNOTATIONS=annotations,
+            ELEM_TYPE=elem_type,
+            NAME=getter_name,
+            BODY = ('' if emitter == stream_getter_signatures_emitter else
+                ' => %s.%s(this)' % (((''
+                if emitter != element_stream_getters_emitter else 'Element.')
+                  + provider), call_name)),
+            TYPE=event_type)
 
   def _GetRawEvents(self, interface):
     all_interfaces = ([ interface ] +
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index a8ca1a2..73e10c4 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -71,7 +71,6 @@
   'DOMFileSystemSync', # Workers
   'DatabaseSync', # Workers
   'DataView', # Typed arrays
-  'DedicatedWorkerContext', # Workers
   'DirectoryEntrySync', # Workers
   'DirectoryReaderSync', # Workers
   'EntrySync', # Workers
@@ -114,11 +113,9 @@
   'SVGTRefElement',
   'SVGVKernElement',
   'SharedWorker', # Workers
-  'SharedWorkerContext', # Workers
   'WebKitMediaSource',
   'WebKitSourceBuffer',
   'WebKitSourceBufferList',
-  'WorkerContext', # Workers
   'WorkerLocation', # Workers
   'WorkerNavigator', # Workers
 ]
@@ -148,8 +145,8 @@
   'RTCPeerConnection.setLocalDescription',
   'RTCPeerConnection.setRemoteDescription',
   'StorageInfo.requestQuota',
-  'WorkerContext.webkitResolveLocalFileSystemURL',
-  'WorkerContext.webkitRequestFileSystem',
+  'WorkerGlobalScope.webkitResolveLocalFileSystemURL',
+  'WorkerGlobalScope.webkitRequestFileSystem',
 ])
 
 # Members from the standard dom that should not be exposed publicly in dart:html
@@ -312,6 +309,7 @@
     'WebKitCSSKeyframesRule.insertRule': 'appendRule',
     'CSSStyleDeclaration.getPropertyValue': '_getPropertyValue',
     'CSSStyleDeclaration.setProperty': '_setProperty',
+    'CSSStyleDeclaration.var': '_var',
     'DirectoryEntry.getDirectory': '_getDirectory',
     'DirectoryEntry.getFile': '_getFile',
     'Document.createCDATASection': 'createCDataSection',
@@ -328,7 +326,6 @@
     'Window.webkitRequestFileSystem': '_requestFileSystem',
     'Window.webkitResolveLocalFileSystemURL': 'resolveLocalFileSystemUrl',
     'Element.querySelector': 'query',
-    'Element.webkitCreateShadowRoot': 'createShadowRoot',
     'Element.webkitMatchesSelector' : 'matches',
     'MutationObserver.observe': '_observe',
     'Navigator.webkitGetUserMedia': '_getUserMedia',
@@ -350,6 +347,7 @@
     'WebGLRenderingContext.texSubImage2D': '_texSubImageImage2D',
     'WheelEvent.wheelDeltaX': '_wheelDeltaX',
     'WheelEvent.wheelDeltaY': '_wheelDeltaY',
+    'Window.createImageBitmap': '_createImageBitmap',
     #'WorkerContext.webkitRequestFileSystem': '_requestFileSystem',
     #'WorkerContext.webkitRequestFileSystemSync': '_requestFileSystemSync',
 })
@@ -362,6 +360,8 @@
   'CSS.supports(DOMString conditionText)': 'supportsCondition',
   'CanvasRenderingContext2D.createPattern(HTMLImageElement image, '
       'DOMString repetitionType)': 'createPatternFromImage',
+  'CryptoOperation.process(ArrayBuffer data)': 'processByteBuffer',
+  'CryptoOperation.process(ArrayBufferView data)': 'processTypedData',
   'DataTransferItemList.add(File file)': 'addFile',
   'DataTransferItemList.add(DOMString data, DOMString type)': 'addData',
   'FormData.append(DOMString name, Blob value, DOMString filename)':
@@ -376,7 +376,7 @@
   'RTCDataChannel.send(ArrayBufferView data)': 'sendTypedData',
   'RTCDataChannel.send(Blob data)': 'sendBlob',
   'RTCDataChannel.send(DOMString data)': 'sendString',
-  'SourceBuffer.appendBuffer(ArrayBufferView view)': 'appendBufferView',
+  'SourceBuffer.appendBuffer(ArrayBufferView data)': 'appendBufferView',
   'URL.createObjectURL(MediaSource source)':
       'createObjectUrlFromSource',
   'URL.createObjectURL(WebKitMediaSource source)':
@@ -502,12 +502,10 @@
     'Document.get:documentURI',
     'Document.get:embeds',
     'Document.get:forms',
-    'Document.get:height',
     'Document.get:inputEncoding',
     'Document.get:links',
     'Document.get:plugins',
     'Document.get:scripts',
-    'Document.get:width',
     'Document.get:xmlEncoding',
     'Document.getElementsByTagNameNS',
     'Document.getOverrideStyle',
@@ -564,6 +562,9 @@
     'Element.set:outerHTML',
     'Element.setAttributeNode',
     'Element.setAttributeNodeNS',
+    'Element.webkitCreateShadowRoot',
+    'Element.webkitPseudo',
+    'Element.webkitShadowRoot',
     'Event.returnValue',
     'Event.srcElement',
     'EventSource.URL',
@@ -709,7 +710,7 @@
     'ShadowRoot.getElementsByTagNameNS',
     'SVGStyledElement.getPresentationAttribute',
     'WheelEvent.wheelDelta',
-    'WorkerContext.webkitIndexedDB',
+    'WorkerGlobalScope.webkitIndexedDB',
 # TODO(jacobr): should these be removed?
     'Document.close',
     'Document.hasFocus',
@@ -721,7 +722,6 @@
   'Database': 'web_sql',
   'Navigator': 'html',
   'Window': 'html',
-  'WorkerContext': 'html',
 })
 
 class HtmlRenamer(object):
diff --git a/tools/dom/scripts/idlparser.py b/tools/dom/scripts/idlparser.py
index 01a19c2..d0fa567 100755
--- a/tools/dom/scripts/idlparser.py
+++ b/tools/dom/scripts/idlparser.py
@@ -91,7 +91,7 @@
          '{', _Definitions, '}', MAYBE(';')])
 
     def CallbackDeclaration():
-      return [Callback, Type, '=', Type,'(', ')', ';']
+      return [Callback, Type, '=', Type,'(', _Arguments, ')', ';']
 
     def Callback():
       return ['callback']
@@ -243,7 +243,7 @@
         [MAYBE(ExtAttrs), MAYBE(Optional), MAYBE('in'),
          MAYBE(Optional), Type, MAYBE(AnEllipsis), Id],
         # WebKit:
-        [MAYBE(ExtAttrs), MAYBE(Optional), Type, Id])
+        [MAYBE(ExtAttrs), MAYBE(Optional), Type, MAYBE(AnEllipsis), Id])
 
     def Optional():
       return 'optional'
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index fbb0ee9..b889489 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -48,6 +48,7 @@
     'Console.warn',
     'WebKitCSSKeyframesRule.insertRule',
     'CSSStyleDeclaration.setProperty',
+    'Element.createShadowRoot',
     'Element.insertAdjacentElement',
     'Element.insertAdjacentHTML',
     'Element.insertAdjacentText',
@@ -569,6 +570,17 @@
         MIXINS=mixins_str,
         DOMNAME=self._interface.doc_js_name,
         NATIVESPEC=native_spec)
+    stream_getter_signatures_emitter = None
+    element_stream_getters_emitter = None
+    if type(self._implementation_members_emitter) == tuple:
+      # We add event stream getters for both Element and ElementList, so in
+      # impl_Element.darttemplate, we have two additional "holes" for emitters
+      # to fill in, with small variations. These store these specialized
+      # emitters.
+      stream_getter_signatures_emitter = self._implementation_members_emitter[0]
+      element_stream_getters_emitter = self._implementation_members_emitter[1]
+      self._implementation_members_emitter = \
+          self._implementation_members_emitter[2]
     self._backend.StartInterface(self._implementation_members_emitter)
 
     self._backend.EmitHelpers(base_class)
@@ -593,7 +605,8 @@
         self._interface,
         [],
         self._implementation_members_emitter,
-        self._library_name)
+        self._library_name, stream_getter_signatures_emitter,
+        element_stream_getters_emitter)
     self._backend.FinishInterface()
 
   def _ImplementationEmitter(self):
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 91dd180..0bf38cd 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -13,7 +13,9 @@
 from idlnode import IDLArgument, IDLAttribute
 from systemhtml import js_support_checks, GetCallbackInfo, HTML_LIBRARY_NAMES
 
-_cpp_type_map = {
+# TODO(vsm): This logic needs to pulled from the source IDL.  These tables are
+# an ugly workaround.
+_cpp_callback_map = {
   ('DataTransferItem', 'webkitGetAsEntry'): 'DataTransferItemFileSystem',
   ('Document', 'webkitIsFullScreen'): 'DocumentFullscreen',
   ('Document', 'webkitFullScreenKeyboardInputAllowed'): 'DocumentFullscreen',
@@ -22,15 +24,19 @@
   ('Document', 'webkitFullscreenEnabled'): 'DocumentFullscreen',
   ('Document', 'webkitFullscreenElement'): 'DocumentFullscreen',
   ('Document', 'webkitExitFullscreen'): 'DocumentFullscreen',
-  ('Window', 'crypto'): 'DOMWindowCrypto',
-  ('Window', 'indexedDB'): 'DOMWindowIndexedDatabase',
-  ('Window', 'speechSynthesis'): 'DOMWindowSpeechSynthesis',
-  ('Window', 'webkitNotifications'): 'DOMWindowNotifications',
-  ('Window', 'storage'): 'DOMWindowQuota',
-  ('Window', 'webkitStorageInfo'): 'DOMWindowQuota',
-  ('Window', 'openDatabase'): 'DOMWindowWebDatabase',
-  ('Window', 'webkitRequestFileSystem'): 'DOMWindowFileSystem',
-  ('Window', 'webkitResolveLocalFileSystemURL'): 'DOMWindowFileSystem',
+  ('DOMWindow', 'crypto'): 'DOMWindowCrypto',
+  ('DOMWindow', 'indexedDB'): 'DOMWindowIndexedDatabase',
+  ('DOMWindow', 'speechSynthesis'): 'DOMWindowSpeechSynthesis',
+  ('DOMWindow', 'webkitNotifications'): 'DOMWindowNotifications',
+  ('DOMWindow', 'storage'): 'DOMWindowQuota',
+  ('DOMWindow', 'webkitStorageInfo'): 'DOMWindowQuota',
+  ('DOMWindow', 'openDatabase'): 'DOMWindowWebDatabase',
+  ('DOMWindow', 'webkitRequestFileSystem'): 'DOMWindowFileSystem',
+  ('DOMWindow', 'webkitResolveLocalFileSystemURL'): 'DOMWindowFileSystem',
+  ('DOMWindow', 'atob'): 'DOMWindowBase64',
+  ('DOMWindow', 'btoa'): 'DOMWindowBase64',
+  ('DOMWindow', 'clearTimeout'): 'DOMWindowTimers',
+  ('DOMWindow', 'clearInterval'): 'DOMWindowTimers',
   ('HTMLInputElement', 'webkitEntries'): 'HTMLInputElementFileSystem',
   ('Navigator', 'doNotTrack'): 'NavigatorDoNotTrack',
   ('Navigator', 'geolocation'): 'NavigatorGeolocation',
@@ -42,29 +48,60 @@
   ('Navigator', 'webkitGetGamepads'): 'NavigatorGamepad',
   ('Navigator', 'requestMIDIAccess'): 'NavigatorWebMIDI',
   ('Navigator', 'vibrate'): 'NavigatorVibration',
+  ('WorkerGlobalScope', 'crypto'): 'WorkerGlobalScopeCrypto',
+  ('WorkerGlobalScope', 'indexedDB'): 'WorkerGlobalScopeIndexedDatabase',
+  ('WorkerGlobalScope', 'webkitNotifications'): 'WorkerGlobalScopeNotifications',
+  ('WorkerGlobalScope', 'openDatabase'): 'WorkerGlobalScopeWebDatabase',
+  ('WorkerGlobalScope', 'openDatabaseSync'): 'WorkerGlobalScopeWebDatabase',
+  ('WorkerGlobalScope', 'performance'): 'WorkerGlobalScopePerformance',
+  ('WorkerGlobalScope', 'webkitRequestFileSystem'): 'WorkerGlobalScopeFileSystem',
+  ('WorkerGlobalScope', 'webkitRequestFileSystemSync'): 'WorkerGlobalScopeFileSystem',
+  ('WorkerGlobalScope', 'webkitResolveLocalFileSystemURL'): 'WorkerGlobalScopeFileSystem',
+  ('WorkerGlobalScope', 'webkitResolveLocalFileSystemSyncURL'): 'WorkerGlobalScopeFileSystem',
+  ('WorkerGlobalScope', 'atob'): 'DOMWindowBase64',
+  ('WorkerGlobalScope', 'btoa'): 'DOMWindowBase64',
+  ('WorkerGlobalScope', 'clearTimeout'): 'DOMWindowTimers',
+  ('WorkerGlobalScope', 'clearInterval'): 'DOMWindowTimers',
   }
 
+_cpp_overloaded_callback_map = {
+  ('DOMURL', 'createObjectUrlFromSourceCallback'): 'URLMediaSource',
+  ('DOMURL', 'createObjectUrlFromStreamCallback'): 'URLMediaStream',
+  ('DOMURL', '_createObjectUrlFromWebKitSourceCallback'): 'URLMediaSource',
+  ('DOMURL', '_createObjectURL_2Callback'): 'URLMediaSource',
+  ('DOMURL', '_createObjectURL_3Callback'): 'URLMediaSource',
+  ('DOMURL', '_createObjectURL_4Callback'): 'URLMediaStream',
+}
+
 _cpp_partial_map = {}
 
-def _GetCPPPartialNames(interface_name):
+def _GetCPPPartialNames(interface):
+  interface_name = interface.ext_attrs.get('ImplementedAs', interface.id)
   if not _cpp_partial_map:
-    for (type, member) in _cpp_type_map.keys():
+    for (type, member) in _cpp_callback_map.keys():
       if type not in _cpp_partial_map:
         _cpp_partial_map[type] = set([])
-      _cpp_partial_map[type].add(_cpp_type_map[(type, member)])
+      _cpp_partial_map[type].add(_cpp_callback_map[(type, member)])
+
+    for (type, member) in _cpp_overloaded_callback_map.keys():
+      if type not in _cpp_partial_map:
+        _cpp_partial_map[type] = set([])
+      _cpp_partial_map[type].add(_cpp_overloaded_callback_map[(type, member)])
 
   if interface_name in _cpp_partial_map:
     return _cpp_partial_map[interface_name]
   else:
     return set([])
 
-def _GetCPPTypeName(interface_name, callback_name):
+def _GetCPPTypeName(interface_name, callback_name, cpp_name):
   # TODO(vsm): We need to track the original IDL file name in order to recover
   # the proper CPP name.
 
   cpp_tuple = (interface_name, callback_name)
-  if cpp_tuple in _cpp_type_map:
-    cpp_type_name = _cpp_type_map[cpp_tuple]
+  if cpp_tuple in _cpp_callback_map:
+    cpp_type_name = _cpp_callback_map[cpp_tuple]
+  elif (interface_name, cpp_name) in _cpp_overloaded_callback_map:
+    cpp_type_name = _cpp_overloaded_callback_map[(interface_name, cpp_name)]
   else:
     cpp_type_name = interface_name
   return cpp_type_name
@@ -97,7 +134,7 @@
       return
 
     cpp_impl_includes = set(['"' + partial + '.h"'
-                             for partial in _GetCPPPartialNames(self._interface.id)])
+                             for partial in _GetCPPPartialNames(self._interface)])
     cpp_header_handlers_emitter = emitter.Emitter()
     cpp_impl_handlers_emitter = emitter.Emitter()
     class_name = 'Dart%s' % self._interface.id
@@ -187,7 +224,7 @@
     self._members_emitter = members_emitter
     self._cpp_declarations_emitter = emitter.Emitter()
     self._cpp_impl_includes = set(['"' + partial + '.h"'
-                                   for partial in _GetCPPPartialNames(self._interface.id)])
+                                   for partial in _GetCPPPartialNames(self._interface)])
     self._cpp_definitions_emitter = emitter.Emitter()
     self._cpp_resolver_emitter = emitter.Emitter()
 
@@ -412,8 +449,6 @@
         webcore_function_name = 'css'
       else:
         webcore_function_name = self._ToWebKitName(attr.id)
-      if attr.type.id.startswith('SVGAnimated'):
-        webcore_function_name += 'Animated'
 
     function_expression = self._GenerateWebCoreFunctionExpression(webcore_function_name, attr)
     self._GenerateNativeCallback(
@@ -442,8 +477,6 @@
                                      lambda s: s.group(1).upper(),
                                      attr.id)
       webcore_function_name = 'set%s' % webcore_function_name
-      if attr.type.id.startswith('SVGAnimated'):
-        webcore_function_name += 'Animated'
 
     function_expression = self._GenerateWebCoreFunctionExpression(webcore_function_name, attr)
     self._GenerateNativeCallback(
@@ -614,7 +647,7 @@
 
   def _GenerateOperationNativeCallback(self, operation, arguments, cpp_callback_name):
     webcore_function_name = operation.ext_attrs.get('ImplementedAs', operation.id)
-    function_expression = self._GenerateWebCoreFunctionExpression(webcore_function_name, operation)
+    function_expression = self._GenerateWebCoreFunctionExpression(webcore_function_name, operation, cpp_callback_name)
     self._GenerateNativeCallback(
         cpp_callback_name,
         not operation.is_static,
@@ -634,6 +667,7 @@
       return_type,
       return_type_is_nullable,
       raises_dom_exception):
+
     ext_attrs = node.ext_attrs
 
     cpp_arguments = []
@@ -642,7 +676,9 @@
 
     # TODO(antonm): unify with ScriptState below.
     requires_stack_info = (ext_attrs.get('CallWith') == 'ScriptArguments|ScriptState' or
-                           ext_attrs.get('ConstructorCallWith') == 'ScriptArguments|ScriptState')
+                           ext_attrs.get('ConstructorCallWith') == 'ScriptArguments|ScriptState' or
+                           ext_attrs.get('CallWith') == 'ScriptArguments&ScriptState' or
+                           ext_attrs.get('ConstructorCallWith') == 'ScriptArguments&ScriptState')
     if requires_stack_info:
       raises_exceptions = True
       cpp_arguments = ['&state', 'scriptArguments.release()']
@@ -717,7 +753,6 @@
         '\n'
         'static void $CALLBACK_NAME(Dart_NativeArguments args)\n'
         '{\n'
-        '    DartApiScope dartApiScope;\n'
         '$!BODY'
         '}\n',
         CALLBACK_NAME=callback_name)
@@ -817,7 +852,9 @@
           type_info.to_native_info(argument, self._interface.id)
 
       def AllowsNull():
-        assert argument.ext_attrs.get('TreatNullAs', 'NullString') == 'NullString'
+        # TODO(vsm): HTMLSelectElement's indexed setter treats a null as a remove.
+        # We need to handle that.
+        # assert argument.ext_attrs.get('TreatNullAs', 'NullString') == 'NullString'
         if argument.ext_attrs.get('TreatNullAs') == 'NullString':
           return True
 
@@ -869,29 +906,23 @@
 
     invocation_emitter = body_emitter
     if raises_dom_exception:
-      cpp_arguments.append('ec')
+      cpp_arguments.append('es')
       invocation_emitter = body_emitter.Emit(
-        '        ExceptionCode ec = 0;\n'
+        '        DartExceptionState es;\n'
         '$!INVOCATION'
-        '        if (UNLIKELY(ec)) {\n'
-        '            exception = DartDOMWrapper::exceptionCodeToDartException(ec);\n'
+        '        if (es.hadException()) {\n'
+        '            exception = DartDOMWrapper::exceptionCodeToDartException(es);\n'
         '            goto fail;\n'
         '        }\n')
 
 
     if needs_receiver:
       interface_name = self._interface_type_info.native_type()
-      cpp_type_name = _GetCPPTypeName(interface_name,
-                                      node.id)
-      # Hack to determine if this came from the _cpp_type_map.
+      # Hack to determine if this came from the _cpp_callback_map.
       # In this case, the getter is mapped to a static method.
       if (not function_expression.startswith('receiver->') and
           not function_expression.startswith(interface_name + '::')):
-        if 'childNodes' in callback_name:
-          print function_expression
-          print interface_name
-          raise 'hell'
-        if interface_name == 'DOMWindow' or interface_name == 'Navigator':
+        if interface_name == 'DOMWindow' or interface_name == 'Navigator' or interface_name == 'WorkerGlobalScope':
           cpp_arguments.insert(0, 'receiver')
         else:
           cpp_arguments.append('receiver')
@@ -978,17 +1009,17 @@
     attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower()
     return 'WebCore::%s::%sAttr' % (namespace, attribute_name)
 
-  def _GenerateWebCoreFunctionExpression(self, function_name, idl_node):
+  def _GenerateWebCoreFunctionExpression(self, function_name, idl_node, cpp_callback_name=None):
     if 'ImplementedBy' in idl_node.ext_attrs:
       return '%s::%s' % (idl_node.ext_attrs['ImplementedBy'], function_name)
+    cpp_type_name = self._interface_type_info.native_type()
+    impl_type_name = _GetCPPTypeName(cpp_type_name, function_name, cpp_callback_name)
     if idl_node.is_static:
-      return '%s::%s' % (self._interface_type_info.native_type(), function_name)
-    interface_name = self._interface_type_info.idl_type()
-    cpp_type_name = _GetCPPTypeName(interface_name, function_name)
-    if cpp_type_name == interface_name:
+      return '%s::%s' % (impl_type_name, function_name)
+    if cpp_type_name == impl_type_name:
       return '%s%s' % (self._interface_type_info.receiver(), function_name)
     else:
-      return '%s::%s' % (cpp_type_name, function_name)
+      return '%s::%s' % (impl_type_name, function_name)
 
   def _IsArgumentOptionalInWebCore(self, operation, argument):
     if not IsOptional(argument):
diff --git a/tools/dom/src/EventStreamProvider.dart b/tools/dom/src/EventStreamProvider.dart
index 8e3b0bc..a4ad4c0f 100644
--- a/tools/dom/src/EventStreamProvider.dart
+++ b/tools/dom/src/EventStreamProvider.dart
@@ -30,6 +30,123 @@
   }
 }
 
+/** A specialized Stream available to [Element]s to enable event delegation. */
+abstract class ElementStream<T extends Event> implements Stream<T> {
+  /**
+   * Return a stream that only fires when the particular event fires for
+   * elements matching the specified CSS selector.
+   *
+   * This is the Dart equivalent to jQuery's
+   * [delegate](http://api.jquery.com/delegate/).
+   */
+  Stream<T> matches(String selector);
+}
+
+/**
+ * Adapter for exposing DOM Element events as streams, while also allowing
+ * event delegation.
+ */
+class _ElementEventStreamImpl<T extends Event> extends _EventStream<T>
+    implements ElementStream<T> {
+  _ElementEventStreamImpl(target, eventType, useCapture) :
+      super(target, eventType, useCapture);
+
+  Stream<T> matches(String selector) =>
+      this.where((event) => event.target.matches(selector, true));
+}
+
+/**
+ * Adapter for exposing events on a collection of DOM Elements as streams,
+ * while also allowing event delegation.
+ */
+class _ElementListEventStreamImpl<T extends Event> extends Stream<T>
+    implements ElementStream<T> {
+  final _StreamPool _pool;
+  Stream<T> _stream;
+
+  _ElementListEventStreamImpl(targetList, eventType, useCapture) :
+      _pool = new _StreamPool.broadcast() {
+    for (Element target in targetList) {
+      var stream = new _EventStream(target, eventType, useCapture);
+      _pool.add(stream);
+    }
+    _stream = _pool.stream;
+  }
+
+  Stream<T> matches(String selector) =>
+      this.where((event) => event.target.matches(selector, true));
+
+  // Delegate all regular Stream behavor to our wrapped Stream.
+  StreamSubscription<T> listen(void onData(T event),
+      { void onError(error),
+        void onDone(),
+        bool cancelOnError}) =>
+      _stream.listen(onData, onError: onError, onDone: onDone,
+          cancelOnError: cancelOnError);
+  Stream<T> asBroadcastStream({void onListen(StreamSubscription subscription),
+                               void onCancel(StreamSubscription subscription)})
+      => _stream;
+  bool get isBroadcast => true;
+}
+
+/**
+ * A pool of streams whose events are unified and emitted through a central
+ * stream.
+ */
+// TODO (efortuna): Remove this when Issue 12218 is addressed.
+class _StreamPool<T> {
+  StreamController<T> _controller;
+
+  /// Subscriptions to the streams that make up the pool.
+  var _subscriptions = new Map<Stream<T>, StreamSubscription<T>>();
+
+  /**
+   * Creates a new stream pool where [stream] can be listened to more than
+   * once.
+   *
+   * Any events from buffered streams in the pool will be emitted immediately,
+   * regardless of whether [stream] has any subscribers.
+   */
+  _StreamPool.broadcast() {
+    _controller = new StreamController<T>.broadcast(sync: true,
+        onCancel: close);
+  }
+
+  /**
+   * The stream through which all events from streams in the pool are emitted.
+   */
+  Stream<T> get stream => _controller.stream;
+
+  /**
+   * Adds [stream] as a member of this pool.
+   *
+   * Any events from [stream] will be emitted through [this.stream]. If
+   * [stream] is sync, they'll be emitted synchronously; if [stream] is async,
+   * they'll be emitted asynchronously.
+   */
+  void add(Stream<T> stream) {
+    if (_subscriptions.containsKey(stream)) return;
+    _subscriptions[stream] = stream.listen(_controller.add,
+        onError: _controller.addError,
+        onDone: () => remove(stream));
+  }
+
+  /** Removes [stream] as a member of this pool. */
+  void remove(Stream<T> stream) {
+    var subscription = _subscriptions.remove(stream);
+    if (subscription != null) subscription.cancel();
+  }
+
+  /** Removes all streams from this pool and closes [stream]. */
+  void close() {
+    for (var subscription in _subscriptions.values) {
+      subscription.cancel();
+    }
+    _subscriptions.clear();
+    _controller.close();
+  }
+}
+
 class _EventStreamSubscription<T extends Event> extends StreamSubscription<T> {
   int _pauseCount = 0;
   EventTarget _target;
@@ -107,7 +224,6 @@
   }
 }
 
-
 /**
  * A factory to expose DOM events as Streams.
  */
@@ -134,8 +250,43 @@
    *
    * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
    */
-  Stream<T> forTarget(EventTarget e, {bool useCapture: false}) {
-    return new _EventStream(e, _eventType, useCapture);
+  Stream<T> forTarget(EventTarget e, {bool useCapture: false}) =>
+    new _EventStream(e, _eventType, useCapture);
+
+  /**
+   * Gets an [ElementEventStream] for this event type, on the specified element.
+   *
+   * This will always return a broadcast stream so multiple listeners can be
+   * used simultaneously.
+   *
+   * This may be used to capture DOM events:
+   *
+   *     Element.keyDownEvent.forElement(element, useCapture: true).listen(...);
+   *
+   * See also:
+   *
+   * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+   */
+  ElementStream<T> forElement(Element e, {bool useCapture: false}) {
+    return new _ElementEventStreamImpl(e, _eventType, useCapture);
+  }
+
+  /**
+   * Gets an [ElementEventStream] for this event type, on the list of elements.
+   *
+   * This will always return a broadcast stream so multiple listeners can be
+   * used simultaneously.
+   *
+   * This may be used to capture DOM events:
+   *
+   *     Element.keyDownEvent._forElementList(element, useCapture: true).listen(...);
+   *
+   * See also:
+   *
+   * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+   */
+  ElementStream<T> _forElementList(ElementList e, {bool useCapture: false}) {
+    return new _ElementListEventStreamImpl(e, _eventType, useCapture);
   }
 
   /**
@@ -164,6 +315,15 @@
     return new _EventStream(e, _eventTypeGetter(e), useCapture);
   }
 
+  ElementStream<T> forElement(Element e, {bool useCapture: false}) {
+    return new _ElementEventStreamImpl(e, _eventTypeGetter(e), useCapture);
+  }
+
+  ElementStream<T> _forElementList(ElementList e,
+      {bool useCapture: false}) {
+    return new _ElementListEventStreamImpl(e, _eventTypeGetter(e), useCapture);
+  }
+
   String getEventType(EventTarget target) {
     return _eventTypeGetter(target);
   }
diff --git a/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate b/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate
new file mode 100644
index 0000000..2349ce5
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate
@@ -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.
+
+part of $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS implements EventTarget$NATIVESPEC {
+$!MEMBERS}
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 8cfb668..e708395 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -244,6 +244,7 @@
    */
   @Experimental()
   CssRect get marginEdge;
+$!STREAM_GETTER_SIGNATURES 
 }
 
 // TODO(jacobr): this is an inefficient implementation but it is hard to see
@@ -297,6 +298,7 @@
   CssRect get borderEdge => _elementList.first.borderEdge;
 
   CssRect get marginEdge => _elementList.first.marginEdge;
+$!ELEMENT_STREAM_GETTERS
 }
 
 /**
@@ -875,19 +877,31 @@
 
   /**
    * Checks if this element matches the CSS selectors.
+   *
+   * If `includeAncestors` is true, we examine all of this element's parent
+   * elements and also return true if any of its parent elements matches
+   * `selectors`.
    */
   @Experimental()
-  bool matches(String selectors) {
-    if (JS('bool', '!!#.matches', this)) {
-      return JS('bool', '#.matches(#)', this, selectors);
-    } else if (JS('bool', '!!#.webkitMatchesSelector', this)) {
-      return JS('bool', '#.webkitMatchesSelector(#)', this, selectors);
-    } else if (JS('bool', '!!#.mozMatchesSelector', this)) {
-      return JS('bool', '#.mozMatchesSelector(#)', this, selectors);
-    } else if (JS('bool', '!!#.msMatchesSelector', this)) {
-      return JS('bool', '#.msMatchesSelector(#)', this, selectors);
-    }
-    throw new UnsupportedError("Not supported on this platform");
+  bool matches(String selectors, [includeAncestors = false]) {
+    var elem = this;
+    do {
+      bool matches = false;
+      if (JS('bool', '!!#.matches', elem)) {
+        matches = JS('bool', '#.matches(#)', elem, selectors);
+      } else if (JS('bool', '!!#.webkitMatchesSelector', elem)) {
+        matches = JS('bool', '#.webkitMatchesSelector(#)', elem, selectors);
+      } else if (JS('bool', '!!#.mozMatchesSelector', elem)) {
+        matches = JS('bool', '#.mozMatchesSelector(#)', elem, selectors);
+      } else if (JS('bool', '!!#.msMatchesSelector', elem)) {
+        matches = JS('bool', '#.msMatchesSelector(#)', elem, selectors);
+      } else {
+        throw new UnsupportedError("Not supported on this platform");
+      }
+      if (matches) return true;
+      elem = elem.parent;
+    } while(includeAncestors && elem != null);
+    return false;
   }
 $else
 $endif
@@ -905,6 +919,17 @@
 
   bool _templateIsDecorated;
 
+$if DART2JS
+  @DomName('Element.createShadowRoot')
+  @SupportedBrowser(SupportedBrowser.CHROME, '25')
+  @Experimental()
+  ShadowRoot createShadowRoot() {
+    return JS('ShadowRoot',
+      '(#.createShadowRoot || #.webkitCreateShadowRoot).call(#)',
+      this, this, this);
+  }
+$endif
+
 
   /**
    * Gets the template this node refers to.
@@ -1148,7 +1173,6 @@
 $!MEMBERS
 }
 
-
 final _START_TAG_REGEXP = new RegExp('<(\\w+)');
 class _ElementFactoryProvider {
   static const _CUSTOM_PARENT_TAG_MAP = const {
diff --git a/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate b/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate
index 893d9df..3b233f3 100644
--- a/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate
@@ -24,8 +24,19 @@
 $else
   void texImage2D(int targetTexture, int levelOfDetail, int internalFormat,
       int format, int type, data) {
-    _texImage2D(targetTexture, levelOfDetail, internalFormat,
-        format, type, data);
+    if (data is ImageElement) {
+      texImage2DImage(targetTexture, levelOfDetail, internalFormat, format,
+          type, data);
+    } else if (data is ImageData) {
+      texImage2DImageData(targetTexture, levelOfDetail, internalFormat, format,
+          type, data);
+    } else if (data is CanvasElement) {
+      texImage2DCanvas(targetTexture, levelOfDetail, internalFormat, format,
+          type, data);
+    } else {
+      texImage2DVideo(targetTexture, levelOfDetail, internalFormat, format,
+          type, data);
+    }
   }
 $endif
 
diff --git a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
index 492fcc9..4a6a45e 100644
--- a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
+++ b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
@@ -52,6 +52,40 @@
   }
 
   /**
+   * Makes a server POST request with the specified data encoded as form data.
+   *
+   * This is similar to sending a FormData object with broader browser
+   * support but limited to string values.
+   *
+   * See also:
+   *
+   * * [request]
+   */
+  static Future<HttpRequest> postFormData(String url, Map<String, String> data,
+      {bool withCredentials, String responseType,
+      Map<String, String> requestHeaders,
+      void onProgress(ProgressEvent e)}) {
+
+    var parts = [];
+    data.forEach((key, value) {
+      parts.add('${Uri.encodeQueryComponent(key)}='
+          '${Uri.encodeQueryComponent(value)}');
+    });
+    var formData = parts.join('&');
+
+    if (requestHeaders == null) {
+      requestHeaders = <String, String>{};
+    }
+    requestHeaders.putIfAbsent('Content-Type',
+        () => 'application/x-www-form-urlencoded; charset=UTF-8');
+
+    return request(url, method: 'POST', withCredentials: withCredentials,
+        responseType: responseType,
+        requestHeaders: requestHeaders, sendData: formData,
+        onProgress: onProgress);
+  }
+
+  /**
    * Creates a URL request for the specified [url].
    *
    * By default this will do an HTTP GET request, this can be overridden with
diff --git a/tools/print_version.py b/tools/print_version.py
index 65e700d..13cbf75 100755
--- a/tools/print_version.py
+++ b/tools/print_version.py
@@ -13,8 +13,12 @@
 import sys
 import utils
 
-def Main(argv):
-  print(utils.GetVersion())
+def Main():
+  version = utils.GetVersion()
+  if not version:
+    print 'Error: Couldn\'t determine version string.'
+    return 1
+  print version
 
 if __name__ == '__main__':
-  sys.exit(Main(sys.argv))
+  sys.exit(Main())
diff --git a/tools/release/version.dart b/tools/release/version.dart
deleted file mode 100644
index cec7a3f..0000000
--- a/tools/release/version.dart
+++ /dev/null
@@ -1,237 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This file contains functionality for getting dart version numbers using
- * our standard version construction method. Systems that does not include this
- * file should emulate the structure for revision numbers that we have here.
- *
- * The version number of a dart build is constructed as follows:
- *   1. The major, minor, build and patch numbers are extracted from the VERSION
- *      file in the root directory. We call these MAJOR, MINOR, BUILD and PATCH.
- *   2. The svn revision number for the current checkout is extracted from the
- *      source control system that is used in the current checkout. We call this
- *      REVISION.
- *   3. If this is _not_ a official build, i.e., this is not build by our
- *      buildbot infrastructure, we extract the user-name of the logged in
- *      person from the operating system. We call this USERNAME.
- *   4. The version number is constructed as follows:
- *      MAJOR.MINOR.BUILD.PATCH_rREVISION_USERNAME
- */
-
-library version;
-
-import "dart:async";
-import "dart:io";
-
-/**
- * Generates version information for builds.
- */
-class Version {
-  String _versionFileName;
-  String USERNAME;
-  int REVISION;
-  int MAJOR;
-  int MINOR;
-  int BUILD;
-  int PATCH;
-
-  Version(Path versionFile) {
-    _versionFileName = versionFile.toNativePath();
-  }
-
-  /**
-   * Get the version number for this specific build using the version info
-   * from the VERSION file in the root directory and the revision info
-   * from the source control system of the current checkout.
-   */
-  Future<String> getVersion() {
-    File f = new File(_versionFileName);
-    Completer c = new Completer();
-
-    var wasCompletedWithError = false;
-    completeError(String msg) {
-      if (!wasCompletedWithError) {
-        c.completeError(msg);
-        wasCompletedWithError = true;
-      }
-    }
-    f.exists().then((existed) {
-      if (!existed) {
-        completeError("No VERSION file");
-        return;
-      }
-      Stream<String> stream =
-          f.openRead().transform(new StringDecoder())
-                      .transform(new LineTransformer());
-      stream.listen((String line) {
-        if (line == null) {
-          completeError(
-              "VERSION input file seems to be in the wrong format");
-          return;
-        }
-        var values = line.split(" ");
-        if (values.length != 2) {
-          completeError(
-              "VERSION input file seems to be in the wrong format");
-          return;
-        }
-        var number = 0;
-        try {
-          number = int.parse(values[1]);
-        } catch (e) {
-          completeError("Can't parse version numbers, not an int");
-          return;
-        }
-        switch (values[0]) {
-          case "MAJOR":
-            MAJOR = number;
-            break;
-          case "MINOR":
-            MINOR = number;
-            break;
-          case "BUILD":
-            BUILD = number;
-            break;
-          case "PATCH":
-            PATCH = number;
-            break;
-          default:
-            completeError("Wrong format in VERSION file, line does not "
-                            "contain one of {MAJOR, MINOR, BUILD, PATCH}");
-            return;
-        }
-      },
-      onDone: () {
-        // Only complete if we did not already complete with a failure.
-        if (!wasCompletedWithError) {
-          getRevision().then((revision) {
-            REVISION = revision;
-            USERNAME = getUserName();
-            var userNameString = "";
-            if (USERNAME != '') userNameString = "_$USERNAME";
-            var revisionString = "";
-            if (revision != 0) revisionString = "_r$revision";
-            c.complete(
-                "$MAJOR.$MINOR.$BUILD.$PATCH$revisionString$userNameString");
-            return;
-          });
-        }
-      });
-    });
-    return c.future;
-  }
-
-  String getExecutableSuffix() {
-    if (Platform.operatingSystem == 'windows') {
-      return '.bat';
-    }
-    return '';
-  }
-
-  int getRevisionFromSvnInfo(String info) {
-    if (info == null || info == '') return 0;
-    var lines = info.split("\n");
-    RegExp exp = new RegExp(r"Last Changed Rev: (\d*)");
-    for (var line in lines) {
-      if (exp.hasMatch(line)) {
-        String revisionString = (exp.firstMatch(line).group(1));
-        try {
-          return int.parse(revisionString);
-        } catch(e) {
-          return 0;
-        }
-      }
-    }
-    return 0;
-  }
-
-  Future<int> getRevision() {
-    if (repositoryType == RepositoryType.UNKNOWN) {
-      return new Future.value(0);
-    }
-    var isSvn = repositoryType == RepositoryType.SVN;
-    var command = isSvn ? "svn" : "git";
-    command = "$command${getExecutableSuffix()}";
-    var arguments = isSvn ? ["info"] : ["svn", "info"];
-    // Run the command from the root to get the last changed revision for this
-    // "branch". Since we have both trunk and bleeding edge in the same
-    // repository and since we always build TOT we need this to get the
-    // right version number.
-    Path toolsDirectory = new Path(_versionFileName).directoryPath;
-    Path root = toolsDirectory.join(new Path(".."));
-    var workingDirectory = root.toNativePath();
-    return Process.run(command,
-                       arguments,
-                       workingDirectory: workingDirectory).then((result) {
-      if (result.exitCode != 0) {
-        return 0;
-      }
-      return getRevisionFromSvnInfo(result.stdout);
-    });
-  }
-
-  bool isProductionBuild(String username) {
-    return username == "chrome-bot";
-  }
-
-  String getUserName() {
-    // TODO(ricow): Don't add this on the buildbot.
-    var key = "USER";
-    if (Platform.operatingSystem == 'windows') {
-      key = "USERNAME";
-    }
-    if (!Platform.environment.containsKey(key)) return "";
-    var username = Platform.environment[key];
-    // If this is a production build, i.e., this is something we are shipping,
-    // don't suffix  the version with the username.
-    if (isProductionBuild(username)) return "";
-    return username;
-  }
-
-  RepositoryType get repositoryType {
-    bool isWindows = Platform.operatingSystem == 'windows';
-    bool hasDirectory(path, name) {
-      return new Directory.fromPath(path.append(name)).existsSync();
-    }
-    bool isFileSystemRoot(absolutePath) {
-      if (isWindows) {
-        return "${absolutePath.directoryPath}" == '/';
-      }
-      return "$absolutePath" == '/';
-    }
-
-    var currentPath = new Path(Directory.current.path);
-    while (true) {
-      if (hasDirectory(currentPath, '.svn')) {
-        return RepositoryType.SVN;
-      } else if (hasDirectory(currentPath, '.git')) {
-        return RepositoryType.GIT;
-      }
-      if (isFileSystemRoot(currentPath)) {
-        break;
-      }
-      currentPath = currentPath.directoryPath;
-    }
-    return RepositoryType.UNKNOWN;
-  }
-}
-
-class RepositoryType {
-  static final RepositoryType SVN = const RepositoryType("SVN");
-  static final RepositoryType GIT = const RepositoryType("GIT");
-  static final RepositoryType UNKNOWN = const RepositoryType("UNKNOWN");
-
-  const RepositoryType(String this.name);
-
-  static RepositoryType guessType() {
-    if (new Directory(".svn").existsSync()) return RepositoryType.SVN;
-    if (new Directory(".git").existsSync()) return RepositoryType.GIT;
-    return RepositoryType.UNKNOWN;
-  }
-
-  String toString() => name;
-
-  final String name;
-}
diff --git a/tools/test.dart b/tools/test.dart
index cd43215..3147a36 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -102,18 +102,6 @@
     exit(1);
   }
 
-  var testCaseRecorder;
-  if (recordingPath != null) {
-    testCaseRecorder = new TestCaseRecorder(new Path(recordingPath));
-  }
-
-  var testCaseOutputArchive;
-  if (recordingOutputPath != null) {
-      testCaseOutputArchive = new TestCaseOutputArchive();
-      testCaseOutputArchive.loadFromPath(new Path(recordingOutputPath));
-  }
-
-
   if (!firstConf['append_logs'])  {
     var file = new File(TestUtils.flakyFileName());
     if (file.existsSync()) {
@@ -159,6 +147,12 @@
                                        conf['runtime']);
       serverFutures.add(servers.startServers(conf['local_ip']));
       conf['_servers_'] = servers;
+      if (verbose) {
+        serverFutures.last.then((_) {
+          var commandline = servers.httpServerCommandline();
+          print('Started HttpServers: $commandline');
+        });
+      }
     }
 
     // There should not be more than one InternetExplorerDriver instance
@@ -242,8 +236,10 @@
   eventListener.add(new ExitCodeSetter());
 
   void startProcessQueue() {
-    // Start process queue.
-    new ProcessQueue(maxProcesses,
+    // [firstConf] is needed here, since the ProcessQueue needs to know the
+    // settings of 'noBatch' and 'local_ip'
+    new ProcessQueue(firstConf,
+                     maxProcesses,
                      maxBrowserProcesses,
                      startTime,
                      testSuites,
@@ -251,8 +247,8 @@
                      allTestsFinished,
                      verbose,
                      listTests,
-                     testCaseRecorder,
-                     testCaseOutputArchive);
+                     recordingPath,
+                     recordingOutputPath);
   }
 
   // Start all the HTTP servers required before starting the process queue.
diff --git a/tools/testing/dart/dependency_graph.dart b/tools/testing/dart/dependency_graph.dart
new file mode 100644
index 0000000..1de7b9e
--- /dev/null
+++ b/tools/testing/dart/dependency_graph.dart
@@ -0,0 +1,147 @@
+// 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 dependency_graph;
+
+import 'dart:async';
+import 'utils.dart';
+
+
+/*
+ * [Graph] represents a datastructure for representing an DAG (directed acyclic
+ * graph). Each node in the graph is in a given [NodeState] and can have data
+ * attachted to it with [Node.userData].
+ *
+ * It's interface consists basically of these methods:
+ *   - newNode: Adds a new node to the graph with the given dependencies and
+ *              the given user data. The node is in the [NodeState.Initialized]
+ *              state.
+ *   - changeState: Changes the state of a node.
+ *   - sealGraph: Makes the graph immutable.
+ *   - stateCount: Counts the number of nodes who are in a given [NodeState].
+ *
+ * Users of a [Graph] can listen for events by subscribing to the [events]
+ * stream. Three types of events will be fired (after the graph was modified):
+ *   - NodeAddedEvent: Fired after a node was added ot the graph.
+ *   - StateChangedEvent: Fired after the state of a node changed.
+ *   - GraphSealedEvent: Fired after the graph was marked as immutable/sealed.
+ */
+class Graph {
+  final _nodes = new Set<Node>();
+  final _eventController = new StreamController<GraphEvent>();
+  final _stateCounts = new Map<NodeState, int>();
+  var _eventStream;
+  bool _isSealed = false;
+
+  Graph() {
+    _eventStream = _eventController.stream.asBroadcastStream();
+  }
+
+  Iterable<Node> get nodes => _nodes;
+  Stream<GraphEvent> get events => _eventStream;
+  bool get isSealed => _isSealed;
+
+  int stateCount(NodeState state) {
+    int count = _stateCounts[state];
+    return count == null ? 0 : count;
+  }
+
+  void DumpCounts() {
+    for (var state in _stateCounts.keys) {
+      print("Count[$state] = ${_stateCounts[state]}");
+    }
+  }
+
+  void sealGraph() {
+    assert(!_isSealed);
+    _isSealed = true;
+    _emitEvent(new GraphSealedEvent());
+  }
+
+  Node newNode(Object userData, Iterable<Node> dependencies) {
+    assert(!_isSealed);
+
+    var node = new Node._(userData);
+    _nodes.add(node);
+
+    for (var dependency in dependencies) {
+      dependency._neededFor.add(node);
+      node._dependencies.add(dependency);
+    }
+
+    _emitEvent(new NodeAddedEvent(node));
+
+    _stateCounts.putIfAbsent(node.state, () => 0);
+    _stateCounts[node.state] += 1;
+
+    return node;
+  }
+
+  void changeState(Node node, NodeState newState) {
+    var fromState = node.state;
+    node._state = newState;
+
+    _stateCounts[fromState] -= 1;
+    _stateCounts.putIfAbsent(newState, () => 0);
+    _stateCounts[newState] += 1;
+
+    _emitEvent(new StateChangedEvent(node, fromState, newState));
+  }
+
+  _emitEvent(GraphEvent event) {
+    // We emit events asynchronously so the graph can be build up in small
+    // batches and the events are delivered in small batches.
+    Timer.run(() {
+      _eventController.add(event);
+    });
+  }
+}
+
+class Node extends UniqueObject {
+  final Object _userData;
+  NodeState _state = NodeState.Initialized;
+  Set<Node> _dependencies = new Set<Node>();
+  Set<Node> _neededFor = new Set<Node>();
+
+  Node._(this._userData);
+
+  Object get userData => _userData;
+  NodeState get state => _state;
+  Iterable<Node> get dependencies => _dependencies;
+  Iterable<Node> get neededFor => _neededFor;
+}
+
+class NodeState extends UniqueObject {
+  static NodeState Initialized = new NodeState._("Initialized");
+  static NodeState Waiting  = new NodeState._("Waiting");
+  static NodeState Enqueuing  = new NodeState._("Enqueuing");
+  static NodeState Processing  = new NodeState._("Running");
+  static NodeState Successful  = new NodeState._("Successful");
+  static NodeState Failed  = new NodeState._("Failed");
+  static NodeState UnableToRun  = new NodeState._("UnableToRun");
+
+  final String name;
+
+  NodeState._(this.name);
+
+  String toString() => name;
+}
+
+abstract class GraphEvent {}
+
+class GraphSealedEvent extends GraphEvent {}
+
+class NodeAddedEvent extends GraphEvent {
+  final Node node;
+
+  NodeAddedEvent(this.node);
+}
+
+class StateChangedEvent extends GraphEvent {
+  final Node node;
+  final NodeState from;
+  final NodeState to;
+
+  StateChangedEvent(this.node, this.from, this.to);
+}
diff --git a/tools/testing/dart/record_and_replay.dart b/tools/testing/dart/record_and_replay.dart
index c2ba7c9..60fbedb 100644
--- a/tools/testing/dart/record_and_replay.dart
+++ b/tools/testing/dart/record_and_replay.dart
@@ -16,7 +16,6 @@
  * [
  *   {
  *     'name' : '...',
- *     'configuration' : '...',
  *     'command' : {
  *       'timeout_limit' : 60,
  *       'executable' : '...',
@@ -34,6 +33,18 @@
  * ]
  */
 
+List<String> makePathsRelativeToDart(String cwd, List<String> arguments) {
+  var relativeArguments = [];
+  for (var rawArgument in arguments) {
+    if (rawArgument.startsWith(cwd)) {
+      var relative = new Path(rawArgument).relativeTo(new Path(cwd));
+      relativeArguments.add(relative.toNativePath());
+    } else {
+      relativeArguments.add(rawArgument);
+    }
+  }
+  return relativeArguments;
+}
 
 class TestCaseRecorder {
   Path _outputPath;
@@ -44,27 +55,17 @@
     _cwd  = Directory.current.path;
   }
 
-  void nextTestCase(TestCase testCase) {
-    assert(testCase.commands.length == 1);
-
-    var command = testCase.commands[0];
-    assert(command.environment == null);
-
-    var arguments = [];
-    for (var rawArgument in command.arguments) {
-      if (rawArgument.startsWith(_cwd)) {
-        var relative = new Path(rawArgument).relativeTo(new Path(_cwd));
-        arguments.add(relative.toNativePath());
-      } else {
-        arguments.add(rawArgument);
-      }
-    }
+  void nextCommand(Command command, int timeout) {
+    // Convert arguments from absolute to relative paths (relative to the dart
+    // directory) because the absolute path on the machine where we record
+    // may be different from the absolute path on the machine where we execute
+    // the commands.
+    var arguments = makePathsRelativeToDart(_cwd, command.arguments);
 
     var commandExecution = {
-      'name' : testCase.displayName,
-      'configuration' : testCase.configurationString,
+      'name' : command.displayName,
       'command' : {
-        'timeout_limit' : testCase.timeout,
+        'timeout_limit' : timeout,
         'executable' : command.executable,
         'arguments' : arguments,
       },
@@ -81,36 +82,45 @@
 }
 
 class TestCaseOutputArchive {
-  Map<String, Map> _testCaseOutputRecords;
+  Map<String, Map> _commandOutputRecordings;
+  var _cwd;
+
+  TestCaseOutputArchive() {
+    _cwd  = Directory.current.path;
+  }
 
   void loadFromPath(Path recordingPath) {
     var file = new File.fromPath(recordingPath);
-    var testCases = json.parse(file.readAsStringSync());
-    _testCaseOutputRecords = {};
-    for (var testCase in testCases) {
-      var key = _indexKey(testCase['configuration'], testCase['name']);
-      _testCaseOutputRecords[key] = testCase['command_output'];
+    var commandRecordings = json.parse(file.readAsStringSync());
+    _commandOutputRecordings = {};
+    for (var commandRecording in commandRecordings) {
+      var key = _indexKey(commandRecording['command']['executable'],
+                          commandRecording['command']['arguments'].join(' '));
+      _commandOutputRecordings[key] = commandRecording['command_output'];
     }
   }
 
-  CommandOutput outputOf(TestCase testCase) {
-    var key = _indexKey(testCase.configurationString, testCase.displayName);
-    var command_output = _testCaseOutputRecords[key];
-    if (command_output == null) {
-      print("Sorry, but there is no command output for "
-            "${testCase.displayName}");
+  CommandOutput outputOf(Command command) {
+    // Convert arguments from absolute to relative paths (relative to the dart
+    // directory) because the absolute path on the machine where we record
+    // may be different from the absolute path on the machine where we execute
+    // the commands.
+    var arguments = makePathsRelativeToDart(_cwd, command.arguments);
 
+    var key = _indexKey(command.executable, arguments.join(' '));
+    var command_output = _commandOutputRecordings[key];
+    if (command_output == null) {
+      print("Sorry, but there is no command output for ${command.displayName}"
+            " ($command)");
       exit(42);
     }
 
     double seconds = command_output['duration'];
     var duration = new Duration(seconds: seconds.round(),
                                 milliseconds: (seconds/1000).round());
-    var commandOutput = new CommandOutput.fromCase(
-        testCase,
-        testCase.commands.first,
+    var commandOutput = createCommandOutput(
+        command,
         command_output['exit_code'],
-        false,
         command_output['did_timeout'],
         encodeUtf8(command_output['stdout']),
         encodeUtf8(command_output['stderr']),
@@ -119,8 +129,8 @@
     return commandOutput;
   }
 
-  String _indexKey(String configuration, String name) {
-    return "${configuration}__$name";
+  String _indexKey(String executable, String arguments) {
+    return "${executable}__$arguments";
   }
 }
 
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index 37a0411..f66c485 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -39,18 +39,6 @@
  * Parser of test options.
  */
 class TestOptionsParser {
-  String specialCommandHelp =
-"""
-Special command support. Wraps the command line in
-a special command. The special command should contain
-an '@' character which will be replaced by the normal
-command executable.
-
-For example if the normal command line that will be executed
-is 'dart file.dart' and you specify special command
-'python -u valgrind.py @ suffix' the final command will be
-'python -u valgrind.py dart suffix file.dart'""";
-
   /**
    * Creates a test options parser initialized with the known options.
    */
@@ -225,19 +213,6 @@
               false,
               'bool'),
           new _TestOptionSpecification(
-              'valgrind',
-              'Run tests through valgrind',
-              ['--valgrind'],
-              [],
-              false,
-              'bool'),
-          new _TestOptionSpecification(
-              'special-command',
-              specialCommandHelp,
-              ['--special-command'],
-              [],
-              ''),
-          new _TestOptionSpecification(
               'time',
               'Print timing information after running tests',
               ['--time'],
@@ -582,16 +557,6 @@
     if (configuration['mode'] == 'all') {
       configuration['mode'] = 'debug,release';
     }
-    if (configuration['valgrind']) {
-      // TODO(ager): Get rid of this when there is only one checkout and
-      // we don't have to special case for the runtime checkout.
-      File valgrindFile = new File('runtime/tools/valgrind.py');
-      if (!valgrindFile.existsSync()) {
-        valgrindFile = new File('../runtime/tools/valgrind.py');
-      }
-      String valgrind = valgrindFile.fullPathSync();
-      configuration['special-command'] = 'python -u $valgrind @';
-    }
 
     // Use verbose progress indication for verbose output unless buildbot
     // progress indication is requested.
diff --git a/tools/testing/dart/test_progress.dart b/tools/testing/dart/test_progress.dart
index 20da10f..d0b5aef 100644
--- a/tools/testing/dart/test_progress.dart
+++ b/tools/testing/dart/test_progress.dart
@@ -77,9 +77,10 @@
     expected.write('$expectation ');
   }
   output.add(expected.toString());
-  output.add('Actual: ${test.lastCommandOutput.result}');
+  output.add('Actual: ${test.result}');
   if (!test.lastCommandOutput.hasTimedOut && test.info != null) {
-    if (test.lastCommandOutput.incomplete && !test.info.hasCompileError) {
+    if (test.commandOutputs.length != test.commands.length
+        && !test.info.hasCompileError) {
       output.add('Unexpected compile-time error.');
     } else {
       if (test.info.hasCompileError) {
@@ -130,7 +131,7 @@
     var command = test.commands[i];
     var commandOutput = test.commandOutputs[command];
     output.add('');
-    output.add('Command[$i]: $command');
+    output.add('Command[${command.displayName}]: $command');
     if (commandOutput != null) {
       output.add('Took ${commandOutput.time}');
     } else {
@@ -161,7 +162,6 @@
 
 class EventListener {
   void testAdded() { }
-  void start(TestCase test) { }
   void done(TestCase test) { }
   void allTestsKnown() { }
   void allDone() { }
@@ -169,7 +169,7 @@
 
 class ExitCodeSetter extends EventListener {
   void done(TestCase test) {
-    if (test.lastCommandOutput.unexpectedOutput) {
+    if (test.unexpectedOutput) {
       io.exitCode = 1;
     }
   }
@@ -177,7 +177,7 @@
 
 class FlakyLogWriter extends EventListener {
   void done(TestCase test) {
-    if (test.isFlaky && test.lastCommandOutput.result != PASS) {
+    if (test.isFlaky && test.result != PASS) {
       var buf = new StringBuffer();
       for (var l in _buildFailureOutput(test)) {
         buf.write("$l\n");
@@ -203,31 +203,41 @@
 }
 
 class TimingPrinter extends EventListener {
-  List<CommandOutput> _commandOutputs = <CommandOutput>[];
+  final _command2testCases = new Map<Command, List<TestCase>>();
+  final _commandOutputs = new Set<CommandOutput>();
   DateTime _startTime;
 
   TimingPrinter(this._startTime);
 
   void done(TestCase testCase) {
     for (var commandOutput in testCase.commandOutputs.values) {
+      var command = commandOutput.command;
       _commandOutputs.add(commandOutput);
+      _command2testCases.putIfAbsent(command, () => <TestCase>[]);
+      _command2testCases[command].add(testCase);
     }
   }
 
   void allDone() {
     Duration d = (new DateTime.now()).difference(_startTime);
     print('\n--- Total time: ${_timeString(d)} ---');
-    _commandOutputs.sort((a, b) {
+    var outputs = _commandOutputs.toList();
+    outputs.sort((a, b) {
       return b.time.inMilliseconds - a.time.inMilliseconds;
     });
-    for (int i = 0; i < 20 && i < _commandOutputs.length; i++) {
-      var commandOutput = _commandOutputs[i];
+    for (int i = 0; i < 20 && i < outputs.length; i++) {
+      var commandOutput = outputs[i];
       var command = commandOutput.command;
-      var testCase = commandOutput.testCase;
+      var testCases = _command2testCases[command];
       var duration = commandOutput.time;
-      var configuration = testCase.configurationString;
-      print('${commandOutput.time} - $configuration'
-            ' - ${testCase.displayName} (${command.displayName})');
+
+      var testCasesDescription = testCases.map((testCase) {
+        return "${testCase.configurationString}/${testCase.displayName}";
+      }).join(', ');
+
+      print('${commandOutput.time} - '
+            '${command.displayName} - '
+            '$testCasesDescription');
     }
   }
 }
@@ -237,7 +247,7 @@
   var _failureSummary = <String>[];
 
   void done(TestCase test) {
-    if (test.lastCommandOutput.unexpectedOutput) {
+    if (test.unexpectedOutput) {
       _printFailureOutput(test);
     }
   }
@@ -248,7 +258,7 @@
 
 
   void _printFailureOutput(TestCase test) {
-    String status = '${test.displayName}: ${test.lastCommandOutput.result}';
+    String status = '${test.displayName}: ${test.result}';
     List<String> configs =
         statusToConfigs.putIfAbsent(status, () => <String>[]);
     configs.add(test.configurationString);
@@ -348,7 +358,7 @@
 class LineProgressIndicator extends EventListener {
   void done(TestCase test) {
     var status = 'pass';
-    if (test.lastCommandOutput.unexpectedOutput) {
+    if (test.unexpectedOutput) {
       status = 'fail';
     }
     print('Done ${test.configurationString} ${test.displayName}: $status');
@@ -365,7 +375,7 @@
                      [this._formatter = const Formatter()]);
 
   void done(TestCase test) {
-    if (test.lastCommandOutput.unexpectedOutput) {
+    if (test.unexpectedOutput) {
       _failedTests++;
       var lines = _buildFailureOutput(test, _formatter);
       for (var line in lines) {
@@ -400,12 +410,8 @@
 
   void testAdded() { _foundTests++; }
 
-  void start(TestCase test) {
-    _printStartProgress(test);
-  }
-
   void done(TestCase test) {
-    if (test.lastCommandOutput.unexpectedOutput) {
+    if (test.unexpectedOutput) {
       _failedTests++;
     } else {
       _passedTests++;
@@ -417,7 +423,6 @@
     _allTestsKnown = true;
   }
 
-  void _printStartProgress(TestCase test) {}
   void _printDoneProgress(TestCase test) {}
 
   int _completedTests() => _passedTests + _failedTests;
@@ -441,7 +446,6 @@
     print('');
   }
 
-  void _printStartProgress(TestCase test) => _printProgress();
   void _printDoneProgress(TestCase test) => _printProgress();
 
   void _printProgress();
@@ -473,13 +477,9 @@
   VerboseProgressIndicator(DateTime startTime)
       : super(startTime);
 
-  void _printStartProgress(TestCase test) {
-    print('Starting ${test.configurationString} ${test.displayName}...');
-  }
-
   void _printDoneProgress(TestCase test) {
     var status = 'pass';
-    if (test.lastCommandOutput.unexpectedOutput) {
+    if (test.unexpectedOutput) {
       status = 'fail';
     }
     print('Done ${test.configurationString} ${test.displayName}: $status');
@@ -495,14 +495,14 @@
 
   void done(TestCase test) {
     super.done(test);
-    if (test.lastCommandOutput.unexpectedOutput) {
+    if (test.unexpectedOutput) {
       _failureSummary.addAll(_buildFailureOutput(test));
     }
   }
 
   void _printDoneProgress(TestCase test) {
     var status = 'pass';
-    if (test.lastCommandOutput.unexpectedOutput) {
+    if (test.unexpectedOutput) {
       status = 'fail';
     }
     var percent = ((_completedTests() / _foundTests) * 100).toInt().toString();
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index e4a51d9..1012082 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -17,6 +17,8 @@
 // CommandOutput.exitCode in subclasses of CommandOutput.
 import "dart:io" as io;
 import "dart:isolate";
+import "dart:math" as math;
+import 'dependency_graph.dart' as dgraph;
 import "browser_controller.dart";
 import "http_server.dart" as http_server;
 import "status_file_parser.dart";
@@ -25,10 +27,8 @@
 import "utils.dart";
 import 'record_and_replay.dart';
 
-const int NO_TIMEOUT = 0;
-const int SLOW_TIMEOUT_MULTIPLIER = 4;
-
 const int CRASHING_BROWSER_EXITCODE = -10;
+const int SLOW_TIMEOUT_MULTIPLIER = 4;
 
 typedef void TestCaseEvent(TestCase testCase);
 typedef void ExitCodeEvent(int exitCode);
@@ -41,77 +41,33 @@
            'HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY'];
 
 
-/**
- * [areByteArraysEqual] compares a range of bytes from [buffer1] with a
- * range of bytes from [buffer2].
- *
- * Returns [true] if the [count] bytes in [buffer1] (starting at
- * [offset1]) match the [count] bytes in [buffer2] (starting at
- * [offset2]).
- * Otherwise [false] is returned.
- */
-bool areByteArraysEqual(List<int> buffer1, int offset1,
-                        List<int> buffer2, int offset2,
-                        int count) {
-  if ((offset1 + count) > buffer1.length ||
-      (offset2 + count) > buffer2.length) {
-    return false;
-  }
-
-  for (var i = 0; i < count; i++) {
-    if (buffer1[offset1 + i] != buffer2[offset2 + i]) {
-      return false;
-    }
-  }
-  return true;
-}
-
-/**
- * [findBytes] searches for [pattern] in [data] beginning at [startPos].
- *
- * Returns [true] if [pattern] was found in [data].
- * Otherwise [false] is returned.
- */
-int findBytes(List<int> data, List<int> pattern, [int startPos=0]) {
-  // TODO(kustermann): Use one of the fast string-matching algorithms!
-  for (int i=startPos; i < (data.length-pattern.length); i++) {
-    bool found = true;
-    for (int j=0; j<pattern.length; j++) {
-      if (data[i+j] != pattern[j]) {
-        found = false;
-      }
-    }
-    if (found) {
-      return i;
-    }
-  }
-  return -1;
-}
-
-
 /** A command executed as a step in a test case. */
 class Command {
-  static int nextHashCode = 0;
-  final int hashCode = nextHashCode++;
-  operator ==(other) => super == (other);
-
   /** Path to the executable of this command. */
   String executable;
 
-  /** Command line arguments to the executable. */
-  List<String> arguments;
-
-  /** Environment for the command */
-  Map<String,String> environment;
-
   /** The actual command line that will be executed. */
   String commandLine;
 
   /** A descriptive name for this command. */
   String displayName;
 
-  Command(this.displayName, this.executable,
-          this.arguments, [this.environment = null]) {
+  /** Command line arguments to the executable. */
+  List<String> arguments;
+
+  /** Environment for the command */
+  Map<String, String> environmentOverrides;
+
+  /** Number of times this command can be retried */
+  int get numRetries => 0;
+
+  // We compute the Command.hashCode lazily and cache it here, since it might
+  // be expensive to compute (and hashCode is called often).
+  int _cachedHashCode;
+
+  Command._(this.displayName, this.executable,
+            this.arguments, String configurationDir,
+            [this.environmentOverrides = null]) {
     if (io.Platform.operatingSystem == 'windows') {
       // Windows can't handle the first command if it is a .bat file or the like
       // with the slashes going the other direction.
@@ -122,6 +78,76 @@
     quotedArguments.add(escapeCommandLineArgument(executable));
     quotedArguments.addAll(arguments.map(escapeCommandLineArgument));
     commandLine = quotedArguments.join(' ');
+
+    if (configurationDir != null) {
+      if (environmentOverrides == null) {
+        environmentOverrides = new Map<String, String>();
+      }
+      environmentOverrides['DART_CONFIGURATION'] = configurationDir;
+    }
+  }
+
+  int get hashCode {
+    if (_cachedHashCode == null) {
+      var builder = new HashCodeBuilder();
+      _buildHashCode(builder);
+      _cachedHashCode = builder.value;
+    }
+    return _cachedHashCode;
+  }
+
+  operator ==(other) {
+    if (other is Command) {
+      return identical(this, other) || _equal(other as Command);
+    }
+    return false;
+  }
+
+  void _buildHashCode(HashCodeBuilder builder) {
+    builder.add(executable);
+    builder.add(commandLine);
+    builder.add(displayName);
+    for (var object in arguments) builder.add(object);
+    if (environmentOverrides != null) {
+      for (var key in environmentOverrides.keys) {
+        builder.add(key);
+        builder.add(environmentOverrides[key]);
+      }
+    }
+  }
+
+  bool _equal(Command other) {
+    if (hashCode != other.hashCode ||
+        executable != other.executable ||
+        commandLine != other.commandLine ||
+        displayName != other.displayName ||
+        arguments.length != other.arguments.length) {
+      return false;
+    }
+
+    if ((environmentOverrides != other.environmentOverrides) &&
+        (environmentOverrides == null || other.environmentOverrides == null)) {
+      return false;
+    }
+
+    if (environmentOverrides != null &&
+        environmentOverrides.length != other.environmentOverrides.length) {
+      return false;
+    }
+
+    for (var i = 0; i < arguments.length; i++) {
+      if (arguments[i] != other.arguments[i]) return false;
+    }
+
+    if (environmentOverrides != null) {
+      for (var key in environmentOverrides.keys) {
+        if (!other.environmentOverrides.containsKey(key) ||
+            environmentOverrides[key] != other.environmentOverrides[key]) {
+          return false;
+        }
+      }
+    }
+    return true;
   }
 
   String toString() => commandLine;
@@ -136,13 +162,18 @@
   bool _neverSkipCompilation;
   List<Uri> _bootstrapDependencies;
 
-  CompilationCommand(String displayName,
-                     this._outputFile,
-                     this._neverSkipCompilation,
-                     this._bootstrapDependencies,
-                     String executable,
-                     List<String> arguments)
-      : super(displayName, executable, arguments);
+  CompilationCommand._(String displayName,
+                       this._outputFile,
+                       this._neverSkipCompilation,
+                       List<String> bootstrapDependencies,
+                       String executable,
+                       List<String> arguments,
+                       String configurationDir)
+      : super._(displayName, executable, arguments, configurationDir) {
+    // We sort here, so we can do a fast hashCode/operator==
+    _bootstrapDependencies = new List.from(bootstrapDependencies);
+    _bootstrapDependencies.sort();
+  }
 
   Future<bool> get outputIsUpToDate {
     if (_neverSkipCompilation) return new Future.value(false);
@@ -184,6 +215,29 @@
       return false;
     });
   }
+
+  void _buildHashCode(HashCodeBuilder builder) {
+    super._buildHashCode(builder);
+    builder.add(_outputFile);
+    builder.add(_neverSkipCompilation);
+    for (var uri in _bootstrapDependencies) builder.add(uri);
+  }
+
+  bool _equal(Command other) {
+    if (other is CompilationCommand &&
+        super._equal(other) &&
+        _outputFile == other._outputFile &&
+        _neverSkipCompilation == other._neverSkipCompilation &&
+        _bootstrapDependencies.length == other._bootstrapDependencies.length) {
+      for (var i = 0; i < _bootstrapDependencies.length; i++) {
+        if (_bootstrapDependencies[i] != other._bootstrapDependencies[i]) {
+          return false;
+        }
+      }
+      return true;
+    }
+    return false;
+  }
 }
 
 class ContentShellCommand extends Command {
@@ -195,25 +249,25 @@
    */
   io.Path expectedOutputPath;
 
-  ContentShellCommand(String executable,
-                      String htmlFile,
-                      List<String> options,
-                      List<String> dartFlags,
-                      io.Path this.expectedOutputPath)
-      : super("content_shell",
-              executable,
-              _getArguments(options, htmlFile),
-              _getEnvironment(dartFlags));
+  ContentShellCommand._(String executable,
+                        String htmlFile,
+                        List<String> options,
+                        List<String> dartFlags,
+                        io.Path this.expectedOutputPath,
+                        String configurationDir)
+      : super._("content_shell",
+               executable,
+               _getArguments(options, htmlFile),
+               configurationDir,
+               _getEnvironment(dartFlags));
 
   static Map _getEnvironment(List<String> dartFlags) {
     var needDartFlags = dartFlags != null && dartFlags.length > 0;
 
     var env = null;
     if (needDartFlags) {
-      env = new Map.from(io.Platform.environment);
-      if (needDartFlags) {
-        env['DART_FLAGS'] = dartFlags.join(" ");
-      }
+      env = new Map<String, String>();
+      env['DART_FLAGS'] = dartFlags.join(" ");
     }
 
     return env;
@@ -228,8 +282,186 @@
   io.Path get expectedOutputFile => expectedOutputPath;
   bool get isPixelTest => (expectedOutputFile != null &&
                            expectedOutputFile.filename.endsWith(".png"));
+
+  void _buildHashCode(HashCodeBuilder builder) {
+    super._buildHashCode(builder);
+    builder.add(expectedOutputPath.toString());
+  }
+
+  bool _equal(Command other) {
+    return
+        other is ContentShellCommand &&
+        super._equal(other) &&
+        expectedOutputPath.toString() == other.expectedOutputPath.toString();
+  }
+
+  // FIXME(kustermann): Remove this once we're stable
+  int get numRetries => 2;
 }
 
+class BrowserTestCommand extends Command {
+  final String browser;
+  final String url;
+
+  BrowserTestCommand._(String _browser,
+                       this.url,
+                       String executable,
+                       List<String> arguments,
+                       String configurationDir)
+      : super._(_browser, executable, arguments, configurationDir),
+        browser = _browser;
+
+  void _buildHashCode(HashCodeBuilder builder) {
+    super._buildHashCode(builder);
+    builder.add(browser);
+    builder.add(url);
+  }
+
+  bool _equal(Command other) {
+    return
+        other is BrowserTestCommand &&
+        super._equal(other) &&
+        browser == other.browser &&
+        url == other.url;
+  }
+
+  // FIXME(kustermann): Remove this once we're stable
+  int get numRetries => 2;
+}
+
+class SeleniumTestCommand extends Command {
+  final String browser;
+  final String url;
+
+  SeleniumTestCommand._(String _browser,
+                        this.url,
+                        String executable,
+                        List<String> arguments,
+                        String configurationDir)
+      : super._(_browser, executable, arguments, configurationDir),
+        browser = _browser;
+
+  void _buildHashCode(HashCodeBuilder builder) {
+    super._buildHashCode(builder);
+    builder.add(browser);
+    builder.add(url);
+  }
+
+  bool _equal(Command other) {
+    return
+        other is SeleniumTestCommand &&
+        super._equal(other) &&
+        browser == other.browser &&
+        url == other.url;
+  }
+
+  // FIXME(kustermann): Remove this once we're stable
+  int get numRetries => 2;
+}
+
+class AnalysisCommand extends Command {
+  final String flavor;
+
+  AnalysisCommand._(this.flavor,
+                    String displayName,
+                    String executable,
+                    List<String> arguments,
+                    String configurationDir)
+      : super._(displayName, executable, arguments, configurationDir);
+
+  void _buildHashCode(HashCodeBuilder builder) {
+    super._buildHashCode(builder);
+    builder.add(flavor);
+  }
+
+  bool _equal(Command other) {
+    return
+        other is AnalysisCommand &&
+        super._equal(other) &&
+        flavor == other.flavor;
+  }
+}
+
+class CommandBuilder {
+  static final instance = new CommandBuilder._();
+
+  final _cachedCommands = new Map<Command, Command>();
+
+  CommandBuilder._();
+
+  ContentShellCommand getContentShellCommand(String executable,
+                                             String htmlFile,
+                                             List<String> options,
+                                             List<String> dartFlags,
+                                             io.Path expectedOutputPath,
+                                             String configurationDir) {
+    ContentShellCommand command = new ContentShellCommand._(
+        executable, htmlFile, options, dartFlags, expectedOutputPath,
+        configurationDir);
+    return _getUniqueCommand(command);
+  }
+
+  BrowserTestCommand getBrowserTestCommand(String browser,
+                                           String url,
+                                           String executable,
+                                           List<String> arguments,
+                                           String configurationDir) {
+    var command = new BrowserTestCommand._(
+        browser, url, executable, arguments, configurationDir);
+    return _getUniqueCommand(command);
+  }
+
+  SeleniumTestCommand getSeleniumTestCommand(String browser,
+                                             String url,
+                                             String executable,
+                                             List<String> arguments,
+                                             String configurationDir) {
+    var command = new SeleniumTestCommand._(
+        browser, url, executable, arguments, configurationDir);
+    return _getUniqueCommand(command);
+  }
+
+  CompilationCommand getCompilationCommand(String displayName,
+                                           outputFile,
+                                           neverSkipCompilation,
+                                           List<String> bootstrapDependencies,
+                                           String executable,
+                                           List<String> arguments,
+                                           String configurationDir) {
+    var command =
+        new CompilationCommand._(displayName, outputFile, neverSkipCompilation,
+                                 bootstrapDependencies, executable, arguments,
+                                 configurationDir);
+    return _getUniqueCommand(command);
+  }
+
+  AnalysisCommand getAnalysisCommand(
+      String displayName, executable, arguments, String configurationDir,
+      {String flavor: 'dartanalyzer'}) {
+    var command = new AnalysisCommand._(
+        flavor, displayName, executable, arguments, configurationDir);
+    return _getUniqueCommand(command);
+  }
+
+  Command getCommand(String displayName, executable, arguments,
+                     String configurationDir, [environment = null]) {
+    var command = new Command._(displayName, executable, arguments,
+                                configurationDir, environment);
+    return _getUniqueCommand(command);
+  }
+
+  Command _getUniqueCommand(Command command) {
+    // All Command classes have hashCode/operator==, so we check if this command
+    // has already been build, if so we return the cached one, otherwise we
+    // store the one given as [command] argument.
+    var cachedCommand = _cachedCommands[command];
+    if (cachedCommand != null) {
+      return cachedCommand;
+    }
+    _cachedCommands[command] = command;
+    return command;
+  }
+}
 
 /**
  * TestCase contains all the information needed to run a test and evaluate
@@ -248,7 +480,7 @@
  * The TestCase has a callback function, [completedHandler], that is run when
  * the test is completed.
  */
-class TestCase {
+class TestCase extends UniqueObject {
   /**
    * A list of commands to execute. Most test cases have a single command.
    * Dart2js tests have two commands, one to compile the source and another
@@ -262,69 +494,25 @@
   String displayName;
   bool isNegative;
   Set<String> expectedOutcomes;
-  TestCaseEvent completedHandler;
   TestInformation info;
 
   TestCase(this.displayName,
            this.commands,
            this.configuration,
-           this.completedHandler,
            this.expectedOutcomes,
            {this.isNegative: false,
             this.info: null}) {
     if (!isNegative) {
       this.isNegative = displayName.contains("negative_test");
     }
-
-    // Special command handling. If a special command is specified
-    // we have to completely rewrite the command that we are using.
-    // We generate a new command-line that is the special command where we
-    // replace '@' with the original command executable, and generate
-    // a command formed like the following
-    // Let PREFIX be what is before the @.
-    // Let SUFFIX be what is after the @.
-    // Let EXECUTABLE be the existing executable of the command.
-    // Let ARGUMENTS be the existing arguments to the existing executable.
-    // The new command will be:
-    // PREFIX EXECUTABLE SUFFIX ARGUMENTS
-    var specialCommand = configuration['special-command'];
-    if (!specialCommand.isEmpty) {
-      if (!specialCommand.contains('@')) {
-        throw new FormatException("special-command must contain a '@' char");
-      }
-      var specialCommandSplit = specialCommand.split('@');
-      var prefix = specialCommandSplit[0].trim();
-      var suffix = specialCommandSplit[1].trim();
-      List<Command> newCommands = [];
-      for (Command c in commands) {
-        // If we don't have a new prefix we will use the existing executable.
-        var newExecutablePath = c.executable;;
-        var newArguments = [];
-
-        if (prefix.length > 0) {
-          var prefixSplit = prefix.split(' ');
-          newExecutablePath = prefixSplit[0];
-          for (int i = 1; i < prefixSplit.length; i++) {
-            var current = prefixSplit[i];
-            if (!current.isEmpty) newArguments.add(current);
-          }
-          newArguments.add(c.executable);
-        }
-
-        // Add any suffixes to the arguments of the original executable.
-        var suffixSplit = suffix.split(' ');
-        suffixSplit.forEach((e) {
-          if (!e.isEmpty) newArguments.add(e);
-        });
-
-        newArguments.addAll(c.arguments);
-        final newCommand = new Command(newExecutablePath, newArguments);
-        newCommands.add(newCommand);
-      }
-      commands = newCommands;
-    }
   }
 
+  bool get unexpectedOutput {
+    return !expectedOutcomes.contains(lastCommandOutput.result(this));
+  }
+
+  String get result => lastCommandOutput.result(this);
+
   CommandOutput get lastCommandOutput {
     if (commandOutputs.length == 0) {
       throw new Exception("CommandOutputs is empty, maybe no command was run? ("
@@ -351,15 +539,10 @@
     return "$compiler-$runtime$checked ${mode}_$arch";
   }
 
-  List<String> get batchRunnerArguments => ['-batch'];
   List<String> get batchTestArguments => commands.last.arguments;
 
   bool get usesWebDriver => TestUtils.usesWebDriver(configuration['runtime']);
 
-  bool get usesBrowserController => configuration['use_browser_controller'];
-
-  void completed() { completedHandler(this); }
-
   bool get isFlaky {
       if (expectedOutcomes.contains(SKIP)) {
         return false;
@@ -370,6 +553,11 @@
            ..remove(SLOW);
       return flags.contains(PASS) && flags.length > 1;
   }
+
+  bool get isFinished {
+    return !lastCommandOutput.successfull ||
+           commands.length == commandOutputs.length;
+  }
 }
 
 
@@ -379,61 +567,17 @@
  * If the compilation command fails, then the rest of the test is not run.
  */
 class BrowserTestCase extends TestCase {
-  /**
-   * Indicates the number of potential retries remaining, to compensate for
-   * flaky browser tests.
-   */
-  int numRetries;
 
-  /**
-   * True if this test is dependent on another test completing before it can
-   * star (for example, we might need to depend on some other test completing
-   * first).
-   */
-  bool waitingForOtherTest;
-
-  /**
-   * The set of test cases that wish to be notified when this test has
-   * completed.
-   */
-  List<BrowserTestCase> observers;
-
-  BrowserTestCase(displayName, commands, configuration, completedHandler,
-                  expectedOutcomes, info, isNegative, this._testingUrl,
-                  [this.waitingForOtherTest = false])
-    : super(displayName, commands, configuration, completedHandler,
-        expectedOutcomes, isNegative: isNegative, info: info) {
-    numRetries = 2; // Allow two retries to compensate for flaky browser tests.
-    observers = [];
-  }
-
-  List<String> get _lastArguments => commands.last.arguments;
-
-  List<String> get batchRunnerArguments => [_lastArguments[0], '--batch'];
-
-  List<String> get batchTestArguments => _lastArguments.sublist(1);
+  BrowserTestCase(displayName, commands, configuration,
+                  expectedOutcomes, info, isNegative, this._testingUrl)
+    : super(displayName, commands, configuration,
+            expectedOutcomes, isNegative: isNegative, info: info);
 
   String _testingUrl;
 
-  /** Add a test case to listen for when this current test has completed. */
-  void addObserver(BrowserTestCase testCase) {
-    observers.add(testCase);
-  }
-
-  /**
-   * Notify all of the test cases that are dependent on this one that they can
-   * proceed.
-   */
-  void notifyObservers() {
-    for (BrowserTestCase testCase in observers) {
-      testCase.waitingForOtherTest = false;
-    }
-  }
-
   String get testingUrl => _testingUrl;
 }
 
-
 /**
  * CommandOutput records the output of a completed command: the process's exit
  * code, the standard output and standard error, whether the process timed out,
@@ -441,43 +585,21 @@
  * [TestCase] this is the output of.
  */
 abstract class CommandOutput {
-  factory CommandOutput.fromCase(TestCase testCase,
-                                 Command command,
-                                 int exitCode,
-                                 bool incomplete,
-                                 bool timedOut,
-                                 List<int> stdout,
-                                 List<int> stderr,
-                                 Duration time,
-                                 bool compilationSkipped) {
-    return new CommandOutputImpl.fromCase(testCase,
-                                          command,
-                                          exitCode,
-                                          incomplete,
-                                          timedOut,
-                                          stdout,
-                                          stderr,
-                                          time,
-                                          compilationSkipped);
-  }
-
   Command get command;
 
-  TestCase testCase;
-
-  bool get incomplete;
-
-  String get result;
-
-  bool get unexpectedOutput;
+  String result(TestCase testCase);
 
   bool get hasCrashed;
 
   bool get hasTimedOut;
 
-  bool get didFail;
+  bool didFail(testcase);
 
-  bool requestRetry;
+  bool hasFailed(TestCase testCase);
+
+  bool get canRunDependendCommands;
+
+  bool get successfull; // otherwise we might to retry running
 
   Duration get time;
 
@@ -492,16 +614,11 @@
   bool get compilationSkipped;
 }
 
-class CommandOutputImpl implements CommandOutput {
+class CommandOutputImpl extends UniqueObject implements CommandOutput {
   Command command;
-  TestCase testCase;
   int exitCode;
 
-  /// Records if all commands were run, true if they weren't.
-  final bool incomplete;
-
   bool timedOut;
-  bool failed = false;
   List<int> stdout;
   List<int> stderr;
   Duration time;
@@ -514,80 +631,19 @@
    */
   bool alreadyPrintedWarning = false;
 
-  /**
-   * Set to true if we encounter a condition in the output that indicates we
-   * need to rerun this test.
-   */
-  bool requestRetry = false;
-
-  // Don't call this constructor, call CommandOutput.fromCase() to
-  // get a new TestOutput instance.
-  CommandOutputImpl(TestCase this.testCase,
-                    Command this.command,
+  // TODO(kustermann): Remove testCase from this class.
+  CommandOutputImpl(Command this.command,
                     int this.exitCode,
-                    bool this.incomplete,
                     bool this.timedOut,
                     List<int> this.stdout,
                     List<int> this.stderr,
                     Duration this.time,
                     bool this.compilationSkipped) {
-    testCase.commandOutputs[command] = this;
     diagnostics = [];
   }
-  factory CommandOutputImpl.fromCase(TestCase testCase,
-                                     Command command,
-                                     int exitCode,
-                                     bool incomplete,
-                                     bool timedOut,
-                                     List<int> stdout,
-                                     List<int> stderr,
-                                     Duration time,
-                                     bool compilationSkipped) {
-    if (testCase.usesBrowserController) {
-      return new HTMLBrowserCommandOutputImpl(testCase,
-                                              command,
-                                              exitCode,
-                                              incomplete,
-                                              timedOut,
-                                              stdout,
-                                              stderr,
-                                              time,
-                                              compilationSkipped);
-    } else if (testCase is BrowserTestCase) {
-      return new BrowserCommandOutputImpl(testCase,
-                                          command,
-                                          exitCode,
-                                          incomplete,
-                                          timedOut,
-                                          stdout,
-                                          stderr,
-                                          time,
-                                          compilationSkipped);
-    } else if (testCase.configuration['analyzer']) {
-      return new AnalysisCommandOutputImpl(testCase,
-                                           command,
-                                           exitCode,
-                                           timedOut,
-                                           stdout,
-                                           stderr,
-                                           time,
-                                           compilationSkipped);
-    }
-    return new CommandOutputImpl(testCase,
-                                 command,
-                                 exitCode,
-                                 incomplete,
-                                 timedOut,
-                                 stdout,
-                                 stderr,
-                                 time,
-                                 compilationSkipped);
-  }
 
-  String get result =>
-      hasCrashed ? CRASH : (hasTimedOut ? TIMEOUT : (hasFailed ? FAIL : PASS));
-
-  bool get unexpectedOutput => !testCase.expectedOutcomes.contains(result);
+  String result(TestCase testCase) => hasCrashed ? CRASH :
+      (hasTimedOut ? TIMEOUT : (hasFailed(testCase) ? FAIL : PASS));
 
   bool get hasCrashed {
     // The Java dartc runner and dart2js exits with code 253 in case
@@ -617,42 +673,66 @@
 
   bool get hasTimedOut => timedOut;
 
-  bool get didFail {
+  bool didFail(TestCase testCase) {
     return (exitCode != 0 && !hasCrashed);
   }
 
+  bool get canRunDependendCommands {
+    // FIXME(kustermann): We may need to change this
+    return !hasTimedOut && exitCode == 0;
+  }
+
+  bool get successfull {
+    // FIXME(kustermann): We may need to change this
+    return !hasTimedOut && exitCode == 0;
+  }
+
   // Reverse result of a negative test.
-  bool get hasFailed {
-    // Always fail if a runtime-error is expected and compilation failed.
-    if (testCase.info != null && testCase.info.hasRuntimeError && incomplete) {
-      return true;
+  bool hasFailed(TestCase testCase) {
+    // FIXME(kustermann): this is a hack, remove it
+    bool isCompilationCommand = testCase.commands.first == command
+        && testCase.commands.length > 1;
+    if (isCompilationCommand &&
+        testCase.info != null && testCase.info.hasRuntimeError) {
+      return exitCode != 0;
     }
-    return testCase.isNegative ? !didFail : didFail;
+    return testCase.isNegative ? !didFail(testCase) : didFail(testCase);
   }
 }
 
 class BrowserCommandOutputImpl extends CommandOutputImpl {
+  bool _failedBecauseOfMissingXDisplay;
+
   BrowserCommandOutputImpl(
-      testCase,
       command,
       exitCode,
-      incomplete,
       timedOut,
       stdout,
       stderr,
       time,
       compilationSkipped) :
-    super(testCase,
-          command,
+    super(command,
           exitCode,
-          incomplete,
           timedOut,
           stdout,
           stderr,
           time,
-          compilationSkipped);
+          compilationSkipped) {
+    _failedBecauseOfMissingXDisplay = _didFailBecauseOfMissingXDisplay();
+    if (_failedBecauseOfMissingXDisplay) {
+      DebugLogger.warning("Warning: Test failure because of missing XDisplay");
+      // If we get the X server error, or DRT crashes with a core dump, retry
+      // the test.
+    }
+  }
 
-  bool get didFail {
+  bool get canRunDependendCommands {
+    // We cannot rely on the exit code of content_shell as a method to determine
+    // if we were successful or not.
+    return super.canRunDependendCommands && !didFail(null);
+  }
+
+  bool didFail(TestCase _) {
     if (_failedBecauseOfMissingXDisplay) {
       return true;
     }
@@ -664,7 +744,7 @@
     return _browserTestFailure;
   }
 
-  bool get _failedBecauseOfMissingXDisplay {
+  bool _didFailBecauseOfMissingXDisplay() {
     // Browser case:
     // If the browser test failed, it may have been because content shell
     // and the virtual framebuffer X server didn't hook up, or it crashed with
@@ -676,12 +756,6 @@
       // This seems to happen quite frequently, we need to figure out why.
       if (line.contains('Gtk-WARNING **: cannot open display') ||
           line.contains('Failed to run command. return code=1')) {
-        // If we get the X server error, or DRT crashes with a core dump, retry
-        // the test.
-        if ((testCase as BrowserTestCase).numRetries > 0) {
-          requestRetry = true;
-        }
-        print("Warning: Test failure because of missing XDisplay");
         return true;
       }
     }
@@ -705,7 +779,6 @@
      * On a layout tests, the DRT output is directly compared with the
      * content of the expected output.
      */
-    var stdout = testCase.commandOutputs[command].stdout;
     var file = new io.File.fromPath(command.expectedOutputFile);
     if (file.existsSync()) {
       var bytesContentLength = "Content-Length:".codeUnits;
@@ -754,16 +827,9 @@
         case 'PASS':
           if (has_content_type) {
             if (exitCode != 0) {
-              print("Warning: All tests passed, but exitCode != 0 "
-                    "(${testCase.displayName})");
+              print("Warning: All tests passed, but exitCode != 0 ($this)");
             }
-            if (testCase.configuration['runtime'] == 'drt') {
-              // TODO(kustermann/ricow): Issue: 7563
-              // We should eventually get rid of this hack.
-              return false;
-            } else {
-              return (exitCode != 0 && !hasCrashed);
-            }
+            return (exitCode != 0 && !hasCrashed);
           }
           break;
       }
@@ -774,19 +840,15 @@
 
 class HTMLBrowserCommandOutputImpl extends BrowserCommandOutputImpl {
  HTMLBrowserCommandOutputImpl(
-      testCase,
       command,
       exitCode,
-      incomplete,
       timedOut,
       stdout,
       stderr,
       time,
       compilationSkipped) :
-    super(testCase,
-          command,
+    super(command,
           exitCode,
-          incomplete,
           timedOut,
           stdout,
           stderr,
@@ -815,33 +877,31 @@
   bool alreadyComputed = false;
   bool failResult;
 
-  AnalysisCommandOutputImpl(testCase,
-                            command,
+  // TODO(kustermann): Remove testCase from this class
+  AnalysisCommandOutputImpl(command,
                             exitCode,
                             timedOut,
                             stdout,
                             stderr,
                             time,
                             compilationSkipped) :
-    super(testCase,
-          command,
+    super(command,
           exitCode,
-          false,
           timedOut,
           stdout,
           stderr,
           time,
           compilationSkipped);
 
-  bool get didFail {
+  bool didFail(TestCase testCase) {
     if (!alreadyComputed) {
-      failResult = _didFail();
+      failResult = _didFail(testCase);
       alreadyComputed = true;
     }
     return failResult;
   }
 
-  bool _didFail() {
+  bool _didFail(TestCase testCase) {
     if (hasCrashed) return false;
 
     List<String> errors = [];
@@ -859,14 +919,16 @@
       }
       // OK to Skip error output that doesn't match the machine format
     }
+    // FIXME(kustermann): This is wrong, we should give the expectations
+    // to Command
     if (testCase.info != null
         && testCase.info.optionsFromFile['isMultitest']) {
-      return _didMultitestFail(errors, staticWarnings);
+      return _didMultitestFail(testCase, errors, staticWarnings);
     }
-    return _didStandardTestFail(errors, staticWarnings);
+    return _didStandardTestFail(testCase, errors, staticWarnings);
   }
 
-  bool _didMultitestFail(List errors, List staticWarnings) {
+  bool _didMultitestFail(TestCase testCase, List errors, List staticWarnings) {
     Set<String> outcome = testCase.info.multitestOutcome;
     if (outcome == null) throw "outcome must not be null";
     if (outcome.contains('compile-time error') && errors.length > 0) {
@@ -881,7 +943,7 @@
     return false;
   }
 
-  bool _didStandardTestFail(List errors, List staticWarnings) {
+  bool _didStandardTestFail(TestCase testCase, List errors, List staticWarnings) {
     bool hasFatalTypeErrors = false;
     int numStaticTypeAnnotations = 0;
     int numCompileTimeAnnotations = 0;
@@ -903,7 +965,11 @@
     }
 
     if (errors.length == 0) {
-      if (!hasFatalTypeErrors && exitCode != 0) {
+      // If the analyzer has warnings it will exit 1.
+      // We should reconsider how we do this once we have landed a dart
+      // only version of the analyzer for stable use (as in not run in batch
+      // mode).
+      if (!hasFatalTypeErrors && exitCode != 0 && staticWarnings.length == 0) {
         diagnostics.add("EXIT CODE MISMATCH: Expected error message:");
         diagnostics.add("  command[0]:${testCase.commands[0]}");
         diagnostics.add("  exitCode:${exitCode}");
@@ -978,6 +1044,36 @@
 }
 
 
+CommandOutput createCommandOutput(Command command,
+                                  int exitCode,
+                                  bool timedOut,
+                                  List<int> stdout,
+                                  List<int> stderr,
+                                  Duration time,
+                                  bool compilationSkipped) {
+  if (command is ContentShellCommand) {
+    return new BrowserCommandOutputImpl(
+        command, exitCode, timedOut, stdout, stderr,
+        time, compilationSkipped);
+  } else if (command is BrowserTestCommand) {
+    return new HTMLBrowserCommandOutputImpl(
+        command, exitCode, timedOut, stdout, stderr,
+        time, compilationSkipped);
+  } else if (command is SeleniumTestCommand) {
+    return new BrowserCommandOutputImpl(
+        command, exitCode, timedOut, stdout, stderr,
+        time, compilationSkipped);
+  } else if (command is AnalysisCommand) {
+    return new AnalysisCommandOutputImpl(
+        command, exitCode, timedOut, stdout, stderr,
+        time, compilationSkipped);
+  }
+  return new CommandOutputImpl(
+      command, exitCode, timedOut, stdout, stderr,
+      time, compilationSkipped);
+}
+
+
 /** Modifies the --timeout=XX parameter passed to run_selenium.py */
 List<String> _modifySeleniumTimeout(List<String> arguments, int timeout) {
   return arguments.map((argument) {
@@ -1001,8 +1097,8 @@
  * be garbage collected as soon as it is done.
  */
 class RunningProcess {
-  TestCase testCase;
   Command command;
+  int timeout;
   bool timedOut = false;
   DateTime startTime;
   Timer timeoutTimer;
@@ -1011,13 +1107,9 @@
   bool compilationSkipped = false;
   Completer<CommandOutput> completer;
 
-  RunningProcess(TestCase this.testCase, Command this.command);
+  RunningProcess(Command this.command, this.timeout);
 
-  Future<CommandOutput> start() {
-    if (testCase.expectedOutcomes.contains(SKIP)) {
-      throw "testCase.expectedOutcomes must not contain 'SKIP'.";
-    }
-
+  Future<CommandOutput> run() {
     completer = new Completer<CommandOutput>();
     startTime = new DateTime.now();
     _runCommand();
@@ -1032,7 +1124,7 @@
       } else {
         var processEnvironment = _createProcessEnvironment();
         var commandArguments = _modifySeleniumTimeout(command.arguments,
-                                                      testCase.timeout);
+                                                      timeout);
         Future processFuture =
             io.Process.start(command.executable,
                              commandArguments,
@@ -1049,7 +1141,7 @@
           process.exitCode.then(_commandComplete);
           _drainStream(process.stdout, stdout);
           _drainStream(process.stderr, stderr);
-          timeoutTimer = new Timer(new Duration(seconds: testCase.timeout),
+          timeoutTimer = new Timer(new Duration(seconds: timeout),
                                    timeoutHandler);
         }).catchError((e) {
           // TODO(floitsch): should we try to report the stacktrace?
@@ -1072,12 +1164,9 @@
   }
 
   CommandOutput _createCommandOutput(Command command, int exitCode) {
-    var incomplete = command != testCase.commands.last;
-    var commandOutput = new CommandOutput.fromCase(
-        testCase,
+    var commandOutput = createCommandOutput(
         command,
         exitCode,
-        incomplete,
         timedOut,
         stdout,
         stderr,
@@ -1091,12 +1180,13 @@
   }
 
   Map<String, String> _createProcessEnvironment() {
-    var baseEnvironment = command.environment != null ?
-        command.environment : io.Platform.environment;
-    var environment = new Map<String, String>.from(baseEnvironment);
-    environment['DART_CONFIGURATION'] =
-        TestUtils.configurationDir(testCase.configuration);
+    var environment = io.Platform.environment;
 
+    if (command.environmentOverrides != null) {
+      for (var key in command.environmentOverrides.keys) {
+        environment[key] = command.environmentOverrides[key];
+      }
+    }
     for (var excludedEnvironmentVariable in EXCLUDED_ENVIRONMENT_VARIABLES) {
       environment.remove(excludedEnvironmentVariable);
     }
@@ -1106,73 +1196,100 @@
 }
 
 class BatchRunnerProcess {
+  static bool isWindows = io.Platform.operatingSystem == 'windows';
+
+  final batchRunnerTypes = {
+      'selenium' : {
+          'run_executable' : 'python',
+          'run_arguments' : ['tools/testing/run_selenium.py', '--batch'],
+          'terminate_command' : ['--terminate'],
+      },
+      'dartanalyzer' : {
+        'run_executable' :
+           isWindows ?
+             'sdk\\bin\\dartanalyzer_developer.bat'
+              : 'sdk/bin/dartanalyzer_developer',
+        'run_arguments' : ['--batch'],
+        'terminate_command' : null,
+      },
+      'dart2analyzer' : {
+        // This is a unix shell script, no windows equivalent available
+        'run_executable' : 'editor/tools/analyzer_experimental',
+        'run_arguments' : ['--batch'],
+        'terminate_command' : null,
+    },
+  };
+
+  Completer<CommandOutput> _completer;
   Command _command;
-  String _executable;
-  List<String> _batchArguments;
+  List<String> _arguments;
+  String _runnerType;
 
   io.Process _process;
+  Map _processEnvironmentOverrides;
   Completer _stdoutCompleter;
   Completer _stderrCompleter;
   StreamSubscription<String> _stdoutSubscription;
   StreamSubscription<String> _stderrSubscription;
   Function _processExitHandler;
 
-  TestCase _currentTest;
+  bool _currentlyRunning = false;
   List<int> _testStdout;
   List<int> _testStderr;
   String _status;
   DateTime _startTime;
   Timer _timer;
-  bool _isWebDriver;
 
-  BatchRunnerProcess(TestCase testCase) {
-    _command = testCase.commands.last;
-    _executable = testCase.commands.last.executable;
-    _batchArguments = testCase.batchRunnerArguments;
-    _isWebDriver = testCase.usesWebDriver;
-  }
+  BatchRunnerProcess();
 
-  bool get active => _currentTest != null;
+  Future<CommandOutput> runCommand(String runnerType, Command command,
+                                   int timeout, List<String> arguments) {
+    assert(_completer == null);
+    assert(!_currentlyRunning);
 
-  void startTest(TestCase testCase) {
-    if (_currentTest != null) throw "_currentTest must be null.";
-    _currentTest = testCase;
-    _command = testCase.commands.last;
+    _completer = new Completer<CommandOutput>();
+    bool sameRunnerType = _runnerType == runnerType &&
+        _dictEquals(_processEnvironmentOverrides, command.environmentOverrides);
+    _runnerType = runnerType;
+    _currentlyRunning = true;
+    _command = command;
+    _arguments = arguments;
+
+    _processEnvironmentOverrides = command.environmentOverrides;
+
     if (_process == null) {
       // Start process if not yet started.
-      _executable = testCase.commands.last.executable;
       _startProcess(() {
-        doStartTest(testCase);
+        doStartTest(command, timeout);
       });
-    } else if (testCase.commands.last.executable != _executable) {
-      // Restart this runner with the right executable for this test
-      // if needed.
-      _executable = testCase.commands.last.executable;
-      _batchArguments = testCase.batchRunnerArguments;
+    } else if (!sameRunnerType) {
+      // Restart this runner with the right executable for this test if needed.
       _processExitHandler = (_) {
         _startProcess(() {
-          doStartTest(testCase);
+          doStartTest(command, timeout);
         });
       };
       _process.kill();
     } else {
-      doStartTest(testCase);
+      doStartTest(command, timeout);
     }
+    return _completer.future;
   }
 
   Future terminate() {
     if (_process == null) return new Future.value(true);
-    Completer completer = new Completer();
+    Completer terminateCompleter = new Completer();
     Timer killTimer;
     _processExitHandler = (_) {
       if (killTimer != null) killTimer.cancel();
-      completer.complete(true);
+      terminateCompleter.complete(true);
     };
-    if (_isWebDriver) {
+    var shutdownCommand = batchRunnerTypes[_runnerType]['terminate_command'];
+    if (shutdownCommand != null && !shutdownCommand.isEmpty) {
       // Use a graceful shutdown so our Selenium script can close
       // the open browser processes. On Windows, signals do not exist
       // and a kill is a hard kill.
-      _process.stdin.writeln('--terminate');
+      _process.stdin.writeln(shutdownCommand.join(' '));
 
       // In case the run_selenium process didn't close, kill it after 30s
       killTimer = new Timer(new Duration(seconds: 30), _process.kill);
@@ -1180,26 +1297,20 @@
       _process.kill();
     }
 
-    return completer.future;
+    return terminateCompleter.future;
   }
 
-  void doStartTest(TestCase testCase) {
+  void doStartTest(Command command, int timeout) {
     _startTime = new DateTime.now();
     _testStdout = [];
     _testStderr = [];
     _status = null;
     _stdoutCompleter = new Completer();
     _stderrCompleter = new Completer();
-    _timer = new Timer(new Duration(seconds: testCase.timeout),
+    _timer = new Timer(new Duration(seconds: timeout),
                        _timeoutHandler);
 
-    if (testCase.commands.last.environment != null) {
-      print("Warning: command.environment != null, but we don't support custom "
-            "environments for batch runner tests!");
-    }
-
-    var line = _createArgumentsLine(testCase.batchTestArguments,
-                                    testCase.timeout);
+    var line = _createArgumentsLine(_arguments, timeout);
     _process.stdin.write(line);
     _stdoutSubscription.resume();
     _stderrSubscription.resume();
@@ -1213,30 +1324,29 @@
   }
 
   void _reportResult() {
-    if (!active) return;
+    if (!_currentlyRunning) return;
     // _status == '>>> TEST {PASS, FAIL, OK, CRASH, FAIL, TIMEOUT}'
 
     var outcome = _status.split(" ")[2];
     var exitCode = 0;
     if (outcome == "CRASH") exitCode = CRASHING_BROWSER_EXITCODE;
     if (outcome == "FAIL" || outcome == "TIMEOUT") exitCode = 1;
-    new CommandOutput.fromCase(_currentTest,
-                               _command,
-                               exitCode,
-                               false,
-                               (outcome == "TIMEOUT"),
-                               _testStdout,
-                               _testStderr,
-                               new DateTime.now().difference(_startTime),
-                               false);
-    var test = _currentTest;
-    _currentTest = null;
-    test.completed();
+    var output = createCommandOutput(_command,
+                        exitCode,
+                        (outcome == "TIMEOUT"),
+                        _testStdout,
+                        _testStderr,
+                        new DateTime.now().difference(_startTime),
+                        false);
+    assert(_completer != null);
+    _completer.complete(output);
+    _completer = null;
+    _currentlyRunning = false;
   }
 
   ExitCodeEvent makeExitHandler(String status) {
     void handler(int exitCode) {
-      if (active) {
+      if (_currentlyRunning) {
         if (_timer != null) _timer.cancel();
         _status = status;
         _stdoutSubscription.cancel();
@@ -1255,7 +1365,17 @@
   }
 
   _startProcess(callback) {
-    Future processFuture = io.Process.start(_executable, _batchArguments);
+    var executable = batchRunnerTypes[_runnerType]['run_executable'];
+    var arguments = batchRunnerTypes[_runnerType]['run_arguments'];
+    var environment = new Map.from(io.Platform.environment);
+    if (_processEnvironmentOverrides != null) {
+      for (var key in _processEnvironmentOverrides.keys) {
+        environment[key] = _processEnvironmentOverrides[key];
+      }
+    }
+    Future processFuture = io.Process.start(executable,
+                                            arguments,
+                                            environment: environment);
     processFuture.then((io.Process p) {
       _process = p;
 
@@ -1312,7 +1432,7 @@
     }).catchError((e) {
       // TODO(floitsch): should we try to report the stacktrace?
       print("Process error:");
-      print("  Command: $_executable ${_batchArguments.join(' ')}");
+      print("  Command: $executable ${arguments.join(' ')} ($_arguments)");
       print("  Error: $e");
       // If there is an error starting a batch process, chances are that
       // it will always fail. So rather than re-trying a 1000+ times, we
@@ -1321,342 +1441,416 @@
       return true;
     });
   }
+
+  bool _dictEquals(Map a, Map b) {
+    if (a == null) return b == null;
+    if (b == null) return false;
+    for (var key in a.keys) {
+      if (a[key] != b[key]) return false;
+    }
+    return true;
+  }
 }
 
+
 /**
- * ProcessQueue is the master control class, responsible for running all
- * the tests in all the TestSuites that have been registered.  It includes
- * a rate-limited queue to run a limited number of tests in parallel,
- * a ProgressIndicator which prints output when tests are started and
- * and completed, and a summary report when all tests are completed,
- * and counters to determine when all of the tests in all of the test suites
- * have completed.
+ * [TestCaseEnqueuer] takes a list of TestSuites, generates TestCases and
+ * builds a dependency graph of all commands in every TestSuite.
  *
- * Because multiple configurations may be run on each test suite, the
- * ProcessQueue contains a cache in which a test suite may record information
- * about its list of tests, and may retrieve that information when it is called
- * upon to enqueue its tests again.
+ * It will maintain three helper data structures
+ *  - command2node: A mapping from a [Command] to a node in the dependency graph
+ *  - command2testCases: A mapping from [Command] to all TestCases that it is
+ *    part of.
+ *  - remainingTestCases: A set of TestCases that were enqueued but are not
+ *    finished
+ *
+ * [Command] and it's subclasses all have hashCode/operator== methods defined
+ * on them, so we can safely use them as keys in Map/Set objects.
  */
-class ProcessQueue {
-  int _numProcesses = 0;
-  int _maxProcesses;
-  int _numBrowserProcesses = 0;
-  int _maxBrowserProcesses;
-  int _numFailedTests = 0;
-  bool _allTestsWereEnqueued = false;
+class TestCaseEnqueuer {
+  final dgraph.Graph graph;
+  final Function _onTestCaseAdded;
 
-  // Support for recording and replaying test commands.
-  TestCaseRecorder _testCaseRecorder;
-  TestCaseOutputArchive _testCaseOutputArchive;
+  final command2node = new Map<Command, dgraph.Node>();
+  final command2testCases = new Map<Command, List<TestCase>>();
+  final remainingTestCases = new Set<TestCase>();
 
-  /** The number of tests we allow to actually fail before we stop retrying. */
-  int _MAX_FAILED_NO_RETRY = 4;
-  bool _verbose;
-  bool _listTests;
-  Function _allDone;
-  Queue<TestCase> _tests;
-  List<EventListener> _eventListener;
+  TestCaseEnqueuer(this.graph, this._onTestCaseAdded);
 
-  // For dartc/selenium batch processing we keep a list of batch processes.
-  Map<String, List<BatchRunnerProcess>> _batchProcesses;
+  void enqueueTestSuites(List<TestSuite> testSuites) {
+    void newTest(TestCase testCase) {
+      remainingTestCases.add(testCase);
 
-  // Cache information about test cases per test suite. For multiple
-  // configurations there is no need to repeatedly search the file
-  // system, generate tests, and search test files for options.
-  Map<String, List<TestInformation>> _testCache;
+      var lastNode;
+      for (var command in testCase.commands) {
+        // Make exactly *one* node in the dependency graph for every command.
+        // This ensures that we never have two commands c1 and c2 in the graph
+        // with "c1 == c2".
+        var node = command2node[command];
+        if (node == null) {
+          var requiredNodes = (lastNode != null) ? [lastNode] : [];
+          node = graph.newNode(command, requiredNodes);
+          command2node[command] = node;
+          command2testCases[command] = <TestCase>[];
+        }
+        // Keep mapping from command to all testCases that refer to it
+        command2testCases[command].add(testCase);
 
-  Map<String, BrowserTestRunner> _browserTestRunners;
-
-  /**
-   * String indicating the browser used to run the tests. Empty if no browser
-   * used.
-   */
-  String browserUsed = '';
-
-  /**
-   * Process running the selenium server .jar (only used for Safari and Opera
-   * tests.)
-   */
-  io.Process _seleniumServer = null;
-
-  /** True if we are in the process of starting the server. */
-  bool _startingServer = false;
-
-  /** True if we find that there is already a selenium jar running. */
-  bool _seleniumAlreadyRunning = false;
-
-  ProcessQueue(this._maxProcesses,
-               this._maxBrowserProcesses,
-               DateTime startTime,
-               testSuites,
-               this._eventListener,
-               this._allDone,
-               [bool verbose = false,
-                bool listTests = false,
-                this._testCaseRecorder,
-                this._testCaseOutputArchive])
-      : _verbose = verbose,
-        _listTests = listTests,
-        _tests = new Queue<TestCase>(),
-        _batchProcesses = new Map<String, List<BatchRunnerProcess>>(),
-        _testCache = new Map<String, List<TestInformation>>(),
-        _browserTestRunners = new Map<String, BrowserTestRunner>() {
-    _runTests(testSuites);
-  }
-
-  /**
-   * Perform any cleanup needed once all tests in a TestSuite have completed
-   * and notify our progress indicator that we are done.
-   */
-  void _cleanupAndMarkDone() {
-    _allDone();
-    if (browserUsed != '' && _seleniumServer != null) {
-      _seleniumServer.kill();
-    }
-    eventAllTestsDone();
-  }
-
-  void _checkDone() {
-    if (_allTestsWereEnqueued && _tests.isEmpty && _numProcesses == 0) {
-      _terminateBatchRunners().then((_) {
-        _terminateBrowserRunners().then((_) => _cleanupAndMarkDone());
-      });
-    }
-  }
-
-  void _runTests(List<TestSuite> testSuites) {
-    var newTest;
-    var allTestsKnown;
-
-    if (_testCaseRecorder != null) {
-      // Mode: recording.
-      newTest = _testCaseRecorder.nextTestCase;
-      allTestsKnown = () {
-        // We don't call any event*() methods, so test_progress.dart will not be
-        // notified (that's fine, since we're not running any tests).
-        _testCaseRecorder.finish();
-        _allDone();
-      };
-    } else {
-      if (_testCaseOutputArchive != null) {
-        // Mode: replaying.
-        newTest = (TestCase testCase) {
-          // We're doing this asynchronously to emulate the normal behaviour.
-          eventTestAdded(testCase);
-          Timer.run(() {
-            var output = _testCaseOutputArchive.outputOf(testCase);
-            testCase.completed();
-            eventFinishedTestCase(testCase);
-          });
-        };
-        allTestsKnown = () {
-          // If we're replaying commands, we need to call [_cleanupAndMarkDone]
-          // manually. We're putting it at the end of the event queue to make
-          // sure all the previous events were fired.
-          Timer.run(() => _cleanupAndMarkDone());
-        };
-      } else {
-        // Mode: none (we're not recording/replaying).
-        newTest = (TestCase testCase) {
-          _tests.add(testCase);
-          eventTestAdded(testCase);
-          _runTest(testCase);
-        };
-        allTestsKnown = _checkDone;
+        lastNode = node;
       }
+      _onTestCaseAdded(testCase);
     }
 
-    // FIXME: For some reason we cannot call this method on all test suites
-    // in parallel.
-    // If we do, not all tests get enqueued (if --arch=all was specified,
-    // we don't get twice the number of tests [tested on -rvm -cnone])
-    // Issue: 7927
+    // Cache information about test cases per test suite. For multiple
+    // configurations there is no need to repeatedly search the file
+    // system, generate tests, and search test files for options.
+    var testCache = new Map<String, List<TestInformation>>();
+
     Iterator<TestSuite> iterator = testSuites.iterator;
     void enqueueNextSuite() {
       if (!iterator.moveNext()) {
-        _allTestsWereEnqueued = true;
-        allTestsKnown();
-        eventAllTestsKnown();
+        // We're finished with building the dependency graph.
+        graph.sealGraph();
       } else {
-        iterator.current.forEachTest(newTest, _testCache, enqueueNextSuite);
+        iterator.current.forEachTest(newTest, testCache, enqueueNextSuite);
       }
     }
     enqueueNextSuite();
   }
+}
 
-  /**
-   * True if we are using a browser + platform combination that needs the
-   * Selenium server jar.
-   */
-  bool get _needsSelenium => (io.Platform.operatingSystem == 'macos' &&
-      browserUsed == 'safari') || browserUsed == 'opera';
 
-  /** True if the Selenium Server is ready to be used. */
-  bool get _isSeleniumAvailable => _seleniumServer != null ||
-      _seleniumAlreadyRunning;
+/*
+ * [CommandEnqueuer] will
+ *  - change node.state to NodeState.Enqueuing as soon as all dependencies have
+ *    a state of NodeState.Successful
+ *  - change node.state to NodeState.UnableToRun if one or more dependencies
+ *    have a state of NodeState.Failed/NodeState.UnableToRun.
+ */
+class CommandEnqueuer {
+  static final INIT_STATES = [dgraph.NodeState.Initialized,
+                              dgraph.NodeState.Waiting];
+  static final FINISHED_STATES = [dgraph.NodeState.Successful,
+                                  dgraph.NodeState.Failed,
+                                  dgraph.NodeState.UnableToRun];
+  final dgraph.Graph _graph;
 
-  /**
-   * Restart all the processes that have been waiting/stopped for the server to
-   * start up. If we just call this once we end up with a single-"threaded" run.
-   */
-  void resumeTesting() {
-    for (int i = 0; i < _maxProcesses; i++) _tryRunTest();
-  }
+  CommandEnqueuer(this._graph) {
+    var eventCondition = _graph.events.where;
 
-  /** Start the Selenium Server jar, if appropriate for this platform. */
-  void _ensureSeleniumServerRunning() {
-    if (!_isSeleniumAvailable && !_startingServer) {
-      _startingServer = true;
+    eventCondition((e) => e is dgraph.NodeAddedEvent).listen((event) {
+      dgraph.Node node = event.node;
+      _changeNodeStateIfNecessary(node);
+    });
 
-      // Check to see if the jar was already running before the program started.
-      String cmd = 'ps';
-      var arg = ['aux'];
-      if (io.Platform.operatingSystem == 'windows') {
-        cmd = 'tasklist';
-        arg.add('/v');
-      }
-
-      Future processFuture = io.Process.start(cmd, arg);
-      processFuture.then((io.Process p) {
-        // Drain stderr to not leak resources.
-        p.stderr.listen((_) {});
-        final Stream<String> stdoutStringStream =
-            p.stdout.transform(new io.StringDecoder())
-                    .transform(new io.LineTransformer());
-        stdoutStringStream.listen((String line) {
-          var regexp = new RegExp(r".*selenium-server-standalone.*");
-          if (regexp.hasMatch(line)) {
-            _seleniumAlreadyRunning = true;
-            resumeTesting();
-          }
-          if (!_isSeleniumAvailable) {
-            _startSeleniumServer();
-          }
-        });
-      }).catchError((e) {
-      // TODO(floitsch): should we try to report the stacktrace?
-        print("Error starting process:");
-        print("  Command: $cmd ${arg.join(' ')}");
-        print("  Error: $e");
-        // TODO(ahe): How to report this as a test failure?
-        io.exit(1);
-        return true;
-      });
-    }
-  }
-
-  void _runTest(TestCase test) {
-    if (test.usesWebDriver) {
-      browserUsed = test.configuration['runtime'];
-      if (_needsSelenium) _ensureSeleniumServerRunning();
-    }
-    _tryRunTest();
-  }
-
-  /**
-   * Monitor the output of the Selenium server, to know when we are ready to
-   * begin running tests.
-   * source: Output(Stream) from the Java server.
-   */
-  void seleniumServerHandler(String line) {
-    if (new RegExp(r".*Started.*Server.*").hasMatch(line) ||
-        new RegExp(r"Exception.*Selenium is already running.*").hasMatch(
-        line)) {
-      resumeTesting();
-    }
-  }
-
-  /**
-   * For browser tests using Safari or Opera, we need to use the Selenium 1.0
-   * Java server.
-   */
-  void _startSeleniumServer() {
-    // Get the absolute path to the Selenium jar.
-    String filePath = TestUtils.testScriptPath;
-    String pathSep = io.Platform.pathSeparator;
-    int index = filePath.lastIndexOf(pathSep);
-    filePath = '${filePath.substring(0, index)}${pathSep}testing${pathSep}';
-    new io.Directory(filePath).list().listen((io.FileSystemEntity fse) {
-      if (fse is io.File) {
-        String file = fse.path;
-        if (new RegExp(r"selenium-server-standalone-.*\.jar").hasMatch(file)
-            && _seleniumServer == null) {
-          Future processFuture = io.Process.start('java', ['-jar', file]);
-          processFuture.then((io.Process server) {
-            _seleniumServer = server;
-            // Heads up: there seems to an obscure data race of some form in
-            // the VM between launching the server process and launching the
-            // test tasks that disappears when you read IO (which is
-            // convenient, since that is our condition for knowing that the
-            // server is ready).
-            Stream<String> stdoutStringStream =
-                _seleniumServer.stdout.transform(new io.StringDecoder())
-                .transform(new io.LineTransformer());
-            Stream<String> stderrStringStream =
-                _seleniumServer.stderr.transform(new io.StringDecoder())
-                .transform(new io.LineTransformer());
-            stdoutStringStream.listen(seleniumServerHandler);
-            stderrStringStream.listen(seleniumServerHandler);
-          }).catchError((e) {
-            // TODO(floitsch): should we try to report the stacktrace?
-            print("Process error:");
-            print("  Command: java -jar $file");
-            print("  Error: $e");
-            // TODO(ahe): How to report this as a test failure?
-            io.exit(1);
-            return true;
-          });
+    eventCondition((e) => e is dgraph.StateChangedEvent).listen((event) {
+      if (event.from == dgraph.NodeState.Processing) {
+        assert(FINISHED_STATES.contains(event.to));
+        for (var dependendNode in event.node.neededFor) {
+          _changeNodeStateIfNecessary(dependendNode);
         }
       }
     });
   }
 
-  Future _terminateBatchRunners() {
-    var futures = new List();
-    for (var runners in _batchProcesses.values) {
-      for (var runner in runners) {
-        futures.add(runner.terminate());
+  // Called when either a new node was added or if one of it's dependencies
+  // changed it's state.
+  void _changeNodeStateIfNecessary(dgraph.Node node) {
+    assert(INIT_STATES.contains(node.state));
+    bool allDependenciesFinished =
+        node.dependencies.every((node) => FINISHED_STATES.contains(node.state));
+
+    var newState = dgraph.NodeState.Waiting;
+    if (allDependenciesFinished) {
+      bool allDependenciesSuccessful = node.dependencies.every(
+          (dep) => dep.state == dgraph.NodeState.Successful);
+
+      if (allDependenciesSuccessful) {
+        newState = dgraph.NodeState.Enqueuing;
+      } else {
+        newState = dgraph.NodeState.UnableToRun;
       }
     }
-    // Change to Future.wait when updating binaries.
-    return Future.wait(futures);
-  }
-
-  Future _terminateBrowserRunners() {
-    var futures = [];
-    for (BrowserTestRunner runner in _browserTestRunners.values) {
-      futures.add(runner.terminate());
+    if (node.state != newState) {
+      _graph.changeState(node, newState);
     }
-    return Future.wait(futures);
+  }
+}
+
+/*
+ * [CommandQueue] will listen for nodes entering the NodeState.ENQUEUING state,
+ * queue them up and run them. While nodes are processed they will be in the
+ * NodeState.PROCESSING state. After running a command, the node will change
+ * to a state of NodeState.Successfull or NodeState.Failed.
+ *
+ * It provides a synchronous stream [completedCommands] which provides the
+ * [CommandOutputs] for the finished commands.
+ *
+ * It provides a [done] future, which will complete once there are no more
+ * nodes left in the states Initialized/Waiting/Enqueing/Processing
+ * and the [executor] has cleaned up it's resources.
+ */
+class CommandQueue {
+  final dgraph.Graph graph;
+  final CommandExecutor executor;
+  final TestCaseEnqueuer enqueuer;
+
+  final Queue<Command> _runQueue = new Queue<Command>();
+  final _commandOutputStream =  new StreamController<CommandOutput>(sync: true);
+  final _completer =  new Completer();
+
+  int _numProcesses = 0;
+  int _maxProcesses;
+  int _numBrowserProcesses = 0;
+  int _maxBrowserProcesses;
+  bool _finishing = false;
+  bool _verbose = false;
+
+  CommandQueue(this.graph, this.enqueuer, this.executor,
+               this._maxProcesses, this._maxBrowserProcesses, this._verbose) {
+    var eventCondition = graph.events.where;
+    eventCondition((event) => event is dgraph.StateChangedEvent)
+        .listen((event) {
+          if (event.to == dgraph.NodeState.Enqueuing) {
+            assert(event.from == dgraph.NodeState.Initialized ||
+                   event.from == dgraph.NodeState.Waiting);
+            graph.changeState(event.node, dgraph.NodeState.Processing);
+            var command = event.node.userData;
+            if (event.node.dependencies.length > 0) {
+              _runQueue.addFirst(command);
+            } else {
+              _runQueue.add(command);
+            }
+            Timer.run(() => _tryRunNextCommand());
+          }
+    });
+    // We're finished if the graph is sealed and all nodes are in a finished
+    // state (Successfull, Failed or UnableToRun).
+    // So we're calling '_checkDone()' to check whether that condition is met
+    // and we can cleanup.
+    graph.events.listen((dgraph.GraphEvent event) {
+      if (event is dgraph.GraphSealedEvent) {
+        _checkDone();
+      } else if (event is dgraph.StateChangedEvent) {
+        if (event.to == dgraph.NodeState.UnableToRun) {
+          _checkDone();
+        }
+      }
+    });
   }
 
-  BatchRunnerProcess _getBatchRunner(TestCase test) {
+  Stream<CommandOutput> get completedCommands => _commandOutputStream.stream;
+
+  Future get done => _completer.future;
+
+  void _tryRunNextCommand() {
+    _checkDone();
+
+    if (_numProcesses < _maxProcesses && !_runQueue.isEmpty) {
+      Command command = _runQueue.removeFirst();
+      var isBrowserCommand =
+          command is SeleniumTestCommand ||
+          command is BrowserTestCommand;
+
+      if (isBrowserCommand && _numBrowserProcesses == _maxBrowserProcesses) {
+        // If there is no free browser runner, put it back into the queue.
+        _runQueue.add(command);
+        // Don't lose a process.
+        new Timer(new Duration(milliseconds: 100), _tryRunNextCommand);
+        return;
+      }
+
+      _numProcesses++;
+      if (isBrowserCommand) _numBrowserProcesses++;
+
+      var node = enqueuer.command2node[command];
+      Iterable<TestCase> testCases = enqueuer.command2testCases[command];
+      // If a command is part of many TestCases we set the timeout to be
+      // the maximum over all [TestCase.timeout]s. At some point, we might
+      // eliminate [TestCase.timeout] completely and move it to [Command].
+      int timeout = testCases.map((TestCase test) => test.timeout)
+          .fold(0, math.max);
+
+      if (_verbose) {
+        print('Running "${command.displayName}" command: $command');
+      }
+
+      executor.runCommand(node, command, timeout).then((CommandOutput output) {
+        assert(command == output.command);
+
+        _commandOutputStream.add(output);
+        if (output.canRunDependendCommands) {
+          graph.changeState(node, dgraph.NodeState.Successful);
+        } else {
+          graph.changeState(node, dgraph.NodeState.Failed);
+        }
+
+        _numProcesses--;
+        if (isBrowserCommand) _numBrowserProcesses--;
+
+        // Don't loose a process
+        Timer.run(() => _tryRunNextCommand());
+      });
+    }
+  }
+
+  void _checkDone() {
+    if (!_finishing &&
+        _runQueue.isEmpty &&
+        _numProcesses == 0 &&
+        graph.isSealed &&
+        graph.stateCount(dgraph.NodeState.Initialized) == 0 &&
+        graph.stateCount(dgraph.NodeState.Waiting) == 0 &&
+        graph.stateCount(dgraph.NodeState.Enqueuing) == 0 &&
+        graph.stateCount(dgraph.NodeState.Processing) == 0) {
+      _finishing = true;
+      executor.cleanup().then((_) {
+        _completer.complete();
+        _commandOutputStream.close();
+      });
+    }
+  }
+}
+
+
+/*
+ * [CommandExecutor] is responsible for executing commands. It will make sure
+ * that the the following two constraints are satisfied
+ *  - [:numberOfProcessesUsed <= maxProcesses:]
+ *  - [:numberOfBrowserProcessesUsed <= maxBrowserProcesses:]
+ *
+ * It provides a [runCommand] method which will complete with a
+ * [CommandOutput] object.
+ *
+ * It provides a [cleanup] method to free all the allocated resources.
+ */
+abstract class CommandExecutor {
+  Future cleanup();
+  // TODO(kustermann): The [timeout] parameter should be a property of Command
+  Future<CommandOutput> runCommand(
+      dgraph.Node node, Command command, int timeout);
+}
+
+class CommandExecutorImpl implements CommandExecutor {
+  final Map globalConfiguration;
+  final int maxProcesses;
+  final int maxBrowserProcesses;
+
+  // For dartc/selenium batch processing we keep a list of batch processes.
+  final _batchProcesses = new Map<String, List<BatchRunnerProcess>>();
+  // For browser tests we keepa [BrowserTestRunner]
+  final _browserTestRunners = new Map<String, BrowserTestRunner>();
+
+  bool _finishing = false;
+
+  CommandExecutorImpl(
+      this.globalConfiguration, this.maxProcesses, this.maxBrowserProcesses);
+
+  Future cleanup() {
+    assert(!_finishing);
+    _finishing = true;
+
+    Future _terminateBatchRunners() {
+      var futures = [];
+      for (var runners in _batchProcesses.values) {
+        futures.addAll(runners.map((runner) => runner.terminate()));
+      }
+      return Future.wait(futures);
+    }
+
+    Future _terminateBrowserRunners() {
+      var futures =
+          _browserTestRunners.values.map((runner) => runner.terminate());
+      return Future.wait(futures);
+    }
+
+    return Future.wait([_terminateBatchRunners(), _terminateBrowserRunners()]);
+  }
+
+  Future<CommandOutput> runCommand(node, Command command, int timeout) {
+    assert(!_finishing);
+
+    Future<CommandOutput> runCommand(int retriesLeft) {
+      return _runCommand(command, timeout).then((CommandOutput output) {
+        if (!output.canRunDependendCommands && retriesLeft > 0) {
+          DebugLogger.warning("Rerunning Command: ($retriesLeft "
+                              "attempt(s) remains) [cmd: $command]");
+          return runCommand(retriesLeft - 1);
+        } else {
+          return new Future.value(output);
+        }
+      });
+    }
+    return runCommand(command.numRetries);
+  }
+
+  Future<CommandOutput> _runCommand(Command command, int timeout) {
+    var batchMode = !globalConfiguration['noBatch'];
+
+    if (command is BrowserTestCommand) {
+      return _startBrowserControllerTest(command, timeout);
+    } else if (command is SeleniumTestCommand && batchMode) {
+      var arguments = ['--force-refresh', '--browser=${command.browser}',
+                       '--timeout=${timeout}', '--out', '${command.url}'];
+      return _getBatchRunner(command.browser)
+          .runCommand('selenium', command, timeout, arguments);
+    } else if (command is AnalysisCommand && batchMode) {
+      return _getBatchRunner(command.flavor)
+          .runCommand(command.flavor, command, timeout, command.arguments);
+    } else {
+      return new RunningProcess(command, timeout).run();
+    }
+  }
+
+  BatchRunnerProcess _getBatchRunner(String identifier) {
     // Start batch processes if needed
-    var compiler = test.configuration['compiler'];
-    var runners = _batchProcesses[compiler];
+    var runners = _batchProcesses[identifier];
     if (runners == null) {
-      runners = new List<BatchRunnerProcess>(_maxProcesses);
-      for (int i = 0; i < _maxProcesses; i++) {
-        runners[i] = new BatchRunnerProcess(test);
+      runners = new List<BatchRunnerProcess>(maxProcesses);
+      for (int i = 0; i < maxProcesses; i++) {
+        runners[i] = new BatchRunnerProcess();
       }
-      _batchProcesses[compiler] = runners;
+      _batchProcesses[identifier] = runners;
     }
 
     for (var runner in runners) {
-      if (!runner.active) return runner;
+      if (!runner._currentlyRunning) return runner;
     }
     throw new Exception('Unable to find inactive batch runner.');
   }
 
-  Future<BrowserTestRunner> _getBrowserTestRunner(TestCase test) {
-    var local_ip = test.configuration['local_ip'];
-    var runtime = test.configuration['runtime'];
-    var num_browsers = _maxBrowserProcesses;
-    if (_browserTestRunners[runtime] == null) {
+  Future<CommandOutput> _startBrowserControllerTest(
+      BrowserTestCommand browserCommand, int timeout) {
+    var completer = new Completer<CommandOutput>();
+
+    var callback = (var output, var duration) {
+      var commandOutput = createCommandOutput(browserCommand,
+                          0,
+                          output == "TIMEOUT",
+                          encodeUtf8(output),
+                          [],
+                          duration,
+                          false);
+      completer.complete(commandOutput);
+    };
+    BrowserTest browserTest = new BrowserTest(browserCommand.url,
+                                              callback,
+                                              timeout);
+    _getBrowserTestRunner(browserCommand.browser).then((testRunner) {
+      testRunner.queueTest(browserTest);
+    });
+
+    return completer.future;
+  }
+
+  Future<BrowserTestRunner> _getBrowserTestRunner(String browser) {
+    var local_ip = globalConfiguration['local_ip'];
+    var num_browsers = maxBrowserProcesses;
+    if (_browserTestRunners[browser] == null) {
       var testRunner =
-        new BrowserTestRunner(local_ip, runtime, num_browsers);
+        new BrowserTestRunner(local_ip, browser, num_browsers);
       testRunner.logger = DebugLogger.info;
-      _browserTestRunners[runtime] = testRunner;
+      _browserTestRunners[browser] = testRunner;
       return testRunner.start().then((started) {
         if (started) {
           return testRunner;
@@ -1665,251 +1859,228 @@
         io.exit(1);
       });
     }
-    return new Future.value(_browserTestRunners[runtime]);
+    return new Future.value(_browserTestRunners[browser]);
+  }
+}
+
+class RecordingCommandExecutor implements CommandExecutor {
+  TestCaseRecorder _recorder;
+
+  RecordingCommandExecutor(io.Path path)
+      : _recorder = new TestCaseRecorder(path);
+
+  Future<CommandOutput> runCommand(node, Command command, int timeout) {
+    assert(node.dependencies.length == 0);
+    assert(_cleanEnvironmentOverrides(command.environmentOverrides));
+    _recorder.nextCommand(command, timeout);
+    // Return dummy CommandOutput
+    var output =
+        createCommandOutput(command, 0, false, [], [], const Duration(), false);
+    return new Future.value(output);
   }
 
-  void _startBrowserControllerTest(var test) {
-    var callback = (var output, var duration) {
-      var nextCommandIndex = test.commandOutputs.keys.length;
-      new CommandOutput.fromCase(test,
-                                 test.commands[nextCommandIndex],
-                                 0,
-                                 false,
-                                 output == "TIMEOUT",
-                                 encodeUtf8(output),
-                                 [],
-                                 duration,
-                                 false);
-      test.completedHandler(test);
-    };
-    BrowserTest browserTest = new BrowserTest(test.testingUrl,
-                                              callback,
-                                              test.timeout);
-    _getBrowserTestRunner(test).then((testRunner) {
-      testRunner.queueTest(browserTest);
+  Future cleanup() {
+    _recorder.finish();
+    return new Future.value();
+  }
+
+  // Returns [:true:] if the environment contains only 'DART_CONFIGURATION'
+  bool _cleanEnvironmentOverrides(Map environment) {
+    if (environment == null) return true;
+    return environment.length == 0 ||
+        (environment.length == 1 &&
+         environment.containsKey("DART_CONFIGURATION"));
+
+  }
+}
+
+class ReplayingCommandExecutor implements CommandExecutor {
+  TestCaseOutputArchive _archive = new TestCaseOutputArchive();
+
+  ReplayingCommandExecutor(io.Path path) {
+    _archive.loadFromPath(path);
+  }
+
+  Future cleanup() => new Future.value();
+
+  Future<CommandOutput> runCommand(node, Command command, int timeout) {
+    assert(node.dependencies.length == 0);
+    return new Future.value(_archive.outputOf(command));
+  }
+}
+
+
+/*
+ * [TestCaseCompleter] will listen for
+ * NodeState.Processing -> NodeState.{Successfull,Failed} state changes and
+ * will complete a TestCase if it is finished.
+ *
+ * It provides a stream [finishedTestCases], which will stream all TestCases
+ * once they're finished. After all TestCases are done, the stream will be
+ * closed.
+ */
+class TestCaseCompleter {
+  static final COMPLETED_STATES = [dgraph.NodeState.Failed,
+                                   dgraph.NodeState.Successful];
+  final dgraph.Graph graph;
+  final TestCaseEnqueuer enqueuer;
+  final CommandQueue commandQueue;
+
+  Map<Command, CommandOutput> _outputs = new Map<Command, CommandOutput>();
+  bool _closed = false;
+  StreamController<TestCase> _controller = new StreamController<TestCase>();
+
+  TestCaseCompleter(this.graph, this.enqueuer, this.commandQueue) {
+    var eventCondition = graph.events.where;
+
+    // Store all the command outputs -- they will be delivered synchronously
+    // (i.e. before state changes in the graph)
+    commandQueue.completedCommands.listen((CommandOutput output) {
+      _outputs[output.command] = output;
+    });
+
+    // Listen for NodeState.Processing -> NodeState.{Successfull,Failed}
+    // changes.
+    eventCondition((event) => event is dgraph.StateChangedEvent)
+        .listen((dgraph.StateChangedEvent event) {
+          if (event.from == dgraph.NodeState.Processing) {
+            assert(COMPLETED_STATES.contains(event.to));
+            _completeTestCasesIfPossible(event.node.userData);
+
+            if (!_closed &&
+                graph.isSealed &&
+                enqueuer.remainingTestCases.isEmpty) {
+              _controller.close();
+              _closed = true;
+            }
+          }
+    });
+
+    // Listen also for GraphSealedEvent's. If there is not a single node in the
+    // graph, we still want to finish after the graph was sealed.
+    eventCondition((event) => event is dgraph.GraphSealedEvent)
+        .listen((dgraph.GraphSealedEvent event) {
+          if (!_closed && enqueuer.remainingTestCases.isEmpty) {
+            _controller.close();
+            _closed = true;
+          }
     });
   }
 
-  void _tryRunTest() {
-    _checkDone();
-    // TODO(ricow): remove most of the hacked selenium code below when
-    // we have eliminated the need.
+  Stream<TestCase> get finishedTestCases => _controller.stream;
 
-    if (_numProcesses < _maxProcesses && !_tests.isEmpty) {
-      TestCase test = _tests.removeFirst();
-      if (_listTests) {
-        var fields = [test.displayName,
-                      test.expectedOutcomes.join(','),
-                      test.isNegative.toString()];
-        fields.addAll(test.commands.last.arguments);
-        print(fields.join('\t'));
-        return;
-      }
+  void _completeTestCasesIfPossible(Command command) {
+    assert(_outputs[command] != null);
 
-      if (test.usesWebDriver && _needsSelenium && !test.usesBrowserController
-          && !_isSeleniumAvailable ||
-          (test is BrowserTestCase && test.waitingForOtherTest)) {
-        // The test is not yet ready to run. Put the test back in
-        // the queue.  Avoid spin-polling by using a timeout.
-        _tests.add(test);
-        new Timer(new Duration(milliseconds: 100),
-                  _tryRunTest);  // Don't lose a process.
-        return;
-      }
-      // Before running any commands, we print out all commands if '--verbose'
-      // was specified.
-      if (_verbose && test.commandOutputs.length == 0) {
-        int i = 1;
-        if (test is BrowserTestCase) {
-          // Additional command for rerunning the steps locally after the fact.
-          var command =
-            test.configuration["_servers_"].httpServerCommandline();
-          print('$i. $command');
-          i++;
-        }
-        for (Command command in test.commands) {
-          print('$i. $command');
-          i++;
+    var testCases = enqueuer.command2testCases[command];
+
+    // Update TestCases with command outputs
+    for (TestCase test in testCases) {
+      for (var icommand in test.commands) {
+        var output = _outputs[icommand];
+        if (output != null) {
+          test.commandOutputs[icommand] = output;
         }
       }
+    }
 
-      var isLastCommand =
-          ((test.commands.length-1) == test.commandOutputs.length);
-      var isBrowserCommand = isLastCommand && (test is BrowserTestCase);
-      if (isBrowserCommand && _numBrowserProcesses == _maxBrowserProcesses) {
-        // If there is no free browser runner, put it back into the queue.
-        _tests.add(test);
-        new Timer(new Duration(milliseconds: 100),
-                  _tryRunTest);  // Don't lose a process.
-        return;
-      }
-
-      eventStartTestCase(test);
-
-      // Analyzer and browser test commands can be run by a [BatchRunnerProcess]
-      var nextCommandIndex = test.commandOutputs.keys.length;
-      var numberOfCommands = test.commands.length;
-
-      var useBatchRunnerForAnalyzer =
-          test.configuration['analyzer'] &&
-          test.displayName != 'dartc/junit_tests';
-      var isWebdriverCommand = nextCommandIndex == (numberOfCommands - 1) &&
-                               test.usesWebDriver &&
-                               !test.configuration['noBatch'];
-      if (useBatchRunnerForAnalyzer || isWebdriverCommand) {
-        TestCaseEvent oldCallback = test.completedHandler;
-        void testCompleted(TestCase test_arg) {
-          _numProcesses--;
-          if (isBrowserCommand) {
-            _numBrowserProcesses--;
-          }
-          eventFinishedTestCase(test_arg);
-          if (test_arg is BrowserTestCase) {
-            (test_arg as BrowserTestCase).notifyObservers();
-          }
-          oldCallback(test_arg);
-          _tryRunTest();
-        };
-        test.completedHandler = testCompleted;
-        if (test.usesBrowserController) {
-          _startBrowserControllerTest(test);
-        } else {
-          _getBatchRunner(test).startTest(test);
-        }
+    void completeTestCase(TestCase testCase) {
+      if (enqueuer.remainingTestCases.contains(testCase)) {
+        _controller.add(testCase);
+        enqueuer.remainingTestCases.remove(testCase);
       } else {
-        // Once we've actually failed a test, technically, we wouldn't need to
-        // bother retrying any subsequent tests since the bot is already red.
-        // However, we continue to retry tests until we have actually failed
-        // four tests (arbitrarily chosen) for more debugable output, so that
-        // the developer doesn't waste his or her time trying to fix a bunch of
-        // tests that appear to be broken but were actually just flakes that
-        // didn't get retried because there had already been one failure.
-        bool allowRetry = _MAX_FAILED_NO_RETRY > _numFailedTests;
-        runNextCommandWithRetries(test, allowRetry).then((TestCase testCase) {
-          _numProcesses--;
-          if (isBrowserCommand) {
-            _numBrowserProcesses--;
-          }
-          if (isTestCaseFinished(testCase)) {
-            testCase.completed();
-            eventFinishedTestCase(testCase);
-            if (testCase is BrowserTestCase) {
-              (testCase as BrowserTestCase).notifyObservers();
-            }
-          } else {
-            _tests.addFirst(testCase);
-          }
-          _tryRunTest();
-        });
+        DebugLogger.error("${testCase.displayName} would be finished twice");
       }
+    }
 
-      _numProcesses++;
-      if (isBrowserCommand) {
-        _numBrowserProcesses++;
+    for (var testCase in testCases) {
+      // Ask the [testCase] if it's done. Note that we assume, that
+      // [TestCase.isFinished] will return true if all commands were executed
+      // or if a previous one failed.
+      if (testCase.isFinished) {
+        completeTestCase(testCase);
       }
     }
   }
+}
 
-  bool isTestCaseFinished(TestCase testCase) {
-    var numberOfCommandOutputs = testCase.commandOutputs.keys.length;
-    var numberOfCommands = testCase.commands.length;
 
-    var lastCommandCompleted = (numberOfCommandOutputs == numberOfCommands);
-    var lastCommandOutput = testCase.lastCommandOutput;
-    var lastCommand = lastCommandOutput.command;
-    var timedOut = lastCommandOutput.hasTimedOut;
-    var nonZeroExitCode = lastCommandOutput.exitCode != 0;
-    // NOTE: If this was the last command or there was unexpected output
-    // we're done with the test.
-    // Otherwise we need to enqueue it again into the test queue.
-    if (lastCommandCompleted || timedOut || nonZeroExitCode) {
-      var verbose = testCase.configuration['verbose'];
-      if (lastCommandOutput.unexpectedOutput && verbose != null && verbose) {
-        print(testCase.displayName);
-        print("stderr:");
-        print(decodeUtf8(lastCommandOutput.stderr));
-        if (!lastCommand.isPixelTest) {
-          print("stdout:");
-          print(decodeUtf8(lastCommandOutput.stdout));
-        } else {
-          print("");
-          print("DRT pixel test failed! stdout is not printed because it "
-                "contains binary data!");
-        }
-      }
-      return true;
+class ProcessQueue {
+  Map _globalConfiguration;
+
+  bool _allTestsWereEnqueued = false;
+
+  bool _listTests;
+  Function _allDone;
+  final dgraph.Graph _graph = new dgraph.Graph();
+  List<EventListener> _eventListener;
+
+  ProcessQueue(this._globalConfiguration,
+               maxProcesses,
+               maxBrowserProcesses,
+               DateTime startTime,
+               testSuites,
+               this._eventListener,
+               this._allDone,
+               [bool verbose = false,
+                this._listTests = false,
+                String recordingOutputFile,
+                String recordedInputFile]) {
+    bool recording = recordingOutputFile != null;
+    bool replaying = recordedInputFile != null;
+
+    // When the graph building is finished, notify event listeners.
+    _graph.events
+      .where((event) => event is dgraph.GraphSealedEvent).listen((event) {
+        eventAllTestsKnown();
+    });
+
+    // Build up the dependency graph
+    var testCaseEnqueuer = new TestCaseEnqueuer(_graph, (TestCase newTestCase) {
+      eventTestAdded(newTestCase);
+    });
+
+    // Queue commands as they become "runnable"
+    var commandEnqueuer = new CommandEnqueuer(_graph);
+
+    // CommandExecutor will execute commands
+    var executor;
+    if (recording) {
+      executor = new RecordingCommandExecutor(new io.Path(recordingOutputFile));
+    } else if (replaying) {
+      executor = new ReplayingCommandExecutor(new io.Path(recordedInputFile));
     } else {
-      return false;
+      executor = new CommandExecutorImpl(
+          _globalConfiguration, maxProcesses, maxBrowserProcesses);
     }
-  }
 
-  Future runNextCommandWithRetries(TestCase testCase, bool allowRetry) {
-    var completer = new Completer();
+    // Run "runnable commands" using [executor] subject to
+    // maxProcesses/maxBrowserProcesses constraint
+    var commandQueue = new CommandQueue(
+        _graph, testCaseEnqueuer, executor, maxProcesses, maxBrowserProcesses,
+        verbose);
 
-    var nextCommandIndex = testCase.commandOutputs.keys.length;
-    var numberOfCommands = testCase.commands.length;
-    if (nextCommandIndex >= numberOfCommands) {
-      throw "nextCommandIndex must be less than numberOfCommands";
-    }
-    var command = testCase.commands[nextCommandIndex];
-    var isLastCommand = nextCommandIndex == (numberOfCommands - 1);
-
-    void runCommand() {
-      var runningProcess = new RunningProcess(testCase, command);
-      runningProcess.start().then((CommandOutput commandOutput) {
-        if (isLastCommand) {
-          // NOTE: We need to call commandOutput.unexpectedOutput here.
-          // Calling this getter may result in the side-effect, that
-          // commandOutput.requestRetry is set to true.
-          // (BrowserCommandOutputImpl._failedBecauseOfMissingXDisplay
-          // does that for example)
-          // TODO(ricow/kustermann): Issue 8206
-          var unexpectedOutput = commandOutput.unexpectedOutput;
-          if (unexpectedOutput && allowRetry) {
-            if (testCase.usesWebDriver
-                && (testCase as BrowserTestCase).numRetries > 0) {
-              // Selenium tests can be flaky. Try rerunning.
-              commandOutput.requestRetry = true;
-            }
-            // FIXME(kustermann): Remove this condition once we figured out why
-            // content_shell is sometimes not able to fetch resources from the
-            // HttpServer.
-            var configuration  = testCase.configuration;
-            if (configuration['runtime'] == 'drt' &&
-                configuration['system'] == 'windows' &&
-                (testCase as BrowserTestCase).numRetries > 0) {
-              assert(TestUtils.isBrowserRuntime(configuration['runtime']));
-              commandOutput.requestRetry = true;
-            }
-          }
+    // Finish test cases when all commands were run (or some failed)
+    var testCaseCompleter =
+        new TestCaseCompleter(_graph, testCaseEnqueuer, commandQueue);
+    testCaseCompleter.finishedTestCases.listen(
+      (TestCase finishedTestCase) {
+        // If we're recording, we don't report any TestCases to listeners.
+        if (!recording) {
+          eventFinishedTestCase(finishedTestCase);
         }
-        if (commandOutput.requestRetry) {
-          commandOutput.requestRetry = false;
-          (testCase as BrowserTestCase).numRetries--;
-          DebugLogger.warning("Rerunning Test: ${testCase.displayName} "
-                              "(${(testCase as BrowserTestCase).numRetries} "
-                              "attempt(s) remains) [cmd:$command]");
-          runCommand();
-        } else {
-          completer.complete(testCase);
-        }
+      },
+      onDone: () {
+        // Wait until the commandQueue/execturo is done (it may need to stop
+        // batch runners, browser controllers, ....)
+        commandQueue.done.then((_) => eventAllTestsDone());
       });
-    }
-    runCommand();
 
-    return completer.future;
-  }
-
-  void eventStartTestCase(TestCase testCase) {
-    for (var listener in _eventListener) {
-      listener.start(testCase);
-    }
+    // Start enqueing all TestCases
+    testCaseEnqueuer.enqueueTestSuites(testSuites);
   }
 
   void eventFinishedTestCase(TestCase testCase) {
-    if (testCase.lastCommandOutput.unexpectedOutput) {
-      _numFailedTests++;
-    }
     for (var listener in _eventListener) {
       listener.done(testCase);
     }
@@ -1931,6 +2102,6 @@
     for (var listener in _eventListener) {
       listener.allDone();
     }
+    _allDone();
   }
 }
-
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 5130abe..4f62e29 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -27,7 +27,6 @@
 part "browser_test.dart";
 
 
-// TODO(rnystrom): Add to dart:core?
 /**
  * A simple function that tests [arg] and returns `true` or `false`.
  */
@@ -110,6 +109,10 @@
 
   TestSuite(this.configuration, this.suiteName);
 
+  String get configurationDir {
+    return TestUtils.configurationDir(configuration);
+  }
+
   /**
    * Whether or not binaries should be found in the root build directory or
    * in the built SDK.
@@ -307,7 +310,7 @@
   String hostRunnerPath;
   final String dartDir;
   List<String> statusFilePaths;
-  TestCaseEvent doTest;
+  Function doTest;
   VoidFunction doDone;
   ReceivePort receiveTestName;
   TestExpectations testExpectations;
@@ -357,16 +360,17 @@
       var args = TestUtils.standardOptions(configuration);
       args.add(testName);
 
+      var command = CommandBuilder.instance.getCommand(
+          'run_vm_unittest', targetRunnerPath, args, configurationDir);
       doTest(
           new TestCase(constructedName,
-                       [new Command('run_vm_unittest', targetRunnerPath, args)],
+                       [command],
                        configuration,
-                       completeHandler,
                        expectations));
     }
   }
 
-  void forEachTest(TestCaseEvent onTest, Map testCache, [VoidFunction onDone]) {
+  void forEachTest(Function onTest, Map testCache, [VoidFunction onDone]) {
     doTest = onTest;
     doDone = onDone;
 
@@ -389,9 +393,6 @@
                                statusFileRead);
     }
   }
-
-  void completeHandler(TestCase testCase) {
-  }
 }
 
 
@@ -419,7 +420,7 @@
 class StandardTestSuite extends TestSuite {
   final Path suiteDir;
   final List<String> statusFilePaths;
-  TestCaseEvent doTest;
+  Function doTest;
   TestExpectations testExpectations;
   List<TestInformation> cachedTests;
   final Path dartDir;
@@ -505,7 +506,7 @@
 
   List<String> additionalOptions(Path filePath) => [];
 
-  void forEachTest(TestCaseEvent onTest, Map testCache, [VoidFunction onDone]) {
+  void forEachTest(Function onTest, Map testCache, [VoidFunction onDone]) {
     updateDartium().then((_) {
       doTest = onTest;
 
@@ -743,7 +744,6 @@
       doTest(new TestCase('$suiteName/$testName',
                           makeCommands(info, allVmOptions, commonArguments),
                           configuration,
-                          completeHandler,
                           expectations,
                           isNegative: isNegative,
                           info: info));
@@ -758,21 +758,20 @@
       String tempDir = createOutputDirectory(info.filePath, '');
       args.add('--out=$tempDir/out.js');
 
-       List<Command> commands =
-           <Command>[new CompilationCommand(compiler,
-                                            "$tempDir/out.js",
-                                            !useSdk,
-                                            dart2JsBootstrapDependencies,
-                                            compilerPath,
-                                            args)];
+      var command = CommandBuilder.instance.getCompilationCommand(
+          compiler, "$tempDir/out.js", !useSdk,
+          dart2JsBootstrapDependencies, compilerPath, args, configurationDir);
+
+      List<Command> commands = <Command>[command];
       if (info.hasCompileError) {
         // Do not attempt to run the compiled result. A compilation
         // error should be reported by the compilation command.
       } else if (configuration['runtime'] == 'd8') {
-        commands.add(new Command("d8", d8FileName, ['$tempDir/out.js']));
+        commands.add(CommandBuilder.instance.getCommand(
+            "d8", d8FileName, ['$tempDir/out.js'], configurationDir));
       } else if (configuration['runtime'] == 'jsshell') {
-        commands.add(
-            new Command("jsshell", jsShellFileName, ['$tempDir/out.js']));
+        commands.add(CommandBuilder.instance.getCommand(
+            "jsshell", jsShellFileName, ['$tempDir/out.js'], configurationDir));
       }
       return commands;
 
@@ -783,12 +782,10 @@
       args.add('--out=$tempDir/out.dart');
 
       List<Command> commands =
-          <Command>[new CompilationCommand(compiler,
-                                           "$tempDir/out.dart",
-                                           !useSdk,
-                                           dart2JsBootstrapDependencies,
-                                           compilerPath,
-                                           args)];
+          <Command>[CommandBuilder.instance.getCompilationCommand(
+              compiler, "$tempDir/out.dart", !useSdk,
+              dart2JsBootstrapDependencies, compilerPath, args,
+              configurationDir)];
       if (info.hasCompileError) {
         // Do not attempt to run the compiled result. A compilation
         // error should be reported by the compilation command.
@@ -797,21 +794,24 @@
         var vmArguments = new List.from(vmOptions);
         vmArguments.addAll([
             '--ignore-unrecognized-flags', '$tempDir/out.dart']);
-        commands.add(new Command("vm", vmFileName, vmArguments));
+        commands.add(CommandBuilder.instance.getCommand(
+            "vm", vmFileName, vmArguments, configurationDir));
       } else {
         throw 'Unsupported runtime ${configuration["runtime"]} for dart2dart';
       }
       return commands;
 
     case 'none':
-    case 'dartanalyzer':
-    case 'dart2analyzer':
-      var displayName = (configuration['compiler'] == 'none'
-          ? 'vm' : configuration['compiler']);
       var arguments = new List.from(vmOptions);
       arguments.addAll(args);
-      return <Command>[
-          new Command(displayName, dartShellFileName, arguments)];
+      return <Command>[CommandBuilder.instance.getCommand(
+          'vm', dartShellFileName, arguments, configurationDir)];
+
+    case 'dartanalyzer':
+    case 'dart2analyzer':
+      return <Command>[CommandBuilder.instance.getAnalysisCommand(
+          compiler, dartShellFileName, args, configurationDir,
+          flavor: compiler)];
 
     default:
       throw 'Unknown compiler ${configuration["compiler"]}';
@@ -903,7 +903,6 @@
     dartWrapper.closeSync();
   }
 
-
   /**
    * The [StandardTestSuite] has support for tests that
    * compile a test from Dart to JavaScript, and then run the resulting
@@ -1011,17 +1010,10 @@
 
       // Variables for browser multi-tests.
       List<String> subtestNames = info.optionsFromFile['subtestNames'];
-      BrowserTestCase multitestParentTest;
       int subtestIndex = 0;
       // Construct the command that executes the browser test
       do {
         List<Command> commandSet = new List<Command>.from(commands);
-        if (subtestIndex != 0) {
-          // NOTE: The first time we enter this loop, all the compilation
-          // commands will be executed. On subsequent loop iterations, we
-          // don't need to do any compilations. Thus we set "commandSet = []".
-          commandSet = [];
-        }
 
         var htmlPath_subtest = _createUrlPathFromFile(new Path(htmlPath));
         var fullHtmlPath = _getUriForBrowserTest(info, htmlPath_subtest,
@@ -1035,9 +1027,9 @@
           args = ['tools/testing/dart/launch_browser.dart',
                   runtime,
                   fullHtmlPath];
-          commandSet.add(new Command(runtime,
-                                     TestUtils.dartTestExecutable.toString(),
-                                     args));
+          commandSet.add(CommandBuilder.instance.getBrowserTestCommand(
+              runtime, fullHtmlPath,
+              TestUtils.dartTestExecutable.toString(), args, configurationDir));
         } else if (TestUtils.usesWebDriver(runtime)) {
           args = [
               dartDir.append('tools/testing/run_selenium.py').toNativePath(),
@@ -1051,12 +1043,10 @@
           if (subtestIndex != 0) {
             args.add('--force-refresh');
           }
-          commandSet.add(new Command(runtime, 'python', args));
+          commandSet.add(CommandBuilder.instance.getSeleniumTestCommand(
+                  runtime, fullHtmlPath, 'python', args, configurationDir));
         } else {
-          if (runtime != "drt") {
-            print("Unknown runtime $runtime");
-            exit(1);
-          }
+          assert(runtime == "drt");
 
           var dartFlags = [];
           var contentShellOptions = [];
@@ -1080,11 +1070,9 @@
               fullHtmlPath = "${fullHtmlPath}'-p";
             }
           }
-          commandSet.add(new ContentShellCommand(contentShellFilename,
-                                                 fullHtmlPath,
-                                                 contentShellOptions,
-                                                 dartFlags,
-                                                 expectedOutput));
+          commandSet.add(CommandBuilder.instance.getContentShellCommand(
+              contentShellFilename, fullHtmlPath, contentShellOptions,
+              dartFlags, expectedOutput, configurationDir));
         }
 
         // Create BrowserTestCase and queue it.
@@ -1093,20 +1081,13 @@
         if (info.optionsFromFile['isMultiHtmlTest']) {
           testDisplayName = '$testDisplayName/${subtestNames[subtestIndex]}';
           testCase = new BrowserTestCase(testDisplayName,
-              commandSet, configuration, completeHandler,
+              commandSet, configuration,
               expectations['$testName/${subtestNames[subtestIndex]}'],
-              info, info.hasCompileError || info.hasRuntimeError, fullHtmlPath,
-              subtestIndex != 0);
+              info, info.hasCompileError || info.hasRuntimeError, fullHtmlPath);
         } else {
           testCase = new BrowserTestCase(testDisplayName,
-              commandSet, configuration, completeHandler, expectations,
-              info, info.hasCompileError || info.hasRuntimeError, fullHtmlPath,
-              false);
-        }
-        if (subtestIndex == 0) {
-          multitestParentTest = testCase;
-        } else {
-          multitestParentTest.addObserver(testCase);
+              commandSet, configuration, expectations,
+              info, info.hasCompileError || info.hasRuntimeError, fullHtmlPath);
         }
 
         doTest(testCase);
@@ -1133,12 +1114,9 @@
       args.insert(0, executable);
       executable = dartShellFileName;
     }
-    return new CompilationCommand(compiler,
-                                  outputFile,
-                                  !useSdk,
-                                  dart2JsBootstrapDependencies,
-                                  compilerPath,
-                                  args);
+    return CommandBuilder.instance.getCompilationCommand(
+        compiler, outputFile, !useSdk,
+        dart2JsBootstrapDependencies, compilerPath, args, configurationDir);
   }
 
   /**
@@ -1230,9 +1208,6 @@
     return dartDir.append('client/tests/dartium/chrome').toNativePath();
   }
 
-  void completeHandler(TestCase testCase) {
-  }
-
   List<String> commonArgumentsFromFile(Path filePath, Map optionsFromFile) {
     List args = TestUtils.standardOptions(configuration);
 
@@ -1669,17 +1644,15 @@
       updatedConfiguration[key] = value;
     });
     updatedConfiguration['timeout'] *= 3;
+    var command = CommandBuilder.instance.getCommand(
+        'junit_test', 'java', args, configurationDir);
     doTest(new TestCase(suiteName,
-                        [new Command('junit_test', 'java', args)],
+                        [command],
                         updatedConfiguration,
-                        completeHandler,
                         new Set<String>.from([PASS])));
     doDone();
   }
 
-  void completeHandler(TestCase testCase) {
-  }
-
   void computeClassPath() {
     classPath =
         ['$buildDir/analyzer/util/analyzer/dart_analyzer.jar',
@@ -1693,7 +1666,7 @@
          '$dartDir/third_party/hamcrest/v1_3/hamcrest-integration-1.3.0RC2.jar',
          '$dartDir/third_party/hamcrest/v1_3/hamcrest-library-1.3.0RC2.jar',
          '$dartDir/third_party/junit/v4_8_2/junit.jar']
-        .join(Platform.operatingSystem == 'windows'? ';': ':');  // Path separator.
+        .join(Platform.operatingSystem == 'windows'? ';': ':');
   }
 }
 
diff --git a/tools/testing/dart/utils.dart b/tools/testing/dart/utils.dart
index 3ddf330..888f8cf 100644
--- a/tools/testing/dart/utils.dart
+++ b/tools/testing/dart/utils.dart
@@ -64,6 +64,55 @@
   static String get _datetime => "${new DateTime.now()}";
 }
 
+
+/**
+ * [areByteArraysEqual] compares a range of bytes from [buffer1] with a
+ * range of bytes from [buffer2].
+ *
+ * Returns [true] if the [count] bytes in [buffer1] (starting at
+ * [offset1]) match the [count] bytes in [buffer2] (starting at
+ * [offset2]).
+ * Otherwise [false] is returned.
+ */
+bool areByteArraysEqual(List<int> buffer1, int offset1,
+                        List<int> buffer2, int offset2,
+                        int count) {
+  if ((offset1 + count) > buffer1.length ||
+      (offset2 + count) > buffer2.length) {
+    return false;
+  }
+
+  for (var i = 0; i < count; i++) {
+    if (buffer1[offset1 + i] != buffer2[offset2 + i]) {
+      return false;
+    }
+  }
+  return true;
+}
+
+/**
+ * [findBytes] searches for [pattern] in [data] beginning at [startPos].
+ *
+ * Returns [true] if [pattern] was found in [data].
+ * Otherwise [false] is returned.
+ */
+int findBytes(List<int> data, List<int> pattern, [int startPos=0]) {
+  // TODO(kustermann): Use one of the fast string-matching algorithms!
+  for (int i = startPos; i < (data.length - pattern.length); i++) {
+    bool found = true;
+    for (int j = 0; j < pattern.length; j++) {
+      if (data[i + j] != pattern[j]) {
+        found = false;
+        break;
+      }
+    }
+    if (found) {
+      return i;
+    }
+  }
+  return -1;
+}
+
 List<int> encodeUtf8(String string) {
   return utf.encodeUtf8(string);
 }
@@ -84,3 +133,22 @@
   return argument;
 }
 
+class HashCodeBuilder {
+  int _value = 0;
+
+  void add(Object object) {
+    _value = ((_value * 31) ^ object.hashCode)  & 0x3FFFFFFF;
+  }
+
+  int get value => _value;
+}
+
+class UniqueObject {
+  static int _nextId = 1;
+  final int _hashCode;
+
+  int get hashCode => _hashCode;
+  operator==(other) => other is UniqueObject && _hashCode == other._hashCode;
+
+  UniqueObject() : _hashCode = ++_nextId;
+}
\ No newline at end of file
diff --git a/tools/utils.py b/tools/utils.py
index 0abb0ed..54a53a8 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -205,7 +205,6 @@
   return gsutil
 
 def GetBuildMode(mode):
-  global BUILD_MODES
   return BUILD_MODES[mode]
 
 
@@ -214,10 +213,10 @@
 
 ARCH_GUESS = GuessArchitecture()
 BASE_DIR = os.path.abspath(os.path.join(os.curdir, '..'))
+DART_DIR = os.path.abspath(os.path.join(__file__, '..', '..'))
 
 
 def GetBuildDir(host_os, target_os):
-  global BUILD_ROOT
   build_dir = BUILD_ROOT[host_os]
   if target_os and target_os != host_os:
     build_dir = os.path.join(build_dir, target_os)
@@ -233,28 +232,71 @@
   return BASE_DIR
 
 def GetVersion():
-  dartbin = DartBinary()
-  version_script = VersionScript()
-  p = subprocess.Popen([dartbin, version_script], stdout = subprocess.PIPE,
-      stderr = subprocess.STDOUT, shell=IsWindows())
-  output, not_used = p.communicate()
-  return output.strip()
+  version_tuple = ReadVersionFile()
+  if not version_tuple:
+    return None
+
+  (major, minor, build, patch) = version_tuple
+  revision = GetSVNRevision()
+  user = GetUserName()
+  # We don't add username to release builds (or any builds on the bots)
+  if user == 'chrome-bot':
+    user = ''
+
+  user_string = ''
+  revision_string = ''
+  if user:
+    user_string = '_%s' % user
+  if revision:
+    revision_string = '_r%s' % revision
+
+  return ("%s.%s.%s.%s%s%s" %
+          (major, minor, build, patch, revision_string, user_string))
+
+def GetUserName():
+  key = 'USER'
+  if sys.platform == 'win32':
+    key = 'USERNAME'
+  return os.environ.get(key, '')
+
+def ReadVersionFile():
+  version_file = os.path.join(DART_DIR, 'tools', 'VERSION')
+  try:
+    fd = open(version_file)
+    content = fd.read()
+    fd.close()
+  except:
+    print "Warning: Couldn't read VERSION file (%s)" % version_file
+    return None
+  major_match = re.search('MAJOR (\d+)', content)
+  minor_match = re.search('MINOR (\d+)', content)
+  build_match = re.search('BUILD (\d+)', content)
+  patch_match = re.search('PATCH (\d+)', content)
+  if major_match and minor_match and build_match and patch_match:
+    return (major_match.group(1), minor_match.group(1), build_match.group(1),
+            patch_match.group(1))
+  else:
+    print "Warning: VERSION file (%s) has wrong format" % version_file
+    return None
 
 def GetSVNRevision():
+  # FIXME(kustermann): Make this work for newer SVN versions as well (where
+  # we've got only one '.svn' directory)
   custom_env = dict(os.environ)
   custom_env['LC_MESSAGES'] = 'en_GB'
   p = subprocess.Popen(['svn', 'info'], stdout = subprocess.PIPE,
                        stderr = subprocess.STDOUT, shell=IsWindows(),
-                       env = custom_env)
-  output, not_used = p.communicate()
+                       env = custom_env,
+                       cwd = DART_DIR)
+  output, _ = p.communicate()
   revision = ParseSvnInfoOutput(output)
   if revision:
     return revision
 
   # maybe the builder is using git-svn, try that
   p = subprocess.Popen(['git', 'svn', 'info'], stdout = subprocess.PIPE,
-      stderr = subprocess.STDOUT, shell=IsWindows())
-  output, not_used = p.communicate()
+      stderr = subprocess.STDOUT, shell=IsWindows(), cwd = DART_DIR)
+  output, _ = p.communicate()
   revision = ParseSvnInfoOutput(output)
   if revision:
     return revision
@@ -262,9 +304,9 @@
   return None
 
 def ParseSvnInfoOutput(output):
-  for line in output.split('\n'):
-    if 'Revision' in line:
-      return (line.strip().split())[1]
+  revision_match = re.search('Last Changed Rev: (\d+)', output)
+  if revision_match:
+    return revision_match.group(1)
   return None
 
 def RewritePathSeparator(path, workspace):
@@ -389,11 +431,6 @@
     os.utime(name, None)
 
 
-def VersionScript():
-  tools_dir = os.path.dirname(os.path.realpath(__file__))
-  return os.path.join(tools_dir, 'version.dart')
-
-
 def DartBinary():
   tools_dir = os.path.dirname(os.path.realpath(__file__))
   dart_binary_prefix = os.path.join(tools_dir, 'testing', 'bin')
diff --git a/tools/version.dart b/tools/version.dart
deleted file mode 100644
index 6972667..0000000
--- a/tools/version.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env dart
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:io";
-import "dart:async" show getAttachedStackTrace;
-import "release/version.dart";
-
-void main() {
-  Path scriptPath = new Path(new Options().script).directoryPath;
-  Version version = new Version(scriptPath.append("VERSION"));
-  Future f = version.getVersion();
-  f.then((currentVersion) {
-    print(currentVersion);
-  }).catchError((e) {
-    print("Could not create version number, failed with: $e");
-    var trace = getAttachedStackTrace(e);
-    if (trace != null) print("StackTrace: $trace");
-    return true;
-  });
-}
diff --git a/utils/compiler/create_snapshot.dart b/utils/compiler/create_snapshot.dart
index e48900f..5e429bd 100644
--- a/utils/compiler/create_snapshot.dart
+++ b/utils/compiler/create_snapshot.dart
@@ -5,19 +5,15 @@
 import 'dart:io';
 
 Future<String> getVersion(var options, var rootPath) {
-  var os = Platform.operatingSystem;
-  var suffix = os == 'windows' ? '.exe' : '';
-  var checkedInBinary =
-      rootPath.join(new Path('tools/testing/bin/$os/dart$suffix'));
-  var versionPath = rootPath.append("tools").append("version.dart");
-  return Process.run(checkedInBinary.toNativePath(),
-                     [versionPath.toNativePath()])
-      .then((result) {
-        if (result.exitCode != 0) {
-          throw "Could not generate version";
-        }
-        return result.stdout.trim();
-      });
+  var suffix = Platform.operatingSystem == 'windows' ? '.exe' : '';
+  var printVersionScript =
+      rootPath.append("tools").append("print_version.py").toNativePath();
+  return Process.run("python$suffix", [printVersionScript]).then((result) {
+    if (result.exitCode != 0) {
+      throw "Could not generate version";
+    }
+    return result.stdout.trim();
+  });
 }
 
 Future<String> getSnapshotGenerationFile(var options, var args, var rootPath) {
