Version 0.5.17.0

 svn merge -r 23796:23890 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@23893 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkg/analyzer_experimental/bin/coverage.dart b/pkg/analyzer_experimental/bin/coverage.dart
new file mode 100644
index 0000000..87be02e
--- /dev/null
+++ b/pkg/analyzer_experimental/bin/coverage.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library runtime.coverage;
+
+import "package:logging/logging.dart" as log;
+
+import 'package:analyzer_experimental/src/services/runtime/coverage_impl.dart';
+
+
+main() {
+  var logger = log.Logger.root;
+  logger.level = log.Level.ALL;
+  logger.onRecord.listen((log.LogRecord record) {
+    String levelString = record.level.toString();
+    while (levelString.length < 6) levelString += ' ';
+    print('${record.time}: ${levelString} ${record.message}');
+  });
+  // TODO(scheglov) get script from options
+  new CoverageServer('/Users/scheglov/dart/Test/bin').start();
+}
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/generated/ast.dart b/pkg/analyzer_experimental/lib/src/generated/ast.dart
index f18ed43..0adebba 100644
--- a/pkg/analyzer_experimental/lib/src/generated/ast.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/ast.dart
@@ -9,7 +9,7 @@
 import 'scanner.dart';
 import 'engine.dart' show AnalysisEngine;
 import 'utilities_dart.dart';
-import 'element.dart' hide Annotation;
+import 'element.dart';
 /**
  * The abstract class {@code ASTNode} defines the behavior common to all nodes in the AST structure
  * for a Dart program.
diff --git a/pkg/analyzer_experimental/lib/src/generated/element.dart b/pkg/analyzer_experimental/lib/src/generated/element.dart
index 62e1d3d..5cc4a23 100644
--- a/pkg/analyzer_experimental/lib/src/generated/element.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/element.dart
@@ -13,20 +13,6 @@
 import 'constant.dart' show EvaluationResultImpl;
 import 'utilities_dart.dart';
 /**
- * The interface {@code Annotation} defines the behavior of objects representing a single annotation
- * associated with an element.
- * @coverage dart.engine.element
- */
-abstract class Annotation {
-
-  /**
-   * Return the element representing the field, variable, or const constructor being used as an
-   * annotation.
-   * @return the field, variable, or constructor being used as an annotation
-   */
-  Element get element;
-}
-/**
  * The interface {@code ClassElement} defines the behavior of elements that represent a class.
  * @coverage dart.engine.element
  */
@@ -258,8 +244,8 @@
 abstract class ClassMemberElement implements Element {
 
   /**
-   * Return the type in which this constructor is defined.
-   * @return the type in which this constructor is defined
+   * Return the type in which this member is defined.
+   * @return the type in which this member is defined
    */
   ClassElement get enclosingElement;
 }
@@ -441,7 +427,7 @@
    * Return an array containing all of the metadata associated with this element.
    * @return the metadata associated with this element
    */
-  List<Annotation> get metadata;
+  List<ElementAnnotation> get metadata;
 
   /**
    * Return the name of this element, or {@code null} if this element does not have a name.
@@ -490,6 +476,20 @@
   void visitChildren(ElementVisitor<Object> visitor);
 }
 /**
+ * The interface {@code ElementAnnotation} defines the behavior of objects representing a single
+ * annotation associated with an element.
+ * @coverage dart.engine.element
+ */
+abstract class ElementAnnotation {
+
+  /**
+   * Return the element representing the field, variable, or const constructor being used as an
+   * annotation.
+   * @return the field, variable, or constructor being used as an annotation
+   */
+  Element get element;
+}
+/**
  * The enumeration {@code ElementKind} defines the various kinds of elements in the element model.
  * @coverage dart.engine.element
  */
@@ -768,11 +768,11 @@
   List<TypeVariableElement> get typeVariables;
 }
 /**
- * The interface {@code HideCombinator} defines the behavior of combinators that cause some of the
- * names in a namespace to be hidden when being imported.
+ * The interface {@code HideElementCombinator} defines the behavior of combinators that cause some
+ * of the names in a namespace to be hidden when being imported.
  * @coverage dart.engine.element
  */
-abstract class HideCombinator implements NamespaceCombinator {
+abstract class HideElementCombinator implements NamespaceCombinator {
 
   /**
    * Return an array containing the names that are not to be made visible in the importing library
@@ -1019,6 +1019,13 @@
 abstract class ParameterElement implements LocalElement, VariableElement {
 
   /**
+   * Return a source range that covers the portion of the source in which the default value for this
+   * parameter is specified, or {@code null} if there is no default value.
+   * @return the range of characters in which the default value of this parameter is specified
+   */
+  SourceRange get defaultValueRange;
+
+  /**
    * Return the kind of this parameter.
    * @return the kind of this parameter
    */
@@ -1157,11 +1164,11 @@
   bool isStatic();
 }
 /**
- * The interface {@code ShowCombinator} defines the behavior of combinators that cause some of the
- * names in a namespace to be visible (and the rest hidden) when being imported.
+ * The interface {@code ShowElementCombinator} defines the behavior of combinators that cause some
+ * of the names in a namespace to be visible (and the rest hidden) when being imported.
  * @coverage dart.engine.element
  */
-abstract class ShowCombinator implements NamespaceCombinator {
+abstract class ShowElementCombinator implements NamespaceCombinator {
 
   /**
    * Return an array containing the names that are to be made visible in the importing library if
@@ -1481,33 +1488,6 @@
   R visitTypeVariableElement(TypeVariableElement element) => null;
 }
 /**
- * Instances of the class {@code AnnotationImpl} implement an {@link Annotation}.
- * @coverage dart.engine.element
- */
-class AnnotationImpl implements Annotation {
-
-  /**
-   * The element representing the field, variable, or constructor being used as an annotation.
-   */
-  Element _element;
-
-  /**
-   * An empty array of annotations.
-   */
-  static List<AnnotationImpl> EMPTY_ARRAY = new List<AnnotationImpl>(0);
-
-  /**
-   * Initialize a newly created annotation.
-   * @param element the element representing the field, variable, or constructor being used as an
-   * annotation
-   */
-  AnnotationImpl(Element element) {
-    this._element = element;
-  }
-  Element get element => _element;
-  String toString() => "@${_element.toString()}";
-}
-/**
  * Instances of the class {@code ClassElementImpl} implement a {@code ClassElement}.
  * @coverage dart.engine.element
  */
@@ -2345,6 +2325,33 @@
   }
 }
 /**
+ * Instances of the class {@code ElementAnnotationImpl} implement an {@link ElementAnnotation}.
+ * @coverage dart.engine.element
+ */
+class ElementAnnotationImpl implements ElementAnnotation {
+
+  /**
+   * The element representing the field, variable, or constructor being used as an annotation.
+   */
+  Element _element;
+
+  /**
+   * An empty array of annotations.
+   */
+  static List<ElementAnnotationImpl> EMPTY_ARRAY = new List<ElementAnnotationImpl>(0);
+
+  /**
+   * Initialize a newly created annotation.
+   * @param element the element representing the field, variable, or constructor being used as an
+   * annotation
+   */
+  ElementAnnotationImpl(Element element) {
+    this._element = element;
+  }
+  Element get element => _element;
+  String toString() => "@${_element.toString()}";
+}
+/**
  * The abstract class {@code ElementImpl} implements the behavior common to objects that implement
  * an {@link Element}.
  * @coverage dart.engine.element
@@ -2376,7 +2383,7 @@
   /**
    * An array containing all of the metadata associated with this element.
    */
-  List<Annotation> _metadata = AnnotationImpl.EMPTY_ARRAY;
+  List<ElementAnnotation> _metadata = ElementAnnotationImpl.EMPTY_ARRAY;
 
   /**
    * A cached copy of the calculated hashCode for this element.
@@ -2439,7 +2446,7 @@
   Element get enclosingElement => _enclosingElement;
   LibraryElement get library => getAncestor(LibraryElement);
   ElementLocation get location => new ElementLocationImpl.con1(this);
-  List<Annotation> get metadata => _metadata;
+  List<ElementAnnotation> get metadata => _metadata;
   String get name => _name;
   int get nameOffset => _nameOffset;
   Source get source {
@@ -2466,7 +2473,7 @@
    * Set the metadata associate with this element to the given array of annotations.
    * @param metadata the metadata to be associated with this element
    */
-  void set metadata(List<Annotation> metadata2) {
+  void set metadata(List<ElementAnnotation> metadata2) {
     this._metadata = metadata2;
   }
 
@@ -2625,7 +2632,23 @@
       return false;
     }
     ElementLocationImpl location = object as ElementLocationImpl;
-    return JavaArrays.equals(_components, location._components);
+    List<String> otherComponents = location._components;
+    int length = _components.length;
+    if (otherComponents.length != length) {
+      return false;
+    }
+    if (length > 0 && !equalSourceComponents(_components[0], otherComponents[0])) {
+      return false;
+    }
+    if (length > 1 && !equalSourceComponents(_components[1], otherComponents[1])) {
+      return false;
+    }
+    for (int i = 2; i < length; i++) {
+      if (_components[i] != otherComponents[i]) {
+        return false;
+      }
+    }
+    return true;
   }
 
   /**
@@ -2694,6 +2717,25 @@
       builder.appendChar(currentChar);
     }
   }
+
+  /**
+   * Return {@code true} if the given components, when interpreted to be encoded sources with a
+   * leading source type indicator, are equal when the source type's are ignored.
+   * @param left the left component being compared
+   * @param right the right component being compared
+   * @return {@code true} if the given components are equal when the source type's are ignored
+   */
+  bool equalSourceComponents(String left, String right) {
+    if (left == null) {
+      return right == null;
+    } else if (right == null) {
+      return false;
+    }
+    if (left.length <= 1 || right.length <= 1) {
+      return left == right;
+    }
+    return left.substring(1) == right.substring(1);
+  }
 }
 /**
  * Instances of the class {@code EmbeddedHtmlScriptElementImpl} implement an{@link EmbeddedHtmlScriptElement}.
@@ -3108,7 +3150,7 @@
   _jtd_constructor_208_impl(int nameOffset) {
   }
   accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
-  String get identifier => name;
+  String get identifier => "${name}@${nameOffset}";
   ElementKind get kind => ElementKind.FUNCTION;
   SourceRange get visibleRange {
     if (_visibleRangeLength < 0) {
@@ -3255,10 +3297,10 @@
   }
 }
 /**
- * Instances of the class {@code ShowCombinatorImpl} implement a {@link ShowCombinator}.
+ * Instances of the class {@code HideElementCombinatorImpl} implement a{@link HideElementCombinator}.
  * @coverage dart.engine.element
  */
-class HideCombinatorImpl implements HideCombinator {
+class HideElementCombinatorImpl implements HideElementCombinator {
 
   /**
    * The names that are not to be made visible in the importing library even if they are defined in
@@ -3822,6 +3864,7 @@
     builder.append(" ");
     builder.append(displayName);
   }
+  String get identifier => "${super.identifier}@${nameOffset}";
 }
 /**
  * Instances of the class {@code MethodElementImpl} implement a {@code MethodElement}.
@@ -3972,7 +4015,7 @@
   ElementKind get kind => ElementKind.ERROR;
   LibraryElement get library => null;
   ElementLocation get location => null;
-  List<Annotation> get metadata => AnnotationImpl.EMPTY_ARRAY;
+  List<ElementAnnotation> get metadata => ElementAnnotationImpl.EMPTY_ARRAY;
   String get name => _name;
   int get nameOffset => -1;
   Source get source => null;
@@ -4050,6 +4093,17 @@
   ParameterKind _parameterKind;
 
   /**
+   * The offset to the beginning of the default value range for this element.
+   */
+  int _defaultValueRangeOffset = 0;
+
+  /**
+   * The length of the default value range for this element, or {@code -1} if this element does not
+   * have a default value.
+   */
+  int _defaultValueRangeLength = -1;
+
+  /**
    * The offset to the beginning of the visible range for this element.
    */
   int _visibleRangeOffset = 0;
@@ -4072,6 +4126,12 @@
   ParameterElementImpl(Identifier name) : super.con1(name) {
   }
   accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
+  SourceRange get defaultValueRange {
+    if (_defaultValueRangeLength < 0) {
+      return null;
+    }
+    return new SourceRange(_defaultValueRangeOffset, _defaultValueRangeLength);
+  }
   ElementKind get kind => ElementKind.PARAMETER;
   ParameterKind get parameterKind => _parameterKind;
   List<ParameterElement> get parameters => _parameters;
@@ -4084,6 +4144,18 @@
   bool isInitializingFormal() => false;
 
   /**
+   * Set the range of the default value for this parameter to the range starting at the given offset
+   * with the given length.
+   * @param offset the offset to the beginning of the default value range for this element
+   * @param length the length of the default value range for this element, or {@code -1} if this
+   * element does not have a default value
+   */
+  void setDefaultValueRange(int offset, int length) {
+    _defaultValueRangeOffset = offset;
+    _defaultValueRangeLength = length;
+  }
+
+  /**
    * Set the kind of this parameter to the given kind.
    * @param parameterKind the new kind of this parameter
    */
@@ -4355,10 +4427,10 @@
   }
 }
 /**
- * Instances of the class {@code ShowCombinatorImpl} implement a {@link ShowCombinator}.
+ * Instances of the class {@code ShowElementCombinatorImpl} implement a{@link ShowElementCombinator}.
  * @coverage dart.engine.element
  */
-class ShowCombinatorImpl implements ShowCombinator {
+class ShowElementCombinatorImpl implements ShowElementCombinator {
 
   /**
    * The names that are to be made visible in the importing library if they are defined in the
@@ -4790,7 +4862,7 @@
   ElementKind get kind => _baseElement.kind;
   LibraryElement get library => _baseElement.library;
   ElementLocation get location => _baseElement.location;
-  List<Annotation> get metadata => _baseElement.metadata;
+  List<ElementAnnotation> get metadata => _baseElement.metadata;
   String get name => _baseElement.name;
   int get nameOffset => _baseElement.nameOffset;
   Source get source => _baseElement.source;
@@ -4975,6 +5047,7 @@
     return element;
   }
   ParameterElement get baseElement => super.baseElement as ParameterElement;
+  SourceRange get defaultValueRange => baseElement.defaultValueRange;
   Element get enclosingElement => baseElement.enclosingElement;
   ParameterKind get parameterKind => baseElement.parameterKind;
   List<ParameterElement> get parameters {
@@ -5202,7 +5275,7 @@
       return false;
     }
     JavaIterator<MapEntry<String, Type2>> firstIterator = new JavaIterator(getMapEntrySet(firstTypes));
-    JavaIterator<MapEntry<String, Type2>> secondIterator = new JavaIterator(getMapEntrySet(firstTypes));
+    JavaIterator<MapEntry<String, Type2>> secondIterator = new JavaIterator(getMapEntrySet(secondTypes));
     while (firstIterator.hasNext) {
       MapEntry<String, Type2> firstEntry = firstIterator.next();
       MapEntry<String, Type2> secondEntry = secondIterator.next();
@@ -5904,17 +5977,24 @@
     return isMoreSpecificThan2((type as InterfaceType), new Set<ClassElement>());
   }
   bool isObject() => element.supertype == null;
-  bool isSubtypeOf(Type2 type) {
-    if (identical(type, DynamicTypeImpl.instance)) {
+  bool isSubtypeOf(Type2 type2) {
+    if (identical(type2, DynamicTypeImpl.instance)) {
       return true;
-    } else if (type is TypeVariableType) {
+    } else if (type2 is TypeVariableType) {
       return true;
-    } else if (type is! InterfaceType) {
+    } else if (type2 is FunctionType) {
+      ClassElement element = this.element;
+      MethodElement callMethod = element.lookUpMethod("call", element.library);
+      if (callMethod != null) {
+        return callMethod.type.isSubtypeOf(type2);
+      }
       return false;
-    } else if (this == type) {
+    } else if (type2 is! InterfaceType) {
+      return false;
+    } else if (this == type2) {
       return true;
     }
-    return isSubtypeOf2((type as InterfaceType), new Set<ClassElement>());
+    return isSubtypeOf2((type2 as InterfaceType), new Set<ClassElement>());
   }
   ConstructorElement lookUpConstructor(String constructorName, LibraryElement library) {
     ConstructorElement constructorElement;
diff --git a/pkg/analyzer_experimental/lib/src/generated/engine.dart b/pkg/analyzer_experimental/lib/src/generated/engine.dart
index 0b7365a..fd4a2e5 100644
--- a/pkg/analyzer_experimental/lib/src/generated/engine.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/engine.dart
@@ -1923,15 +1923,6 @@
     if (source == null) {
       return null;
     }
-    List<CharSequence> contentHolder = new List<CharSequence>(1);
-    try {
-      source.getContents(new Source_ContentReceiver_6(contentHolder));
-    } catch (exception) {
-      throw new AnalysisException.con2("Could not get contents of ${source.fullName}", exception);
-    }
-    if (contentHolder[0] == null) {
-      return null;
-    }
     CompilationUnit unit = parseCompilationUnit(source);
     if (unit == null) {
       return null;
@@ -1944,8 +1935,11 @@
         if (comment == null) {
           return null;
         }
-        int offset = comment.offset;
-        return contentHolder[0].subSequence(offset, offset + comment.length).toString();
+        JavaStringBuilder builder = new JavaStringBuilder();
+        for (Token token in comment.tokens) {
+          builder.append(token.lexeme);
+        }
+        return builder.toString();
       }
       nameNode = nameNode.parent;
     }
@@ -2738,7 +2732,7 @@
    */
   List<Source> getLibrarySources2(Source htmlSource, HtmlUnit htmlUnit) {
     List<Source> libraries = new List<Source>();
-    htmlUnit.accept(new RecursiveXmlVisitor_7(this, htmlSource, libraries));
+    htmlUnit.accept(new RecursiveXmlVisitor_6(this, htmlSource, libraries));
     if (libraries.isEmpty) {
       return Source.EMPTY_ARRAY;
     }
@@ -2893,7 +2887,7 @@
   }
   AnalysisContextImpl_ScanResult internalScan(Source source, AnalysisErrorListener errorListener) {
     AnalysisContextImpl_ScanResult result = new AnalysisContextImpl_ScanResult();
-    Source_ContentReceiver receiver = new Source_ContentReceiver_8(source, errorListener, result);
+    Source_ContentReceiver receiver = new Source_ContentReceiver_7(source, errorListener, result);
     try {
       source.getContents(receiver);
     } catch (exception) {
@@ -3219,21 +3213,11 @@
    */
   List<int> _lineStarts;
 }
-class Source_ContentReceiver_6 implements Source_ContentReceiver {
-  List<CharSequence> contentHolder;
-  Source_ContentReceiver_6(this.contentHolder);
-  void accept(CharBuffer contents, int modificationTime) {
-    contentHolder[0] = contents;
-  }
-  void accept2(String contents, int modificationTime) {
-    contentHolder[0] = new CharSequence(contents);
-  }
-}
-class RecursiveXmlVisitor_7 extends RecursiveXmlVisitor<Object> {
+class RecursiveXmlVisitor_6 extends RecursiveXmlVisitor<Object> {
   final AnalysisContextImpl AnalysisContextImpl_this;
   Source htmlSource;
   List<Source> libraries;
-  RecursiveXmlVisitor_7(this.AnalysisContextImpl_this, this.htmlSource, this.libraries) : super();
+  RecursiveXmlVisitor_6(this.AnalysisContextImpl_this, this.htmlSource, this.libraries) : super();
   Object visitXmlTagNode(XmlTagNode node) {
     if (javaStringEqualsIgnoreCase(node.tag.lexeme, AnalysisContextImpl._TAG_SCRIPT)) {
       bool isDartScript = false;
@@ -3263,11 +3247,11 @@
     return super.visitXmlTagNode(node);
   }
 }
-class Source_ContentReceiver_8 implements Source_ContentReceiver {
+class Source_ContentReceiver_7 implements Source_ContentReceiver {
   Source source;
   AnalysisErrorListener errorListener;
   AnalysisContextImpl_ScanResult result;
-  Source_ContentReceiver_8(this.source, this.errorListener, this.result);
+  Source_ContentReceiver_7(this.source, this.errorListener, this.result);
   void accept(CharBuffer contents, int modificationTime2) {
     CharBufferScanner scanner = new CharBufferScanner(source, contents, errorListener);
     result._modificationTime = modificationTime2;
@@ -4296,8 +4280,9 @@
    * @return an array of errors (not {@code null}, contains no {@code null}s)
    */
   List<AnalysisError> get errors {
-    Set<MapEntry<Source, List<AnalysisError>>> entrySet = getMapEntrySet(_errors);
-    if (entrySet.length == 0) {
+    Iterable<MapEntry<Source, List<AnalysisError>>> entrySet = getMapEntrySet(_errors);
+    int numEntries = entrySet.length;
+    if (numEntries == 0) {
       return AnalysisError.NO_ERRORS;
     }
     List<AnalysisError> resultList = new List<AnalysisError>();
diff --git a/pkg/analyzer_experimental/lib/src/generated/error.dart b/pkg/analyzer_experimental/lib/src/generated/error.dart
index 018ee78..6061cb0 100644
--- a/pkg/analyzer_experimental/lib/src/generated/error.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/error.dart
@@ -170,6 +170,14 @@
   }
 
   /**
+   * Creates an error with properties with the given error code and arguments.
+   * @param errorCode the error code of the error to be reported
+   * @param node the node specifying the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  AnalysisErrorWithProperties newErrorWithProperties(ErrorCode errorCode, ASTNode node, List<Object> arguments) => new AnalysisErrorWithProperties.con2(_source, node.offset, node.length, errorCode, arguments);
+
+  /**
    * Report a passed error.
    * @param error the error to report
    */
diff --git a/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart b/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
index 6821936..0f62806 100644
--- a/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/instrumentation.dart
@@ -32,13 +32,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_12();
 
   /**
    * 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_13();
 
   /**
    * The current instrumentation logger.
@@ -85,7 +85,7 @@
     _CURRENT_LOGGER = logger2 == null ? _NULL_LOGGER : logger2;
   }
 }
-class InstrumentationBuilder_13 implements InstrumentationBuilder {
+class InstrumentationBuilder_12 implements InstrumentationBuilder {
   InstrumentationBuilder data(String name, bool value) => this;
   InstrumentationBuilder data2(String name, int value) => this;
   InstrumentationBuilder data3(String name, String value) => this;
@@ -99,7 +99,7 @@
   InstrumentationBuilder metric4(String name, List<String> value) => this;
   InstrumentationBuilder record(Exception exception) => this;
 }
-class InstrumentationLogger_14 implements InstrumentationLogger {
+class InstrumentationLogger_13 implements InstrumentationLogger {
   InstrumentationBuilder createBuilder(String name) => Instrumentation._NULL_INSTRUMENTATION_BUILDER;
 }
 /**
diff --git a/pkg/analyzer_experimental/lib/src/generated/java_core.dart b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
index e8b1047..7e90245 100644
--- a/pkg/analyzer_experimental/lib/src/generated/java_core.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/java_core.dart
@@ -293,10 +293,6 @@
   String toString() => "URISyntaxException";
 }
 
-class IOException implements Exception {
-  String toString() => "IOException";
-}
-
 class MissingFormatArgumentException implements Exception {
   final String s;
 
diff --git a/pkg/analyzer_experimental/lib/src/generated/parser.dart b/pkg/analyzer_experimental/lib/src/generated/parser.dart
index b03b6f2..bd5a1dc 100644
--- a/pkg/analyzer_experimental/lib/src/generated/parser.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/parser.dart
@@ -495,7 +495,7 @@
    * Create a synthetic token representing the given keyword.
    * @return the synthetic token that was created
    */
-  Token createSyntheticToken(Keyword keyword) => new KeywordToken_11(keyword, _currentToken.offset);
+  Token createSyntheticToken(Keyword keyword) => new KeywordToken_10(keyword, _currentToken.offset);
 
   /**
    * Create a synthetic token with the given type.
@@ -1672,7 +1672,7 @@
     }
     try {
       List<bool> errorFound = [false];
-      AnalysisErrorListener listener = new AnalysisErrorListener_12(errorFound);
+      AnalysisErrorListener listener = new AnalysisErrorListener_11(errorFound);
       StringScanner scanner = new StringScanner(null, referenceSource, listener);
       scanner.setSourceStart(1, 1, sourceOffset);
       Token firstToken = scanner.tokenize();
@@ -5187,13 +5187,13 @@
     }
   }
 }
-class KeywordToken_11 extends KeywordToken {
-  KeywordToken_11(Keyword arg0, int arg1) : super(arg0, arg1);
+class KeywordToken_10 extends KeywordToken {
+  KeywordToken_10(Keyword arg0, int arg1) : super(arg0, arg1);
   int get length => 0;
 }
-class AnalysisErrorListener_12 implements AnalysisErrorListener {
+class AnalysisErrorListener_11 implements AnalysisErrorListener {
   List<bool> errorFound;
-  AnalysisErrorListener_12(this.errorFound);
+  AnalysisErrorListener_11(this.errorFound);
   void onError(AnalysisError error) {
     errorFound[0] = true;
   }
diff --git a/pkg/analyzer_experimental/lib/src/generated/resolver.dart b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
index abc4eb0..3a052ac 100644
--- a/pkg/analyzer_experimental/lib/src/generated/resolver.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
@@ -12,11 +12,10 @@
 import 'ast.dart';
 import 'parser.dart' show Parser, ParserErrorCode;
 import 'sdk.dart' show DartSdk, SdkLibrary;
-import 'element.dart' hide Annotation, HideCombinator, ShowCombinator;
+import 'element.dart';
 import 'html.dart' as ht;
 import 'engine.dart';
 import 'constant.dart';
-import 'element.dart' as __imp_combi show HideCombinator, ShowCombinator;
 /**
  * Instances of the class {@code CompilationUnitBuilder} build an element model for a single
  * compilation unit.
@@ -217,6 +216,10 @@
     parameter.final2 = node.isFinal();
     parameter.initializer = initializer;
     parameter.parameterKind = node.kind;
+    Expression defaultValue = node.defaultValue;
+    if (defaultValue != null) {
+      parameter.setDefaultValueRange(defaultValue.offset, defaultValue.length);
+    }
     FunctionBody body = getFunctionBody(node);
     if (body != null) {
       parameter.setVisibleRange(body.offset, body.length);
@@ -2216,11 +2219,11 @@
    * @param annotationList the list of elements to which new elements are to be added
    * @param annotations the AST nodes used to generate new elements
    */
-  void addAnnotations(List<AnnotationImpl> annotationList, NodeList<Annotation> annotations) {
+  void addAnnotations(List<ElementAnnotationImpl> annotationList, NodeList<Annotation> annotations) {
     for (Annotation annotationNode in annotations) {
       Element resolvedElement = annotationNode.element;
       if (resolvedElement != null) {
-        annotationList.add(new AnnotationImpl(resolvedElement));
+        annotationList.add(new ElementAnnotationImpl(resolvedElement));
       }
     }
   }
@@ -3218,7 +3221,7 @@
     if (element is! ElementImpl) {
       return;
     }
-    List<AnnotationImpl> annotationList = new List<AnnotationImpl>();
+    List<ElementAnnotationImpl> annotationList = new List<ElementAnnotationImpl>();
     addAnnotations(annotationList, node.metadata);
     if (node is VariableDeclaration && node.parent is VariableDeclarationList) {
       VariableDeclarationList list = node.parent as VariableDeclarationList;
@@ -4484,11 +4487,11 @@
     List<NamespaceCombinator> combinators = new List<NamespaceCombinator>();
     for (Combinator combinator in directive.combinators) {
       if (combinator is HideCombinator) {
-        HideCombinatorImpl hide = new HideCombinatorImpl();
+        HideElementCombinatorImpl hide = new HideElementCombinatorImpl();
         hide.hiddenNames = getIdentifiers(((combinator as HideCombinator)).hiddenNames);
         combinators.add(hide);
       } else {
-        ShowCombinatorImpl show = new ShowCombinatorImpl();
+        ShowElementCombinatorImpl show = new ShowElementCombinatorImpl();
         show.shownNames = getIdentifiers(((combinator as ShowCombinator)).shownNames);
         combinators.add(show);
       }
@@ -4827,7 +4830,7 @@
       CompilationUnit unit = library.getAST(source);
       ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, library.libraryElement, _typeProvider, library.inheritanceManager);
       unit.accept(errorVerifier);
-      unit.accept(new PubVerifier(errorReporter));
+      unit.accept(new PubVerifier(_analysisContext, errorReporter));
       ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _typeProvider);
       unit.accept(constantVerifier);
     }
@@ -7300,7 +7303,7 @@
     }
     if (identical(operator, sc.TokenType.MINUS) || identical(operator, sc.TokenType.PERCENT) || identical(operator, sc.TokenType.PLUS) || identical(operator, sc.TokenType.STAR)) {
       Type2 doubleType = _typeProvider.doubleType;
-      if (identical(getStaticType(node.leftOperand), doubleType) || identical(getStaticType(node.rightOperand), doubleType)) {
+      if (identical(getStaticType(node.leftOperand), _typeProvider.intType) && identical(getStaticType(node.rightOperand), doubleType)) {
         return doubleType;
       }
     }
@@ -9108,10 +9111,10 @@
    */
   Map<String, Element> apply(Map<String, Element> definedNames, List<NamespaceCombinator> combinators) {
     for (NamespaceCombinator combinator in combinators) {
-      if (combinator is __imp_combi.HideCombinator) {
-        hide(definedNames, ((combinator as __imp_combi.HideCombinator)).hiddenNames);
-      } else if (combinator is __imp_combi.ShowCombinator) {
-        definedNames = show(definedNames, ((combinator as __imp_combi.ShowCombinator)).shownNames);
+      if (combinator is HideElementCombinator) {
+        hide(definedNames, ((combinator as HideElementCombinator)).hiddenNames);
+      } else if (combinator is ShowElementCombinator) {
+        definedNames = show(definedNames, ((combinator as ShowElementCombinator)).shownNames);
       } else {
         AnalysisEngine.instance.logger.logError("Unknown type of combinator: ${combinator.runtimeType.toString()}");
       }
@@ -9579,7 +9582,7 @@
    * @param expression the expression to validate
    */
   void validateInitializerExpression(List<ParameterElement> parameterElements, Expression expression) {
-    EvaluationResultImpl result = expression.accept(new ConstantVisitor_10(this, parameterElements));
+    EvaluationResultImpl result = expression.accept(new ConstantVisitor_9(this, parameterElements));
     reportErrors(result, CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER);
   }
 
@@ -9622,10 +9625,10 @@
     }
   }
 }
-class ConstantVisitor_10 extends ConstantVisitor {
+class ConstantVisitor_9 extends ConstantVisitor {
   final ConstantVerifier ConstantVerifier_this;
   List<ParameterElement> parameterElements;
-  ConstantVisitor_10(this.ConstantVerifier_this, this.parameterElements) : super();
+  ConstantVisitor_9(this.ConstantVerifier_this, this.parameterElements) : super();
   EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) {
     Element element = node.element;
     for (ParameterElement parameterElement in parameterElements) {
@@ -11908,17 +11911,20 @@
         stringTypeArray[i] = ((missingOverridesArray[i] as PropertyAccessorElement)).isGetter() ? GET : SET;
       }
     }
+    AnalysisErrorWithProperties analysisError;
     if (missingOverridesSize == 1) {
-      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName]);
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName]);
     } else if (missingOverridesSize == 2) {
-      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName]);
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName]);
     } else if (missingOverridesSize == 3) {
-      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName]);
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName]);
     } else if (missingOverridesSize == 4) {
-      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName, stringTypeArray[3], missingOverridesArray[3].enclosingElement.displayName, missingOverridesArray[3].displayName]);
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName, stringTypeArray[3], missingOverridesArray[3].enclosingElement.displayName, missingOverridesArray[3].displayName]);
     } else {
-      _errorReporter.reportError2(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName, stringTypeArray[3], missingOverridesArray[3].enclosingElement.displayName, missingOverridesArray[3].displayName, missingOverridesArray.length - 4]);
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName, stringTypeArray[3], missingOverridesArray[3].enclosingElement.displayName, missingOverridesArray[3].displayName, missingOverridesArray.length - 4]);
     }
+    analysisError.setProperty(ErrorProperty.UNIMPLEMENTED_METHODS, missingOverridesArray);
+    _errorReporter.reportError(analysisError);
     return true;
   }
 
@@ -12642,12 +12648,19 @@
  * 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(ErrorReporter errorReporter) {
+  PubVerifier(AnalysisContext context, ErrorReporter errorReporter) {
+    this._context = context;
     this._errorReporter = errorReporter;
   }
   Object visitImportDirective(ImportDirective directive) {
@@ -12655,14 +12668,17 @@
   }
 
   /**
-   * Determine if the file file path lies inside the "lib" directory hierarchy but references a file
-   * outside that directory hierarchy.
-   * @param directive the import directive (not {@code 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 {@code null})
    * @param path the file path being verified (not {@code null})
-   * @return {@code true} if the file is inside but references a file outside
+   * @return {@code 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(ImportDirective directive, String path) {
-    String fullName = getSourceFullName(directive);
+  bool checkForFileImportInsideLibReferencesFileOutside(StringLiteral uriLiteral, String path) {
+    Source source = getSource(uriLiteral);
+    String fullName = getSourceFullName(source);
     if (fullName != null) {
       int pathIndex = 0;
       int fullNameIndex = fullName.length;
@@ -12672,6 +12688,11 @@
           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;
@@ -12681,49 +12702,88 @@
   }
 
   /**
-   * Determine if the given file path lies outside the "lib" directory hierarchy but references a
-   * file inside that directory hierarchy.
-   * @param directive the import directive (not {@code null})
+   * 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 {@code null})
    * @param path the file path being verified (not {@code null})
-   * @return {@code true} if the file is outside but references a file inside
+   * @return {@code 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(ImportDirective directive, String path) {
-    if (path.startsWith("lib/") || path.contains("/lib/")) {
-      String fullName = getSourceFullName(directive);
-      if (fullName != null) {
-        if (!fullName.contains("/lib/")) {
-          return true;
-        }
+  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 = path.indexOf("/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;
   }
 
   /**
-   * Determine if the given package import path contains ".."
+   * This verifies that the passed package import directive does not contain ".."
+   * @param uriLiteral the import URL (not {@code null})
    * @param path the path to be validated (not {@code null})
-   * @return {@code true} if the import path contains ".."
+   * @return {@code true} if and only if an error code is generated on the passed node
+   * @see PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT
    */
-  bool checkForPackageImportContainsDotDot(String path) => path.startsWith("../") || path.contains("/../");
+  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 full name of the source associated with the compilation unit containing the given
-   * AST node. The returned value will have all {@link File#separatorChar} replace by '/'.
+   * Answer the source associated with the compilation unit containing the given AST node.
    * @param node the node (not {@code null})
-   * @return the full name or {@code null} if it could not be determined
+   * @return the source or {@code null} if it could not be determined
    */
-  String getSourceFullName(ASTNode node) {
+  Source getSource(ASTNode node) {
+    Source source = null;
     CompilationUnit unit = node.getAncestor(CompilationUnit);
     if (unit != null) {
       CompilationUnitElement element = unit.element;
       if (element != null) {
-        Source librarySource = element.source;
-        if (librarySource != null) {
-          String fullName = librarySource.fullName;
-          if (fullName != null) {
-            return fullName.replaceAll(r'\', '/');
-          }
-        }
+        source = element.source;
+      }
+    }
+    return source;
+  }
+
+  /**
+   * Answer the full name of the given source. The returned value will have all{@link File#separatorChar} replace by '/'.
+   * @param source the source
+   * @return the full name or {@code 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;
diff --git a/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart b/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
index 2348b7f..baf26d7 100644
--- a/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/sdk_io.dart
@@ -395,7 +395,7 @@
    */
   LibraryMap readFrom(JavaFile librariesFile, String libraryFileContents) {
     List<bool> foundError = [false];
-    AnalysisErrorListener errorListener = new AnalysisErrorListener_9(foundError);
+    AnalysisErrorListener errorListener = new AnalysisErrorListener_8(foundError);
     Source source = new FileBasedSource.con2(null, librariesFile, UriKind.FILE_URI);
     StringScanner scanner = new StringScanner(source, libraryFileContents, errorListener);
     Parser parser = new Parser(source, errorListener);
@@ -494,9 +494,9 @@
     return null;
   }
 }
-class AnalysisErrorListener_9 implements AnalysisErrorListener {
+class AnalysisErrorListener_8 implements AnalysisErrorListener {
   List<bool> foundError;
-  AnalysisErrorListener_9(this.foundError);
+  AnalysisErrorListener_8(this.foundError);
   void onError(AnalysisError error) {
     foundError[0] = true;
   }
diff --git a/pkg/analyzer_experimental/lib/src/services/runtime/coverage_impl.dart b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_impl.dart
new file mode 100644
index 0000000..df37f7b
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_impl.dart
@@ -0,0 +1,157 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A library for code coverage support for Dart.
+library runtime.coverage_impl;
+
+import "dart:io";
+
+import "package:logging/logging.dart" as log;
+import "package:pathos/path.dart" as po;
+
+import 'package:analyzer_experimental/src/generated/source.dart' show Source;
+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';
+import 'package:analyzer_experimental/src/generated/engine.dart' show RecordingErrorListener;
+
+
+log.Logger logger = log.Logger.root;
+
+/// Abstract server that listens requests and serves files, may be rewriting them.
+abstract class RewriteServer {
+  String _basePath;
+  RewriteServer(this._basePath);
+  void start() {
+    HttpServer.bind("127.0.0.1", 3445).then((HttpServer server) {
+      logger.info('RewriteServer is listening at: ${server.port}.');
+      server.listen((HttpRequest request) {
+        var response = request.response;
+        // Prepare path.
+        var path = _basePath + '/' + request.uri.path;
+        path = po.normalize(path);
+        logger.info('[$path] Requested.');
+        // May be serve using just path.
+        {
+          String content = rewritePathContent(path);
+          if (content != null) {
+            logger.info('[$path] Request served by path.');
+            response.write(content);
+            response.close();
+            return;
+          }
+        }
+        // Serve from file.
+        logger.info('[$path] Serving file.');
+        var file = new File(path);
+        file.exists().then((bool found) {
+          if (found) {
+            logger.finest('[$path] Found file.');
+            file.readAsString().then((String content) {
+              logger.finest('[$path] Got file content.');
+              var sw = new Stopwatch();
+              sw.start();
+              try {
+                content = rewriteFileContent(path, content);
+              } finally {
+                sw.stop();
+                logger.fine('[$path] Rewritten in ${sw.elapsedMilliseconds} ms.');
+              }
+              response.write(content);
+              response.close();
+            });
+          } else {
+            logger.severe('[$path] File not found.');
+            response.statusCode = HttpStatus.NOT_FOUND;
+            response.close();
+          }
+        });
+      });
+    });
+  }
+
+  /// Subclasses implement this method to rewrite the provided [code] of the file with [path].
+  /// Returns some content or `null` if file content should be requested.
+  String rewritePathContent(String path);
+
+  /// Subclasses implement this method to rewrite the provided [code] of the file with [path].
+  String rewriteFileContent(String path, String code);
+}
+
+/// Server that rewrites Dart code so that it reports execution of statements and other nodes.
+class CoverageServer extends RewriteServer {
+  CoverageServer(String basePath) : super(basePath);
+
+  String rewritePathContent(String path) {
+    if (path.endsWith('__coverage_impl.dart')) {
+      String implPath = po.joinAll([
+          po.dirname(new Options().script),
+          '..', 'lib', 'src', 'services', 'runtime', 'coverage_lib.dart']);
+      return new File(implPath).readAsStringSync();
+    }
+    return null;
+  }
+
+  String rewriteFileContent(String path, String code) {
+    if (po.extension(path).toLowerCase() != '.dart') return code;
+    if (path.contains('packages')) return code;
+    var unit = _parseCode(code);
+    var injector = new StringInjector(code);
+    // Inject coverage library import.
+    var directives = unit.directives;
+    if (directives.isNotEmpty && directives[0] is LibraryDirective) {
+      injector.inject(directives[0].end, 'import "__coverage_impl.dart" as __cc;');
+    } else {
+      throw new Exception('Only single library coverage is implemented.');
+    }
+    // Insert touch() invocations.
+    unit.accept(new InsertTouchInvocationsVisitor(injector));
+    // Done.
+    code = injector.code;
+    logger.finest('[$path] Rewritten content\n$code');
+    return code;
+  }
+
+  CompilationUnit _parseCode(String code) {
+    var source = null;
+    var errorListener = new RecordingErrorListener();
+    var parser = new Parser(source, errorListener);
+    var scanner = new StringScanner(source, code, errorListener);
+    var token = scanner.tokenize();
+    return parser.parseCompilationUnit(token);
+  }
+}
+
+/// The visitor that inserts `touch` method invocations.
+class InsertTouchInvocationsVisitor extends GeneralizingASTVisitor {
+  StringInjector injector;
+  InsertTouchInvocationsVisitor(this.injector);
+  visitStatement(Statement node) {
+    super.visitStatement(node);
+    var offset = node.end;
+    if (node is Block) {
+      offset--;
+    }
+    if (node is Block && node.parent is BlockFunctionBody) return null;
+    injector.inject(offset, '__cc.touch(${node.offset});');
+    return null;
+  }
+}
+
+/// Helper for injecting fragments into some existing [String].
+class StringInjector {
+  String code;
+  int _lastOffset = -1;
+  int _delta = 0;
+  StringInjector(this.code);
+  void inject(int offset, String fragment) {
+    if (offset < _lastOffset) {
+      throw new ArgumentError('Only forward inserts are supported, was $_lastOffset given $offset');
+    }
+    _lastOffset = offset;
+    offset += _delta;
+    code = code.substring(0, offset) + fragment + code.substring(offset);
+    _delta += fragment.length;
+  }
+}
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/services/runtime/coverage_lib.dart b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_lib.dart
new file mode 100644
index 0000000..945b38f
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_lib.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.
+
+/// This library is injected into the applications under coverage.
+library coverage_lib;
+
+/// Notifies that the object with the given [id] - statement, token, etc was executed.
+touch(int id) {
+  print('touch: $id');
+}
diff --git a/pkg/analyzer_experimental/pubspec.yaml b/pkg/analyzer_experimental/pubspec.yaml
index 848a362..13b0f89 100644
--- a/pkg/analyzer_experimental/pubspec.yaml
+++ b/pkg/analyzer_experimental/pubspec.yaml
@@ -4,6 +4,7 @@
 homepage: http://www.dartlang.org
 dependencies:
   args: any
+  logging: any
   pathos: any
 dev_dependencies:
   unittest: any
diff --git a/pkg/analyzer_experimental/test/generated/ast_test.dart b/pkg/analyzer_experimental/test/generated/ast_test.dart
index a6903cd..ae71ad1b 100644
--- a/pkg/analyzer_experimental/test/generated/ast_test.dart
+++ b/pkg/analyzer_experimental/test/generated/ast_test.dart
@@ -735,7 +735,7 @@
     String source = EngineTestCase.createSource(["class A {", "  bool get g => true;", "}", "class B {", "  int f() {", "    num q() {", "      return 3;", "    }", "  return q() + 4;", "  }", "}", "A f(var p) {", "  if ((p as A).g) {", "    return p;", "  } else {", "    return null;", "  }", "}"]);
     CompilationUnit unit = ParserTestCase.parseCompilationUnit(source, []);
     List<ASTNode> nodes = new List<ASTNode>();
-    BreadthFirstVisitor<Object> visitor = new BreadthFirstVisitor_15(nodes);
+    BreadthFirstVisitor<Object> visitor = new BreadthFirstVisitor_14(nodes);
     visitor.visitAllNodes(unit);
     EngineTestCase.assertSize(59, nodes);
     EngineTestCase.assertInstanceOf(CompilationUnit, nodes[0]);
@@ -753,9 +753,9 @@
     });
   }
 }
-class BreadthFirstVisitor_15 extends BreadthFirstVisitor<Object> {
+class BreadthFirstVisitor_14 extends BreadthFirstVisitor<Object> {
   List<ASTNode> nodes;
-  BreadthFirstVisitor_15(this.nodes) : super();
+  BreadthFirstVisitor_14(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 ca36ed7..a89b723 100644
--- a/pkg/analyzer_experimental/test/generated/element_test.dart
+++ b/pkg/analyzer_experimental/test/generated/element_test.dart
@@ -11,8 +11,8 @@
 import 'package:analyzer_experimental/src/generated/error.dart';
 import 'package:analyzer_experimental/src/generated/scanner.dart';
 import 'package:analyzer_experimental/src/generated/utilities_dart.dart';
-import 'package:analyzer_experimental/src/generated/ast.dart' hide Annotation;
-import 'package:analyzer_experimental/src/generated/element.dart' hide Annotation;
+import 'package:analyzer_experimental/src/generated/ast.dart';
+import 'package:analyzer_experimental/src/generated/element.dart';
 import 'package:analyzer_experimental/src/generated/engine.dart' show AnalysisContext, AnalysisContextImpl;
 import 'package:unittest/unittest.dart' as _ut;
 import 'test_support.dart';
@@ -31,6 +31,11 @@
     ElementLocationImpl second = new ElementLocationImpl.con2(encoding);
     JUnitTestCase.assertTrue(first == second);
   }
+  void test_equals_equalWithDifferentUriKind() {
+    ElementLocationImpl first = new ElementLocationImpl.con2("fa;fb;c");
+    ElementLocationImpl second = new ElementLocationImpl.con2("pa;pb;c");
+    JUnitTestCase.assertTrue(first == second);
+  }
   void test_equals_notEqual_differentLengths() {
     ElementLocationImpl first = new ElementLocationImpl.con2("a;b;c");
     ElementLocationImpl second = new ElementLocationImpl.con2("a;b;c;d");
@@ -69,6 +74,10 @@
         final __test = new ElementLocationImplTest();
         runJUnitTest(__test, __test.test_equals_equal);
       });
+      _ut.test('test_equals_equalWithDifferentUriKind', () {
+        final __test = new ElementLocationImplTest();
+        runJUnitTest(__test, __test.test_equals_equalWithDifferentUriKind);
+      });
       _ut.test('test_equals_notEqual_differentLengths', () {
         final __test = new ElementLocationImplTest();
         runJUnitTest(__test, __test.test_equals_notEqual_differentLengths);
@@ -793,6 +802,13 @@
     JUnitTestCase.assertFalse(dynamicType.isSubtypeOf(typeA));
     JUnitTestCase.assertTrue(typeA.isSubtypeOf(dynamicType));
   }
+  void test_isSubtypeOf_function() {
+    InterfaceType stringType = _typeProvider.stringType;
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.methods = <MethodElement> [ElementFactory.methodElement("call", VoidTypeImpl.instance, [stringType])];
+    FunctionType functionType = ElementFactory.functionElement5("f", <ClassElement> [stringType.element]).type;
+    JUnitTestCase.assertTrue(classA.type.isSubtypeOf(functionType));
+  }
   void test_isSubtypeOf_interface() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -1368,6 +1384,10 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_dynamic);
       });
+      _ut.test('test_isSubtypeOf_function', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_function);
+      });
       _ut.test('test_isSubtypeOf_interface', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_interface);
@@ -2206,7 +2226,7 @@
   }
   void test_isSubtypeOf_baseCase_classFunction() {
     ClassElementImpl functionElement = ElementFactory.classElement2("Function", []);
-    InterfaceTypeImpl functionType = new InterfaceTypeImpl_19(functionElement);
+    InterfaceTypeImpl functionType = new InterfaceTypeImpl_18(functionElement);
     FunctionType f = ElementFactory.functionElement("f").type;
     JUnitTestCase.assertTrue(f.isSubtypeOf(functionType));
   }
@@ -2389,6 +2409,30 @@
     FunctionType s = ElementFactory.functionElement2("s", ElementFactory.classElement2("B", [])).type;
     JUnitTestCase.assertFalse(t.isSubtypeOf(s));
   }
+  void test_isSubtypeOf_typeParameters_matchesBounds() {
+    TestTypeProvider provider = new TestTypeProvider();
+    InterfaceType boolType = provider.boolType;
+    InterfaceType stringType = provider.stringType;
+    TypeVariableElementImpl variableB = new TypeVariableElementImpl(ASTFactory.identifier3("B"));
+    variableB.bound = boolType;
+    TypeVariableTypeImpl typeB = new TypeVariableTypeImpl(variableB);
+    TypeVariableElementImpl variableS = new TypeVariableElementImpl(ASTFactory.identifier3("S"));
+    variableS.bound = stringType;
+    TypeVariableTypeImpl typeS = new TypeVariableTypeImpl(variableS);
+    FunctionElementImpl functionAliasElement = new FunctionElementImpl.con1(ASTFactory.identifier3("func"));
+    FunctionTypeImpl functionAliasType = new FunctionTypeImpl.con1(functionAliasElement);
+    functionAliasElement.type = functionAliasType;
+    functionAliasType.returnType = stringType;
+    functionAliasType.normalParameterTypes = <Type2> [typeB];
+    functionAliasType.optionalParameterTypes = <Type2> [typeS];
+    FunctionElementImpl functionElement = new FunctionElementImpl.con1(ASTFactory.identifier3("f"));
+    FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
+    functionElement.type = functionType;
+    functionType.returnType = provider.dynamicType;
+    functionType.normalParameterTypes = <Type2> [boolType];
+    functionType.optionalParameterTypes = <Type2> [stringType];
+    JUnitTestCase.assertTrue(functionType.isAssignableTo(functionAliasType));
+  }
   void test_isSubtypeOf_wrongFunctionType_normal_named() {
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [a]).type;
@@ -2629,6 +2673,10 @@
         final __test = new FunctionTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_returnType_tNotAssignableToS);
       });
+      _ut.test('test_isSubtypeOf_typeParameters_matchesBounds', () {
+        final __test = new FunctionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_typeParameters_matchesBounds);
+      });
       _ut.test('test_isSubtypeOf_wrongFunctionType_normal_named', () {
         final __test = new FunctionTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_wrongFunctionType_normal_named);
@@ -2664,8 +2712,8 @@
     });
   }
 }
-class InterfaceTypeImpl_19 extends InterfaceTypeImpl {
-  InterfaceTypeImpl_19(ClassElement arg0) : super.con1(arg0);
+class InterfaceTypeImpl_18 extends InterfaceTypeImpl {
+  InterfaceTypeImpl_18(ClassElement arg0) : super.con1(arg0);
   bool isDartCoreFunction() => true;
 }
 main() {
diff --git a/pkg/analyzer_experimental/test/generated/parser_test.dart b/pkg/analyzer_experimental/test/generated/parser_test.dart
index b420160..9c5f3d8 100644
--- a/pkg/analyzer_experimental/test/generated/parser_test.dart
+++ b/pkg/analyzer_experimental/test/generated/parser_test.dart
@@ -3674,7 +3674,7 @@
    * @throws Exception if the method could not be invoked or throws an exception
    */
   String computeStringValue(String lexeme) {
-    AnalysisErrorListener listener = new AnalysisErrorListener_20();
+    AnalysisErrorListener listener = new AnalysisErrorListener_19();
     Parser parser = new Parser(null, listener);
     return invokeParserMethodImpl(parser, "computeStringValue", <Object> [lexeme], null) as String;
   }
@@ -5847,7 +5847,7 @@
     });
   }
 }
-class AnalysisErrorListener_20 implements AnalysisErrorListener {
+class AnalysisErrorListener_19 implements AnalysisErrorListener {
   void onError(AnalysisError event) {
     JUnitTestCase.fail("Unexpected compilation error: ${event.message} (${event.offset}, ${event.length})");
   }
diff --git a/pkg/analyzer_experimental/test/generated/resolver_test.dart b/pkg/analyzer_experimental/test/generated/resolver_test.dart
index a4a9b6b..c365a79 100644
--- a/pkg/analyzer_experimental/test/generated/resolver_test.dart
+++ b/pkg/analyzer_experimental/test/generated/resolver_test.dart
@@ -8,7 +8,7 @@
 import 'package:analyzer_experimental/src/generated/source_io.dart';
 import 'package:analyzer_experimental/src/generated/error.dart';
 import 'package:analyzer_experimental/src/generated/scanner.dart';
-import 'package:analyzer_experimental/src/generated/ast.dart' hide Annotation;
+import 'package:analyzer_experimental/src/generated/ast.dart';
 import 'package:analyzer_experimental/src/generated/parser.dart' show ParserErrorCode;
 import 'package:analyzer_experimental/src/generated/element.dart';
 import 'package:analyzer_experimental/src/generated/resolver.dart';
@@ -3141,8 +3141,7 @@
    * @return the source object representing the added file
    */
   Source addSource2(String filePath, String contents) {
-    Source source = new FileBasedSource.con1(_sourceFactory.contentCache, FileUtilities2.createFile(filePath));
-    _sourceFactory.setContents(source, contents);
+    Source source = cacheSource(filePath, contents);
     ChangeSet changeSet = new ChangeSet();
     changeSet.added(source);
     _analysisContext.applyChanges(changeSet);
@@ -3182,6 +3181,19 @@
   }
 
   /**
+   * Cache the source file content in the source factory but don't add the source to the analysis
+   * context. The file path should be absolute.
+   * @param filePath the path of the file being cached
+   * @param contents the contents to be returned by the content provider for the specified file
+   * @return the source object representing the cached file
+   */
+  Source cacheSource(String filePath, String contents) {
+    Source source = new FileBasedSource.con1(_sourceFactory.contentCache, FileUtilities2.createFile(filePath));
+    _sourceFactory.setContents(source, contents);
+    return source;
+  }
+
+  /**
    * Create a library element that represents a library named {@code "test"} containing a single
    * empty compilation unit.
    * @return the library element that was created
@@ -7358,6 +7370,11 @@
   }
 }
 class PubSuggestionCodeTest extends ResolverTestCase {
+  void test_import_package() {
+    Source source = addSource(EngineTestCase.createSource(["import 'package:somepackage/other.dart';"]));
+    resolve(source);
+    assertErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+  }
   void test_import_packageWithDotDot() {
     Source source = addSource(EngineTestCase.createSource(["import 'package:somepackage/../other.dart';"]));
     resolve(source);
@@ -7369,22 +7386,58 @@
     assertErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST, PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT]);
   }
   void test_import_referenceIntoLibDirectory() {
-    Source source = addSource(EngineTestCase.createSource(["import '../lib/other.dart';"]));
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/lib/other.dart", "");
+    Source source = addSource2("/myproj/web/test.dart", EngineTestCase.createSource(["import '../lib/other.dart';"]));
     resolve(source);
-    assertErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST, PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE]);
+    assertErrors([PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE]);
+  }
+  void test_import_referenceIntoLibDirectory_no_pubspec() {
+    cacheSource("/myproj/lib/other.dart", "");
+    Source source = addSource2("/myproj/web/test.dart", EngineTestCase.createSource(["import '../lib/other.dart';"]));
+    resolve(source);
+    assertNoErrors();
   }
   void test_import_referenceOutOfLibDirectory() {
-    Source source = addSource2("lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/web/other.dart", "");
+    Source source = addSource2("/myproj/lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
     resolve(source);
-    assertErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST, PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE]);
+    assertErrors([PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE]);
   }
-  void test_import_valid() {
-    Source source = addSource2("lib2/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
+  void test_import_referenceOutOfLibDirectory_no_pubspec() {
+    cacheSource("/myproj/web/other.dart", "");
+    Source source = addSource2("/myproj/lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
     resolve(source);
-    assertErrors([CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+    assertNoErrors();
+  }
+  void test_import_valid_inside_lib1() {
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/lib/other.dart", "");
+    Source source = addSource2("/myproj/lib/test.dart", EngineTestCase.createSource(["import 'other.dart';"]));
+    resolve(source);
+    assertNoErrors();
+  }
+  void test_import_valid_inside_lib2() {
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/lib/bar/other.dart", "");
+    Source source = addSource2("/myproj/lib/foo/test.dart", EngineTestCase.createSource(["import '../bar/other.dart';"]));
+    resolve(source);
+    assertNoErrors();
+  }
+  void test_import_valid_outside_lib() {
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/web/other.dart", "");
+    Source source = addSource2("/myproj/lib2/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
+    resolve(source);
+    assertNoErrors();
   }
   static dartSuite() {
     _ut.group('PubSuggestionCodeTest', () {
+      _ut.test('test_import_package', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_package);
+      });
       _ut.test('test_import_packageWithDotDot', () {
         final __test = new PubSuggestionCodeTest();
         runJUnitTest(__test, __test.test_import_packageWithDotDot);
@@ -7397,13 +7450,29 @@
         final __test = new PubSuggestionCodeTest();
         runJUnitTest(__test, __test.test_import_referenceIntoLibDirectory);
       });
+      _ut.test('test_import_referenceIntoLibDirectory_no_pubspec', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_referenceIntoLibDirectory_no_pubspec);
+      });
       _ut.test('test_import_referenceOutOfLibDirectory', () {
         final __test = new PubSuggestionCodeTest();
         runJUnitTest(__test, __test.test_import_referenceOutOfLibDirectory);
       });
-      _ut.test('test_import_valid', () {
+      _ut.test('test_import_referenceOutOfLibDirectory_no_pubspec', () {
         final __test = new PubSuggestionCodeTest();
-        runJUnitTest(__test, __test.test_import_valid);
+        runJUnitTest(__test, __test.test_import_referenceOutOfLibDirectory_no_pubspec);
+      });
+      _ut.test('test_import_valid_inside_lib1', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_valid_inside_lib1);
+      });
+      _ut.test('test_import_valid_inside_lib2', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_valid_inside_lib2);
+      });
+      _ut.test('test_import_valid_outside_lib', () {
+        final __test = new PubSuggestionCodeTest();
+        runJUnitTest(__test, __test.test_import_valid_outside_lib);
       });
     });
   }
@@ -9474,6 +9543,16 @@
     JUnitTestCase.assertSame(_typeProvider.doubleType, analyze(node));
     _listener.assertNoErrors();
   }
+  void test_visitBinaryExpression_star_notSpecial() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    InterfaceType typeA = classA.type;
+    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);
+    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, "*"));
@@ -10179,6 +10258,10 @@
         final __test = new StaticTypeAnalyzerTest();
         runJUnitTest(__test, __test.test_visitBinaryExpression_starID);
       });
+      _ut.test('test_visitBinaryExpression_star_notSpecial', () {
+        final __test = new StaticTypeAnalyzerTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_star_notSpecial);
+      });
       _ut.test('test_visitBooleanLiteral_false', () {
         final __test = new StaticTypeAnalyzerTest();
         runJUnitTest(__test, __test.test_visitBooleanLiteral_false);
@@ -10394,7 +10477,7 @@
   void test_define_duplicate() {
     LibraryElement definingLibrary2 = createTestLibrary();
     GatheringErrorListener errorListener2 = new GatheringErrorListener();
-    Scope rootScope = new Scope_17(definingLibrary2, errorListener2);
+    Scope rootScope = new Scope_16(definingLibrary2, errorListener2);
     EnclosedScope scope = new EnclosedScope(rootScope);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
     VariableElement element2 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
@@ -10405,7 +10488,7 @@
   void test_define_normal() {
     LibraryElement definingLibrary3 = createTestLibrary();
     GatheringErrorListener errorListener3 = new GatheringErrorListener();
-    Scope rootScope = new Scope_18(definingLibrary3, errorListener3);
+    Scope rootScope = new Scope_17(definingLibrary3, errorListener3);
     EnclosedScope outerScope = new EnclosedScope(rootScope);
     EnclosedScope innerScope = new EnclosedScope(outerScope);
     VariableElement element1 = ElementFactory.localVariableElement(ASTFactory.identifier3("v1"));
@@ -10427,18 +10510,18 @@
     });
   }
 }
-class Scope_17 extends Scope {
+class Scope_16 extends Scope {
   LibraryElement definingLibrary2;
   GatheringErrorListener errorListener2;
-  Scope_17(this.definingLibrary2, this.errorListener2) : super();
+  Scope_16(this.definingLibrary2, this.errorListener2) : super();
   LibraryElement get definingLibrary => definingLibrary2;
   AnalysisErrorListener get errorListener => errorListener2;
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
 }
-class Scope_18 extends Scope {
+class Scope_17 extends Scope {
   LibraryElement definingLibrary3;
   GatheringErrorListener errorListener3;
-  Scope_18(this.definingLibrary3, this.errorListener3) : super();
+  Scope_17(this.definingLibrary3, this.errorListener3) : super();
   LibraryElement get definingLibrary => definingLibrary3;
   AnalysisErrorListener get errorListener => errorListener3;
   Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
@@ -10936,7 +11019,7 @@
     JUnitTestCase.assertNotNull(unit);
     List<ClassElement> classes = unit.types;
     EngineTestCase.assertLength(1, classes);
-    List<Annotation> annotations = classes[0].metadata;
+    List<ElementAnnotation> annotations = classes[0].metadata;
     EngineTestCase.assertLength(1, annotations);
     assertNoErrors();
     verify([source]);
@@ -10950,7 +11033,7 @@
     List<ClassElement> classes = unit.types;
     EngineTestCase.assertLength(1, classes);
     FieldElement field = classes[0].fields[0];
-    List<Annotation> annotations = field.metadata;
+    List<ElementAnnotation> annotations = field.metadata;
     EngineTestCase.assertLength(1, annotations);
     assertNoErrors();
     verify([source]);
@@ -10959,7 +11042,7 @@
     Source source = addSource(EngineTestCase.createSource(["@A library lib;", "const A = null;"]));
     LibraryElement library = resolve(source);
     JUnitTestCase.assertNotNull(library);
-    List<Annotation> annotations = library.metadata;
+    List<ElementAnnotation> annotations = library.metadata;
     EngineTestCase.assertLength(1, annotations);
     assertNoErrors();
     verify([source]);
@@ -10973,7 +11056,7 @@
     List<ClassElement> classes = unit.types;
     EngineTestCase.assertLength(1, classes);
     MethodElement method = classes[0].methods[0];
-    List<Annotation> annotations = method.metadata;
+    List<ElementAnnotation> annotations = method.metadata;
     EngineTestCase.assertLength(1, annotations);
     assertNoErrors();
     verify([source]);
diff --git a/pkg/browser/lib/dart.js b/pkg/browser/lib/dart.js
index d610647..48cd8ad 100644
--- a/pkg/browser/lib/dart.js
+++ b/pkg/browser/lib/dart.js
@@ -1,4 +1,4 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -36,217 +36,3 @@
     }
   }, false);
 }
-
-// ---------------------------------------------------------------------------
-// Experimental support for JS interoperability
-// ---------------------------------------------------------------------------
-function SendPortSync() {
-}
-
-function ReceivePortSync() {
-  this.id = ReceivePortSync.id++;
-  ReceivePortSync.map[this.id] = this;
-}
-
-(function() {
-  // Serialize the following types as follows:
-  //  - primitives / null: unchanged
-  //  - lists: [ 'list', internal id, list of recursively serialized elements ]
-  //  - maps: [ 'map', internal id, map of keys and recursively serialized values ]
-  //  - send ports: [ 'sendport', type, isolate id, port id ]
-  //
-  // Note, internal id's are for cycle detection.
-  function serialize(message) {
-    var visited = [];
-    function checkedSerialization(obj, serializer) {
-      // Implementation detail: for now use linear search.
-      // Another option is expando, but it may prohibit
-      // VM optimizations (like putting object into slow mode
-      // on property deletion.)
-      var id = visited.indexOf(obj);
-      if (id != -1) return [ 'ref', id ];
-      var id = visited.length;
-      visited.push(obj);
-      return serializer(id);
-    }
-
-    function doSerialize(message) {
-      if (message == null) {
-        return null;  // Convert undefined to null.
-      } else if (typeof(message) == 'string' ||
-                 typeof(message) == 'number' ||
-                 typeof(message) == 'boolean') {
-        return message;
-      } else if (message instanceof Array) {
-        return checkedSerialization(message, function(id) {
-          var values = new Array(message.length);
-          for (var i = 0; i < message.length; i++) {
-            values[i] = doSerialize(message[i]);
-          }
-          return [ 'list', id, values ];
-        });
-      } else if (message instanceof LocalSendPortSync) {
-        return [ 'sendport', 'nativejs', message.receivePort.id ];
-      } else if (message instanceof DartSendPortSync) {
-        return [ 'sendport', 'dart', message.isolateId, message.portId ];
-      } else {
-        return checkedSerialization(message, function(id) {
-          var keys = Object.getOwnPropertyNames(message);
-          var values = new Array(keys.length);
-          for (var i = 0; i < keys.length; i++) {
-            values[i] = doSerialize(message[keys[i]]);
-          }
-          return [ 'map', id, keys, values ];
-        });
-      }
-    }
-    return doSerialize(message);
-  }
-
-  function deserialize(message) {
-    return deserializeHelper(message);
-  }
-
-  function deserializeHelper(message) {
-    if (message == null ||
-        typeof(message) == 'string' ||
-        typeof(message) == 'number' ||
-        typeof(message) == 'boolean') {
-      return message;
-    }
-    switch (message[0]) {
-      case 'map': return deserializeMap(message);
-      case 'sendport': return deserializeSendPort(message);
-      case 'list': return deserializeList(message);
-      default: throw 'unimplemented';
-    }
-  }
-
-  function deserializeMap(message) {
-    var result = { };
-    var id = message[1];
-    var keys = message[2];
-    var values = message[3];
-    for (var i = 0, length = keys.length; i < length; i++) {
-      var key = deserializeHelper(keys[i]);
-      var value = deserializeHelper(values[i]);
-      result[key] = value;
-    }
-    return result;
-  }
-
-  function deserializeSendPort(message) {
-    var tag = message[1];
-    switch (tag) {
-      case 'nativejs':
-        var id = message[2];
-        return new LocalSendPortSync(ReceivePortSync.map[id]);
-      case 'dart':
-        var isolateId = message[2];
-        var portId = message[3];
-        return new DartSendPortSync(isolateId, portId);
-      default:
-        throw 'Illegal SendPortSync type: $tag';
-    }
-  }
-
-  function deserializeList(message) {
-    var values = message[2];
-    var length = values.length;
-    var result = new Array(length);
-    for (var i = 0; i < length; i++) {
-      result[i] = deserializeHelper(values[i]);
-    }
-    return result;
-  }
-
-  window.registerPort = function(name, port) {
-    var stringified = JSON.stringify(serialize(port));
-    var attrName = 'dart-port:' + name;
-    document.documentElement.setAttribute(attrName, stringified);
-  };
-
-  window.lookupPort = function(name) {
-    var attrName = 'dart-port:' + name;
-    var stringified = document.documentElement.getAttribute(attrName);
-    return deserialize(JSON.parse(stringified));
-  };
-
-  ReceivePortSync.id = 0;
-  ReceivePortSync.map = {};
-
-  ReceivePortSync.dispatchCall = function(id, message) {
-    // TODO(vsm): Handle and propagate exceptions.
-    var deserialized = deserialize(message);
-    var result = ReceivePortSync.map[id].callback(deserialized);
-    return serialize(result);
-  };
-
-  ReceivePortSync.prototype.receive = function(callback) {
-    this.callback = callback;
-  };
-
-  ReceivePortSync.prototype.toSendPort = function() {
-    return new LocalSendPortSync(this);
-  };
-
-  ReceivePortSync.prototype.close = function() {
-    delete ReceivePortSync.map[this.id];
-  };
-
-  if (navigator.webkitStartDart) {
-    window.addEventListener('js-sync-message', function(event) {
-      var data = JSON.parse(getPortSyncEventData(event));
-      var deserialized = deserialize(data.message);
-      var result = ReceivePortSync.map[data.id].callback(deserialized);
-      // TODO(vsm): Handle and propagate exceptions.
-      dispatchEvent('js-result', serialize(result));
-    }, false);
-  }
-
-  function LocalSendPortSync(receivePort) {
-    this.receivePort = receivePort;
-  }
-
-  LocalSendPortSync.prototype = new SendPortSync();
-
-  LocalSendPortSync.prototype.callSync = function(message) {
-    // TODO(vsm): Do a direct deepcopy.
-    message = deserialize(serialize(message));
-    return this.receivePort.callback(message);
-  }
-
-  function DartSendPortSync(isolateId, portId) {
-    this.isolateId = isolateId;
-    this.portId = portId;
-  }
-
-  DartSendPortSync.prototype = new SendPortSync();
-
-  function dispatchEvent(receiver, message) {
-    var string = JSON.stringify(message);
-    var event = document.createEvent('CustomEvent');
-    event.initCustomEvent(receiver, false, false, string);
-    window.dispatchEvent(event);
-  }
-
-  function getPortSyncEventData(event) {
-    return event.detail;
-  }
-
-  DartSendPortSync.prototype.callSync = function(message) {
-    var serialized = serialize(message);
-    var target = 'dart-port-' + this.isolateId + '-' + this.portId;
-    // TODO(vsm): Make this re-entrant.
-    // TODO(vsm): Set this up set once, on the first call.
-    var source = target + '-result';
-    var result = null;
-    var listener = function (e) {
-      result = JSON.parse(getPortSyncEventData(e));
-    };
-    window.addEventListener(source, listener, false);
-    dispatchEvent(target, [source, serialized]);
-    window.removeEventListener(source, listener, false);
-    return deserialize(result);
-  }
-})();
diff --git a/pkg/browser/lib/interop.js b/pkg/browser/lib/interop.js
new file mode 100644
index 0000000..52cc966
--- /dev/null
+++ b/pkg/browser/lib/interop.js
@@ -0,0 +1,217 @@
+// 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.
+
+// ---------------------------------------------------------------------------
+// Support for JS interoperability
+// ---------------------------------------------------------------------------
+function SendPortSync() {
+}
+
+function ReceivePortSync() {
+  this.id = ReceivePortSync.id++;
+  ReceivePortSync.map[this.id] = this;
+}
+
+(function() {
+  // Serialize the following types as follows:
+  //  - primitives / null: unchanged
+  //  - lists: [ 'list', internal id, list of recursively serialized elements ]
+  //  - maps: [ 'map', internal id, map of keys and recursively serialized values ]
+  //  - send ports: [ 'sendport', type, isolate id, port id ]
+  //
+  // Note, internal id's are for cycle detection.
+  function serialize(message) {
+    var visited = [];
+    function checkedSerialization(obj, serializer) {
+      // Implementation detail: for now use linear search.
+      // Another option is expando, but it may prohibit
+      // VM optimizations (like putting object into slow mode
+      // on property deletion.)
+      var id = visited.indexOf(obj);
+      if (id != -1) return [ 'ref', id ];
+      var id = visited.length;
+      visited.push(obj);
+      return serializer(id);
+    }
+
+    function doSerialize(message) {
+      if (message == null) {
+        return null;  // Convert undefined to null.
+      } else if (typeof(message) == 'string' ||
+                 typeof(message) == 'number' ||
+                 typeof(message) == 'boolean') {
+        return message;
+      } else if (message instanceof Array) {
+        return checkedSerialization(message, function(id) {
+          var values = new Array(message.length);
+          for (var i = 0; i < message.length; i++) {
+            values[i] = doSerialize(message[i]);
+          }
+          return [ 'list', id, values ];
+        });
+      } else if (message instanceof LocalSendPortSync) {
+        return [ 'sendport', 'nativejs', message.receivePort.id ];
+      } else if (message instanceof DartSendPortSync) {
+        return [ 'sendport', 'dart', message.isolateId, message.portId ];
+      } else {
+        return checkedSerialization(message, function(id) {
+          var keys = Object.getOwnPropertyNames(message);
+          var values = new Array(keys.length);
+          for (var i = 0; i < keys.length; i++) {
+            values[i] = doSerialize(message[keys[i]]);
+          }
+          return [ 'map', id, keys, values ];
+        });
+      }
+    }
+    return doSerialize(message);
+  }
+
+  function deserialize(message) {
+    return deserializeHelper(message);
+  }
+
+  function deserializeHelper(message) {
+    if (message == null ||
+        typeof(message) == 'string' ||
+        typeof(message) == 'number' ||
+        typeof(message) == 'boolean') {
+      return message;
+    }
+    switch (message[0]) {
+      case 'map': return deserializeMap(message);
+      case 'sendport': return deserializeSendPort(message);
+      case 'list': return deserializeList(message);
+      default: throw 'unimplemented';
+    }
+  }
+
+  function deserializeMap(message) {
+    var result = { };
+    var id = message[1];
+    var keys = message[2];
+    var values = message[3];
+    for (var i = 0, length = keys.length; i < length; i++) {
+      var key = deserializeHelper(keys[i]);
+      var value = deserializeHelper(values[i]);
+      result[key] = value;
+    }
+    return result;
+  }
+
+  function deserializeSendPort(message) {
+    var tag = message[1];
+    switch (tag) {
+      case 'nativejs':
+        var id = message[2];
+        return new LocalSendPortSync(ReceivePortSync.map[id]);
+      case 'dart':
+        var isolateId = message[2];
+        var portId = message[3];
+        return new DartSendPortSync(isolateId, portId);
+      default:
+        throw 'Illegal SendPortSync type: $tag';
+    }
+  }
+
+  function deserializeList(message) {
+    var values = message[2];
+    var length = values.length;
+    var result = new Array(length);
+    for (var i = 0; i < length; i++) {
+      result[i] = deserializeHelper(values[i]);
+    }
+    return result;
+  }
+
+  window.registerPort = function(name, port) {
+    var stringified = JSON.stringify(serialize(port));
+    var attrName = 'dart-port:' + name;
+    document.documentElement.setAttribute(attrName, stringified);
+  };
+
+  window.lookupPort = function(name) {
+    var attrName = 'dart-port:' + name;
+    var stringified = document.documentElement.getAttribute(attrName);
+    return deserialize(JSON.parse(stringified));
+  };
+
+  ReceivePortSync.id = 0;
+  ReceivePortSync.map = {};
+
+  ReceivePortSync.dispatchCall = function(id, message) {
+    // TODO(vsm): Handle and propagate exceptions.
+    var deserialized = deserialize(message);
+    var result = ReceivePortSync.map[id].callback(deserialized);
+    return serialize(result);
+  };
+
+  ReceivePortSync.prototype.receive = function(callback) {
+    this.callback = callback;
+  };
+
+  ReceivePortSync.prototype.toSendPort = function() {
+    return new LocalSendPortSync(this);
+  };
+
+  ReceivePortSync.prototype.close = function() {
+    delete ReceivePortSync.map[this.id];
+  };
+
+  if (navigator.webkitStartDart) {
+    window.addEventListener('js-sync-message', function(event) {
+      var data = JSON.parse(getPortSyncEventData(event));
+      var deserialized = deserialize(data.message);
+      var result = ReceivePortSync.map[data.id].callback(deserialized);
+      // TODO(vsm): Handle and propagate exceptions.
+      dispatchEvent('js-result', serialize(result));
+    }, false);
+  }
+
+  function LocalSendPortSync(receivePort) {
+    this.receivePort = receivePort;
+  }
+
+  LocalSendPortSync.prototype = new SendPortSync();
+
+  LocalSendPortSync.prototype.callSync = function(message) {
+    // TODO(vsm): Do a direct deepcopy.
+    message = deserialize(serialize(message));
+    return this.receivePort.callback(message);
+  }
+
+  function DartSendPortSync(isolateId, portId) {
+    this.isolateId = isolateId;
+    this.portId = portId;
+  }
+
+  DartSendPortSync.prototype = new SendPortSync();
+
+  function dispatchEvent(receiver, message) {
+    var string = JSON.stringify(message);
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent(receiver, false, false, string);
+    window.dispatchEvent(event);
+  }
+
+  function getPortSyncEventData(event) {
+    return event.detail;
+  }
+
+  DartSendPortSync.prototype.callSync = function(message) {
+    var serialized = serialize(message);
+    var target = 'dart-port-' + this.isolateId + '-' + this.portId;
+    // TODO(vsm): Make this re-entrant.
+    // TODO(vsm): Set this up set once, on the first call.
+    var source = target + '-result';
+    var result = null;
+    var listener = function (e) {
+      result = JSON.parse(getPortSyncEventData(e));
+    };
+    window.addEventListener(source, listener, false);
+    dispatchEvent(target, [source, serialized]);
+    window.removeEventListener(source, listener, false);
+    return deserialize(result);
+  }
+})();
diff --git a/tests/lib/crypto/base64_test.dart b/pkg/crypto/test/base64_test.dart
similarity index 100%
rename from tests/lib/crypto/base64_test.dart
rename to pkg/crypto/test/base64_test.dart
diff --git a/tests/lib/crypto/hmac_md5_test.dart b/pkg/crypto/test/hmac_md5_test.dart
similarity index 100%
rename from tests/lib/crypto/hmac_md5_test.dart
rename to pkg/crypto/test/hmac_md5_test.dart
diff --git a/tests/lib/crypto/hmac_sha1_test.dart b/pkg/crypto/test/hmac_sha1_test.dart
similarity index 100%
rename from tests/lib/crypto/hmac_sha1_test.dart
rename to pkg/crypto/test/hmac_sha1_test.dart
diff --git a/tests/lib/crypto/hmac_sha1_test_vectors.dart b/pkg/crypto/test/hmac_sha1_test_vectors.dart
similarity index 100%
rename from tests/lib/crypto/hmac_sha1_test_vectors.dart
rename to pkg/crypto/test/hmac_sha1_test_vectors.dart
diff --git a/tests/lib/crypto/hmac_sha256_test.dart b/pkg/crypto/test/hmac_sha256_test.dart
similarity index 100%
rename from tests/lib/crypto/hmac_sha256_test.dart
rename to pkg/crypto/test/hmac_sha256_test.dart
diff --git a/tests/lib/crypto/hmac_sha256_test_vectors.dart b/pkg/crypto/test/hmac_sha256_test_vectors.dart
similarity index 100%
rename from tests/lib/crypto/hmac_sha256_test_vectors.dart
rename to pkg/crypto/test/hmac_sha256_test_vectors.dart
diff --git a/tests/lib/crypto/sha1_long_test_vectors.dart b/pkg/crypto/test/sha1_long_test_vectors.dart
similarity index 100%
rename from tests/lib/crypto/sha1_long_test_vectors.dart
rename to pkg/crypto/test/sha1_long_test_vectors.dart
diff --git a/tests/lib/crypto/sha1_short_test_vectors.dart b/pkg/crypto/test/sha1_short_test_vectors.dart
similarity index 100%
rename from tests/lib/crypto/sha1_short_test_vectors.dart
rename to pkg/crypto/test/sha1_short_test_vectors.dart
diff --git a/tests/lib/crypto/sha1_test.dart b/pkg/crypto/test/sha1_test.dart
similarity index 100%
rename from tests/lib/crypto/sha1_test.dart
rename to pkg/crypto/test/sha1_test.dart
diff --git a/tests/lib/crypto/sha256_long_test_vectors.dart b/pkg/crypto/test/sha256_long_test_vectors.dart
similarity index 100%
rename from tests/lib/crypto/sha256_long_test_vectors.dart
rename to pkg/crypto/test/sha256_long_test_vectors.dart
diff --git a/tests/lib/crypto/sha256_short_test_vectors.dart b/pkg/crypto/test/sha256_short_test_vectors.dart
similarity index 100%
rename from tests/lib/crypto/sha256_short_test_vectors.dart
rename to pkg/crypto/test/sha256_short_test_vectors.dart
diff --git a/tests/lib/crypto/sha256_test.dart b/pkg/crypto/test/sha256_test.dart
similarity index 100%
rename from tests/lib/crypto/sha256_test.dart
rename to pkg/crypto/test/sha256_test.dart
diff --git a/pkg/http/lib/src/base_client.dart b/pkg/http/lib/src/base_client.dart
index 2526a62..8c25265 100644
--- a/pkg/http/lib/src/base_client.dart
+++ b/pkg/http/lib/src/base_client.dart
@@ -112,7 +112,7 @@
       if (url is String) url = Uri.parse(url);
       var request = new Request(method, url);
 
-      if (headers != null) mapAddAll(request.headers, headers);
+      if (headers != null) request.headers.addAll(headers);
       if (fields != null && !fields.isEmpty) request.bodyFields = fields;
 
       return send(request);
diff --git a/pkg/http/lib/src/base_request.dart b/pkg/http/lib/src/base_request.dart
index 415e27a..7c3ebc6 100644
--- a/pkg/http/lib/src/base_request.dart
+++ b/pkg/http/lib/src/base_request.dart
@@ -60,7 +60,7 @@
 
   /// The maximum number of redirects to follow when [followRedirects] is true.
   /// If this number is exceeded the [BaseResponse] future will signal a
-  /// [RedirectLimitExceeded] exception. Defaults to 5.
+  /// [RedirectException]. Defaults to 5.
   int get maxRedirects => _maxRedirects;
   int _maxRedirects = 5;
 
diff --git a/pkg/http/lib/src/mock_client.dart b/pkg/http/lib/src/mock_client.dart
index 91c0dc0..ec88af4 100644
--- a/pkg/http/lib/src/mock_client.dart
+++ b/pkg/http/lib/src/mock_client.dart
@@ -38,7 +38,7 @@
         request.persistentConnection = baseRequest.persistentConnection;
         request.followRedirects = baseRequest.followRedirects;
         request.maxRedirects = baseRequest.maxRedirects;
-        mapAddAll(request.headers, baseRequest.headers);
+        request.headers.addAll(baseRequest.headers);
         request.bodyBytes = bodyBytes;
         request.finalize();
 
diff --git a/pkg/http/lib/src/utils.dart b/pkg/http/lib/src/utils.dart
index 9125ddc..1cbe6aa 100644
--- a/pkg/http/lib/src/utils.dart
+++ b/pkg/http/lib/src/utils.dart
@@ -42,15 +42,6 @@
   return pairs.map((pair) => "${pair[0]}=${pair[1]}").join("&");
 }
 
-/// Adds all key/value pairs from [source] to [destination], overwriting any
-/// pre-existing values.
-///
-///     var a = {"foo": "bar", "baz": "bang"};
-///     mapAddAll(a, {"baz": "zap", "qux": "quux"});
-///     a; //=> {"foo": "bar", "baz": "zap", "qux": "quux"}
-void mapAddAll(Map destination, Map source) =>
-  source.forEach((key, value) => destination[key] = value);
-
 /// Decodes a URL-encoded string. Unlike [Uri.decodeComponent], this includes
 /// replacing `+` with ` `.
 String urlDecode(String encoded) =>
diff --git a/pkg/http/test/client_test.dart b/pkg/http/test/client_test.dart
index aa7781f..287aee5 100644
--- a/pkg/http/test/client_test.dart
+++ b/pkg/http/test/client_test.dart
@@ -21,6 +21,7 @@
       var request = new http.StreamedRequest("POST", serverUrl);
       request.headers[HttpHeaders.CONTENT_TYPE] =
         'application/json; charset=utf-8';
+      request.headers[HttpHeaders.USER_AGENT] = 'Dart';
 
       expect(client.send(request).then((response) {
         expect(response.request, equals(request));
@@ -37,6 +38,7 @@
         'headers': {
           'content-type': ['application/json; charset=utf-8'],
           'accept-encoding': ['gzip'],
+          'user-agent': ['Dart'],
           'transfer-encoding': ['chunked']
         },
         'body': '{"hello": "world"}'
@@ -55,7 +57,7 @@
       request.headers[HttpHeaders.CONTENT_TYPE] =
           'application/json; charset=utf-8';
 
-      expect(client.send(request), throwsSocketIOException);
+      expect(client.send(request), throwsSocketException);
 
       request.sink.add('{"hello": "world"}'.codeUnits);
       request.sink.close();
diff --git a/pkg/http/test/http_test.dart b/pkg/http/test/http_test.dart
index b3227f5..3f12984 100644
--- a/pkg/http/test/http_test.dart
+++ b/pkg/http/test/http_test.dart
@@ -28,7 +28,8 @@
       expect(startServer().then((_) {
         expect(http.get(serverUrl, headers: {
           'X-Random-Header': 'Value',
-          'X-Other-Header': 'Other Value'
+          'X-Other-Header': 'Other Value',
+          'User-Agent': 'Dart'
         }).then((response) {
           expect(response.statusCode, equals(200));
           expect(response.body, parse(equals({
@@ -37,6 +38,7 @@
             'headers': {
               'content-length': ['0'],
               'accept-encoding': ['gzip'],
+              'user-agent': ['Dart'],
               'x-random-header': ['Value'],
               'x-other-header': ['Other Value']
             },
@@ -49,7 +51,8 @@
       expect(startServer().then((_) {
         expect(http.post(serverUrl, headers: {
           'X-Random-Header': 'Value',
-          'X-Other-Header': 'Other Value'
+          'X-Other-Header': 'Other Value',
+          'User-Agent': 'Dart'
         }, fields: {
           'some-field': 'value',
           'other-field': 'other value'
@@ -64,6 +67,7 @@
               ],
               'content-length': ['40'],
               'accept-encoding': ['gzip'],
+              'user-agent': ['Dart'],
               'x-random-header': ['Value'],
               'x-other-header': ['Other Value']
             },
@@ -78,7 +82,8 @@
         expect(http.post(serverUrl, headers: {
           'X-Random-Header': 'Value',
           'X-Other-Header': 'Other Value',
-          'Content-Type': 'text/plain'
+          'Content-Type': 'text/plain',
+          'User-Agent': 'Dart'
         }).then((response) {
           expect(response.statusCode, equals(200));
           expect(response.body, parse(equals({
@@ -88,6 +93,7 @@
               'accept-encoding': ['gzip'],
               'content-length': ['0'],
               'content-type': ['text/plain'],
+              'user-agent': ['Dart'],
               'x-random-header': ['Value'],
               'x-other-header': ['Other Value']
             }
@@ -100,7 +106,8 @@
       expect(startServer().then((_) {
         expect(http.put(serverUrl, headers: {
           'X-Random-Header': 'Value',
-          'X-Other-Header': 'Other Value'
+          'X-Other-Header': 'Other Value',
+          'User-Agent': 'Dart'
         }, fields: {
           'some-field': 'value',
           'other-field': 'other value'
@@ -115,6 +122,7 @@
               ],
               'accept-encoding': ['gzip'],
               'content-length': ['40'],
+              'user-agent': ['Dart'],
               'x-random-header': ['Value'],
               'x-other-header': ['Other Value']
             },
@@ -129,7 +137,8 @@
         expect(http.put(serverUrl, headers: {
           'X-Random-Header': 'Value',
           'X-Other-Header': 'Other Value',
-          'Content-Type': 'text/plain'
+          'Content-Type': 'text/plain',
+          'User-Agent': 'Dart'
         }).then((response) {
           expect(response.statusCode, equals(200));
           expect(response.body, parse(equals({
@@ -139,6 +148,7 @@
               'content-length': ['0'],
               'accept-encoding': ['gzip'],
               'content-type': ['text/plain'],
+              'user-agent': ['Dart'],
               'x-random-header': ['Value'],
               'x-other-header': ['Other Value']
             }
@@ -151,7 +161,8 @@
       expect(startServer().then((_) {
         expect(http.delete(serverUrl, headers: {
           'X-Random-Header': 'Value',
-          'X-Other-Header': 'Other Value'
+          'X-Other-Header': 'Other Value',
+          'User-Agent': 'Dart'
         }).then((response) {
           expect(response.statusCode, equals(200));
           expect(response.body, parse(equals({
@@ -160,6 +171,7 @@
             'headers': {
               'content-length': ['0'],
               'accept-encoding': ['gzip'],
+              'user-agent': ['Dart'],
               'x-random-header': ['Value'],
               'x-other-header': ['Other Value']
             }
@@ -172,13 +184,15 @@
       expect(startServer().then((_) {
         expect(http.read(serverUrl, headers: {
           'X-Random-Header': 'Value',
-          'X-Other-Header': 'Other Value'
+          'X-Other-Header': 'Other Value',
+          'User-Agent': 'Dart'
         }).then((val) => val), completion(parse(equals({
           'method': 'GET',
           'path': '/',
           'headers': {
             'content-length': ['0'],
             'accept-encoding': ['gzip'],
+            'user-agent': ['Dart'],
             'x-random-header': ['Value'],
             'x-other-header': ['Other Value']
           },
@@ -196,7 +210,8 @@
       expect(startServer().then((_) {
         var future = http.readBytes(serverUrl, headers: {
           'X-Random-Header': 'Value',
-          'X-Other-Header': 'Other Value'
+          'X-Other-Header': 'Other Value',
+          'User-Agent': 'Dart'
         }).then((bytes) => new String.fromCharCodes(bytes));
 
         expect(future, completion(parse(equals({
@@ -205,6 +220,7 @@
           'headers': {
             'content-length': ['0'],
             'accept-encoding': ['gzip'],
+            'user-agent': ['Dart'],
             'x-random-header': ['Value'],
             'x-other-header': ['Other Value']
           },
diff --git a/pkg/http/test/request_test.dart b/pkg/http/test/request_test.dart
index 2e4c570..3ebe3e5 100644
--- a/pkg/http/test/request_test.dart
+++ b/pkg/http/test/request_test.dart
@@ -18,6 +18,7 @@
 
       var request = new http.Request('POST', serverUrl);
       request.body = "hello";
+      request.headers['User-Agent'] = 'Dart';
 
       expect(request.send().then((response) {
         expect(response.statusCode, equals(200));
@@ -28,6 +29,7 @@
         'headers': {
           'content-type': ['text/plain; charset=utf-8'],
           'accept-encoding': ['gzip'],
+          'user-agent': ['Dart'],
           'content-length': ['5']
         },
         'body': 'hello'
diff --git a/pkg/http/test/safe_http_server.dart b/pkg/http/test/safe_http_server.dart
index a580770b..0f3b9f1 100644
--- a/pkg/http/test/safe_http_server.dart
+++ b/pkg/http/test/safe_http_server.dart
@@ -50,9 +50,9 @@
       // Ignore socket error 104, which is caused by a request being cancelled
       // before it writes any headers. There's no reason to care about such
       // requests.
-      if (error is SocketIOException && error.osError.errorCode == 104) return;
+      if (error is SocketException && error.osError.errorCode == 104) return;
       // Ignore any parsing errors, which come from malformed requests.
-      if (error is HttpParserException) return;
+      if (error is HttpException) return;
       // Manually handle cancelOnError so the above (ignored) errors don't
       // cause unsubscription.
       if (cancelOnError) subscription.cancel();
diff --git a/pkg/http/test/utils.dart b/pkg/http/test/utils.dart
index c2ce9c4..6d86985 100644
--- a/pkg/http/test/utils.dart
+++ b/pkg/http/test/utils.dart
@@ -193,17 +193,17 @@
       super("RedirectLimitExceededException");
 
   bool matches(item, MatchState matchState) =>
-    item is RedirectLimitExceededException;
+    item is RedirectException && item.message == "Redirect limit exceeded";
 }
 
-/// A matcher for SocketIOExceptions.
-const isSocketIOException = const _SocketIOException();
+/// A matcher for SocketExceptions.
+const isSocketException = const _SocketException();
 
-/// A matcher for functions that throw SocketIOException.
-const Matcher throwsSocketIOException =
-    const Throws(isSocketIOException);
+/// A matcher for functions that throw SocketException.
+const Matcher throwsSocketException =
+    const Throws(isSocketException);
 
-class _SocketIOException extends TypeMatcher {
-  const _SocketIOException() : super("SocketIOException");
-  bool matches(item, MatchState matchState) => item is SocketIOException;
+class _SocketException extends TypeMatcher {
+  const _SocketException() : super("SocketException");
+  bool matches(item, MatchState matchState) => item is SocketException;
 }
diff --git a/pkg/oauth2/lib/src/utils.dart b/pkg/oauth2/lib/src/utils.dart
index d0e5f11..759357e 100644
--- a/pkg/oauth2/lib/src/utils.dart
+++ b/pkg/oauth2/lib/src/utils.dart
@@ -13,7 +13,7 @@
 /// parameters if a name conflict occurs.
 Uri addQueryParameters(Uri url, Map<String, String> parameters) {
   var queryMap = queryToMap(url.query);
-  mapAddAll(queryMap, parameters);
+  queryMap.addAll(parameters);
   return url.resolve("?${mapToQuery(queryMap)}");
 }
 
@@ -47,11 +47,6 @@
   }).join("&");
 }
 
-/// Add all key/value pairs from [source] to [destination], overwriting any
-/// pre-existing values.
-void mapAddAll(Map destination, Map source) =>
-  source.forEach((key, value) => destination[key] = value);
-
 /// Decode a URL-encoded string. Unlike [Uri.decodeComponent], this includes
 /// replacing `+` with ` `.
 String urlDecode(String encoded) =>
diff --git a/pkg/pkg.gyp b/pkg/pkg.gyp
index ed78787..172eef5 100644
--- a/pkg/pkg.gyp
+++ b/pkg/pkg.gyp
@@ -15,10 +15,11 @@
             '<!@(["python", "../tools/list_pkg_directories.py", "."])',
           ],
           'outputs': [
-            '<(PRODUCT_DIR)/packages',
+            '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
           ],
           'action': [
             'python', '../tools/make_links.py',
+            '--timestamp_file=<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
             '<(PRODUCT_DIR)/packages',
             '<@(_inputs)',
           ],
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 311fce9..5b5c18f 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -34,56 +34,17 @@
 [$compiler == dart2dart]
 *: Skip
 
-# Don't compile tests that use dart:io to JS
 [ $compiler == dart2js || $compiler == dart2dart ]
-http/test/*: Skip
-oauth2/test/*: Skip
-pathos/test/*: Skip
-
-# Issue 8440 forces us to use pathos in the scheduled_test tests, which would
-# otherwise be dart2js-compatible.
-scheduled_test/test/*: Skip
-
-# We use pathos in the stack_trace tests. We can run them on dart2js when issue
-# 6943 is fixed.
-stack_trace/test/*: Skip
-
 source_maps/test/vlq_test: Fail # A VLQ test checks for large numbers that
                                 # overflow in JS (numbers slightly larger than
                                 # 32 bits where we do bitwise operations).
 
-# Skip tests that use local file access if we're running in any browser
-[ $runtime == opera || $runtime == ff || $runtime == ie9 || $runtime == dartium || $runtime == chrome || $runtime == chromeOnAndroid || $runtime == safari || $runtime == drt  || $runtime == jsshell]
-http/test/*: Skip
-oauth2/test/*: Skip
-pathos/test/*: Skip
-intl/test/date_time_format_file_even_test: Skip
-intl/test/date_time_format_file_odd_test: Skip
-intl/test/find_default_locale_standalone_test: Skip
-intl/test/message_extraction/message_extraction_test: Skip
-analyzer_experimental/test/options_test: Skip # Imports dart:io.
-analyzer_experimental/test/generated/ast_test: Skip # Imports dart:io.
-analyzer_experimental/test/generated/element_test: Skip # Imports dart:io.
-analyzer_experimental/test/generated/parser_test: Skip # Imports dart:io.
-analyzer_experimental/test/generated/resolver_test: Skip # Imports dart:io.
-analyzer_experimental/test/generated/scanner_test: Skip # Imports dart:io.
-analyzer_experimental/test/error_test: Skip # Imports dart:io.
-analyzer_experimental/test/services/formatter_test: Skip #Imports dart:io
-
-# Issue 8440 forces us to use pathos in the scheduled_test tests, which would
-# otherwise be dart2js-compatible.
-scheduled_test/test/*: Skip
-
-# We use pathos in the stack_trace tests. We can run them on dart2js when issue
-# 6943 is fixed.
-stack_trace/test/*: Skip
-
 [ $runtime == opera && $compiler == dart2js ]
 intl/test/find_default_locale_browser_test: Fail
 intl/test/date_time_format_http_request_test: Skip # Timeout.
 
 [ $runtime == ie9 ]
-intl/test/date_time_format_http_request_test: Skip # Issue 8983
+intl/test/date_time_format_http_request_test: Fail # Issue 8983
 
 [ $runtime == safari ]
 fixnum/test/int_64_test: Pass, Fail # Bug in JSC.
@@ -98,17 +59,10 @@
 intl/test/message_extraction/message_extraction_test: Fail # Issue 9167
 
 [ $compiler == dart2js ]
-# Skip intl_message tests that use mirrors on dart2js until it's been
-# implemented there.
-serialization/test/serialization_test: Skip # Issue 6490
-serialization/test/no_library_test: Skip # Issue 6490
-analyzer_experimental/test/generated/ast_test: Skip
-analyzer_experimental/test/generated/element_test: Skip
-analyzer_experimental/test/generated/parser_test: Skip
-analyzer_experimental/test/generated/resolver_test: Skip
-analyzer_experimental/test/generated/scanner_test: Skip
-analyzer_experimental/test/error_test: Skip # Imports dart:io.
-analyzer_experimental/test/services/formatter_test.dart: Skip #Imports dart:io
+serialization/test/serialization_test: Fail # Issue 6490
+serialization/test/no_library_test: Fail # Issue 6490
+analyzer_experimental/test/generated/ast_test: Fail
+unittest/test/instance_test: Fail # http://dartbug.com/11191
 
 [ $compiler == dartc ]
 unittest/test/mock_regexp_negative_test: Fail
@@ -122,9 +76,6 @@
 unittest/test/mock_regexp_negative_test: fail
 unittest/test/mock_stepwise_negative_test: fail
 
-[ $compiler == dart2js ]
-unittest/test/instance_test: Skip
-
 [ $compiler == dart2js && $csp ]
 unittest/test/unittest_test: Pass, Crash # Issue 10935
 
@@ -138,13 +89,77 @@
 # The unminified unittest tests test that the real names of Dart types are
 # printed. Minified versions of these tests exist that test the behavior when
 # minified.
-unittest/test/*_unminified_test: Skip
+unittest/test/*_unminified_test: Skip # DO NOT COPY THIS UNLESS YOU WORK ON DART2JS
+
+[ $compiler == dart2js && $unchecked && ($runtime == d8 || $runtime == chrome || $runtime == drt) ]
+crypto/test/sha1_test: Fail # V8 bug: https://code.google.com/p/v8/issues/detail?id=2692
+
+[ $compiler == dart2js && $browser ]
+crypto/test/sha256_test: Slow, Pass
+crypto/test/sha1_test: Slow, Pass
+
+[ $browser ]
+analyzer_experimental/test/error_test: Fail, OK # Uses dart:io.
+analyzer_experimental/test/generated/element_test: Fail, OK # Uses dart:io.
+analyzer_experimental/test/generated/resolver_test: Fail, OK # Uses dart:io.
+analyzer_experimental/test/options_test: Fail, OK # Uses dart:io.
+analyzer_experimental/test/services/formatter_test: Fail, OK # Uses dart:io.
+http/test/client_test: Fail, OK # Uses dart:io.
+http/test/http_test: Fail, OK # Uses dart:io.
+http/test/mock_client_test: Fail, OK # Uses dart:io.
+http/test/multipart_test: Fail, OK # Uses dart:io.
+http/test/request_test: Fail, OK # Uses dart:io.
+http/test/response_test: Fail, OK # Uses dart:io.
+http/test/streamed_request_test: Fail, OK # Uses dart:io.
+intl/test/date_time_format_file_even_test: Fail, OK # Uses dart:io.
+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.
+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.
+oauth2/test/handle_access_token_response_test: Fail, OK # Uses dart:io.
+pathos/test/pathos_posix_test: Fail, OK # Uses dart:io.
+pathos/test/pathos_test: Fail, OK # Uses dart:io.
+pathos/test/pathos_url_test: Fail, OK # Uses dart:io.
+pathos/test/pathos_windows_test: Fail, OK # Uses dart:io.
+
+scheduled_test/test/descriptor/async_test: Fail # http://dartbug.com/8440
+scheduled_test/test/descriptor/directory_test: Fail # http://dartbug.com/8440
+scheduled_test/test/descriptor/file_test: Fail # http://dartbug.com/8440
+scheduled_test/test/descriptor/nothing_test: Fail # http://dartbug.com/8440
+scheduled_test/test/descriptor/pattern_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_future_matchers_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_process_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/abort_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/current_schedule_current_task_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/current_schedule_errors_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/current_schedule_state_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/nested_task_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/on_complete_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/on_exception_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/out_of_band_task_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/set_up_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/signal_error_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/simple_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/task_return_value_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/timeout_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/wrap_async_test: Fail # http://dartbug.com/8440
+scheduled_test/test/scheduled_test/wrap_future_test: Fail # http://dartbug.com/8440
+
+stack_trace/test/frame_test: Fail # http://dartbug.com/6943
+stack_trace/test/trace_test: Fail # http://dartbug.com/6943
+
+
+[ $runtime == safari]
+ # Bug in JSC: the test only passes when being debugged.
+crypto/test/hmac_md5_test: Fail, Pass
 
 [ $minified == false ]
 # The minified unittest tests test that the minified names of Dart types are
 # printed. Unminified versions of these tests exist that test the behavior when
 # not minified.
-unittest/test/*_minified_test: Skip
+unittest/test/*_minified_test: Skip # DO NOT COPY THIS UNLESS YOU WORK ON DART2JS
 
 [ $compiler == none && $runtime == drt ]
 dartdoc/test/dartdoc_test: Skip # See dartbug.com/4541.
diff --git a/pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart b/pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart
index a580770b..0f3b9f1 100644
--- a/pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart
+++ b/pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart
@@ -50,9 +50,9 @@
       // Ignore socket error 104, which is caused by a request being cancelled
       // before it writes any headers. There's no reason to care about such
       // requests.
-      if (error is SocketIOException && error.osError.errorCode == 104) return;
+      if (error is SocketException && error.osError.errorCode == 104) return;
       // Ignore any parsing errors, which come from malformed requests.
-      if (error is HttpParserException) return;
+      if (error is HttpException) return;
       // Manually handle cancelOnError so the above (ignored) errors don't
       // cause unsubscription.
       if (cancelOnError) subscription.cancel();
diff --git a/pkg/scheduled_test/test/scheduled_server_test.dart b/pkg/scheduled_test/test/scheduled_server_test.dart
index ec08bb5..b4cd897 100644
--- a/pkg/scheduled_test/test/scheduled_server_test.dart
+++ b/pkg/scheduled_test/test/scheduled_server_test.dart
@@ -38,16 +38,16 @@
     test('test 2', () {
       expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
       // TODO(nweiz): There can be three errors due to issue 9151. The
-      // HttpParserException is reported without a stack trace, and so when it's
+      // HttpException is reported without a stack trace, and so when it's
       // wrapped twice it registers as a different exception each time (because
       // it's given an ad-hoc stack trace). Always expect two exceptions when
       // issue 9151 is fixed.
       expect(errors.length, inInclusiveRange(2, 3));
       expect(errors[0].error, equals("'scheduled server 0' received GET /hello "
           "when no more requests were expected."));
-      expect(errors[1].error, new isInstanceOf<HttpParserException>());
+      expect(errors[1].error, new isInstanceOf<HttpException>());
       if (errors.length > 2) {
-        expect(errors[2].error, new isInstanceOf<HttpParserException>());
+        expect(errors[2].error, new isInstanceOf<HttpException>());
       }
     });
   }, passing: ['test 2']);
@@ -110,16 +110,16 @@
 
     test('test 2', () {
       // TODO(nweiz): There can be three errors due to issue 9151. The
-      // HttpParserException is reported without a stack trace, and so when it's
+      // HttpException is reported without a stack trace, and so when it's
       // wrapped twice it registers as a different exception each time (because
       // it's given an ad-hoc stack trace). Always expect two exceptions when
       // issue 9151 is fixed.
       expect(errors.length, inInclusiveRange(2, 3));
       expect(errors[0].error, equals("'scheduled server 0' received GET /hello "
           "earlier than expected."));
-      expect(errors[1].error, new isInstanceOf<HttpParserException>());
+      expect(errors[1].error, new isInstanceOf<HttpException>());
       if (errors.length > 2) {
-        expect(errors[2].error, new isInstanceOf<HttpParserException>());
+        expect(errors[2].error, new isInstanceOf<HttpException>());
       }
       expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
     });
@@ -166,16 +166,16 @@
 
     test('test 2', () {
       // TODO(nweiz): There can be three errors due to issue 9151. The
-      // HttpParserException is reported without a stack trace, and so when it's
+      // HttpException is reported without a stack trace, and so when it's
       // wrapped twice it registers as a different exception each time (because
       // it's given an ad-hoc stack trace). Always expect two exceptions when
       // issue 9151 is fixed.
       expect(errors.length, inInclusiveRange(2, 3));
       expect(errors[0].error, equals("'scheduled server 0' expected GET "
           "/goodbye, but got GET /hello."));
-      expect(errors[1].error, new isInstanceOf<HttpParserException>());
+      expect(errors[1].error, new isInstanceOf<HttpException>());
       if (errors.length > 2) {
-        expect(errors[2].error, new isInstanceOf<HttpParserException>());
+        expect(errors[2].error, new isInstanceOf<HttpException>());
       }
     });
   }, passing: ['test 2']);
@@ -199,16 +199,16 @@
 
     test('test 2', () {
       // TODO(nweiz): There can be three errors due to issue 9151. The
-      // HttpParserException is reported without a stack trace, and so when it's
+      // HttpException is reported without a stack trace, and so when it's
       // wrapped twice it registers as a different exception each time (because
       // it's given an ad-hoc stack trace). Always expect two exceptions when
       // issue 9151 is fixed.
       expect(errors.length, inInclusiveRange(2, 3));
       expect(errors[0].error, equals("'scheduled server 0' expected GET "
           "/hello, but got HEAD /hello."));
-      expect(errors[1].error, new isInstanceOf<HttpParserException>());
+      expect(errors[1].error, new isInstanceOf<HttpException>());
       if (errors.length > 2) {
-        expect(errors[2].error, new isInstanceOf<HttpParserException>());
+        expect(errors[2].error, new isInstanceOf<HttpException>());
       }
     });
   }, passing: ['test 2']);
@@ -304,16 +304,16 @@
 
     test('test 2', () {
       // TODO(nweiz): There can be three errors due to issue 9151. The
-      // HttpParserException is reported without a stack trace, and so when it's
+      // HttpException is reported without a stack trace, and so when it's
       // wrapped twice it registers as a different exception each time (because
       // it's given an ad-hoc stack trace). Always expect two exceptions when
       // issue 9151 is fixed.
       expect(errors.length, inInclusiveRange(2, 3));
       expect(errors[0].error, equals("'scheduled server 0' received GET "
           "/hello/3 when no more requests were expected."));
-      expect(errors[1].error, new isInstanceOf<HttpParserException>());
+      expect(errors[1].error, new isInstanceOf<HttpException>());
       if (errors.length > 2) {
-        expect(errors[2].error, new isInstanceOf<HttpParserException>());
+        expect(errors[2].error, new isInstanceOf<HttpException>());
       }
     });
   }, passing: ['test 2']);
@@ -336,15 +336,15 @@
 
     test('test 2', () {
       // TODO(nweiz): There can be three errors due to issue 9151. The
-      // HttpParserException is reported without a stack trace, and so when it's
+      // HttpException is reported without a stack trace, and so when it's
       // wrapped twice it registers as a different exception each time (because
       // it's given an ad-hoc stack trace). Always expect two exceptions when
       // issue 9151 is fixed.
       expect(errors.length, inInclusiveRange(2, 3));
       expect(errors[0].error, equals('oh no'));
-      expect(errors[1].error, new isInstanceOf<HttpParserException>());
+      expect(errors[1].error, new isInstanceOf<HttpException>());
       if (errors.length > 2) {
-        expect(errors[2].error, new isInstanceOf<HttpParserException>());
+        expect(errors[2].error, new isInstanceOf<HttpException>());
       }
     });
   }, passing: ['test 2']);
diff --git a/pkg/serialization/lib/src/mirrors_helpers.dart b/pkg/serialization/lib/src/mirrors_helpers.dart
index 4058514..19360bf 100644
--- a/pkg/serialization/lib/src/mirrors_helpers.dart
+++ b/pkg/serialization/lib/src/mirrors_helpers.dart
@@ -13,6 +13,14 @@
 export 'dart:mirrors';
 import 'serialization_helpers.dart';
 
+// TODO(alanknight): Remove this method.  It is working around a bug
+// in the Dart VM which incorrectly returns Object as the superclass
+// of Object.
+_getSuperclass(ClassMirror mirror) {
+  var superclass = mirror.superclass;
+  return (superclass == mirror) ? null : superclass;
+}
+
 /**
  * Return a list of all the public fields of a class, including inherited
  * fields.
@@ -20,9 +28,9 @@
 Iterable<VariableMirror> publicFields(ClassMirror mirror) {
   var mine = mirror.variables.values.where(
       (x) => !(x.isPrivate || x.isStatic));
-  var mySuperclass = mirror.superclass;
-  if (mySuperclass != mirror) {
-    return append(publicFields(mirror.superclass), mine);
+  var mySuperclass = _getSuperclass(mirror);
+  if (mySuperclass != null) {
+    return append(publicFields(mySuperclass), mine);
   } else {
     return mine;
   }
@@ -34,8 +42,8 @@
   if (name == null) return false;
   var field = mirror.variables[name];
   if (field != null && !field.isStatic) return true;
-  var superclass = mirror.superclass;
-  if (superclass == mirror) return false;
+  var superclass = _getSuperclass(mirror);
+  if (superclass == null) return false;
   return hasField(name, superclass);
 }
 
@@ -45,9 +53,9 @@
  */
 Iterable<MethodMirror> publicGetters(ClassMirror mirror) {
   var mine = mirror.getters.values.where((x) => !(x.isPrivate || x.isStatic));
-  var mySuperclass = mirror.superclass;
-  if (mySuperclass != mirror) {
-    return append(publicGetters(mirror.superclass), mine);
+  var mySuperclass = _getSuperclass(mirror);
+  if (mySuperclass != null) {
+    return append(publicGetters(mySuperclass), mine);
   } else {
     return mine.toList();
   }
@@ -58,8 +66,8 @@
   if (name == null) return false;
   var getter = mirror.getters[name];
   if (getter != null && !getter.isStatic) return true;
-  var superclass = mirror.superclass;
-  if (superclass == mirror) return false;
+  var superclass = _getSuperclass(mirror);
+  if (superclass == null) return false;
   return hasField(name, superclass);
 }
 
diff --git a/pkg/webdriver/lib/webdriver.dart b/pkg/webdriver/lib/webdriver.dart
index 0119c68..83ea292 100644
--- a/pkg/webdriver/lib/webdriver.dart
+++ b/pkg/webdriver/lib/webdriver.dart
@@ -882,9 +882,9 @@
    * Potential Errors: NoSuchWindow, XPathLookupError.
    */
   Future<String>
-      findElementFromId(String id, String strategy, String searchValue) {
-    _post('element/$id/element', { 'using': strategy, 'value' : searchValue });
-  }
+      findElementFromId(String id, String strategy, String searchValue) =>
+          _post('element/$id/element',
+              { 'using': strategy, 'value' : searchValue });
 
   /**
    * Search for multiple elements on the page, starting from the element with
@@ -897,8 +897,7 @@
   Future<List<String>>
       findElementsFromId(String id, String strategy, String searchValue) =>
           _post('element/$id/elements',
-              params: { 'using': strategy, 'value' : searchValue });
-
+              { 'using': strategy, 'value' : searchValue });
   /**
    * Click on an element specified by [id].
    *
diff --git a/runtime/bin/common.cc b/runtime/bin/common.cc
index ce9a9ef..fd6386e 100644
--- a/runtime/bin/common.cc
+++ b/runtime/bin/common.cc
@@ -58,5 +58,12 @@
   Dart_ExitScope();
 }
 
+
+void FUNCTION_NAME(Common_GetVersion)(Dart_NativeArguments args) {
+  Dart_EnterScope();
+  Dart_SetReturnValue(args, Dart_NewStringFromCString(Dart_VersionString()));
+  Dart_ExitScope();
+}
+
 }  // namespace bin
 }  // namespace dart
diff --git a/runtime/bin/common_patch.dart b/runtime/bin/common_patch.dart
index 8b77d3a..e1d36f4 100644
--- a/runtime/bin/common_patch.dart
+++ b/runtime/bin/common_patch.dart
@@ -11,3 +11,7 @@
   /* patch */ static Uint8List getRandomBytes(int count)
       native "Crypto_GetRandomBytes";
 }
+
+patch class _OptionsImpl {
+  /* patch */ String get version native "Common_GetVersion";
+}
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index fc90469..375c6d5 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -760,10 +760,10 @@
 }
 
 
-Dart_Handle DartUtils::NewDartSocketIOException(const char* message,
-                                                Dart_Handle os_error) {
-  // Create a dart:io SocketIOException object.
-  Dart_Handle clazz = GetDartClass(kIOLibURL, "SocketIOException");
+Dart_Handle DartUtils::NewDartSocketException(const char* message,
+                                              Dart_Handle os_error) {
+  // Create a dart:io SocketException object.
+  Dart_Handle clazz = GetDartClass(kIOLibURL, "SocketException");
   Dart_Handle args[2];
   args[0] = NewString(message);
   args[1] = os_error;
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index b84e773f..48db952 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -140,8 +140,8 @@
   static Dart_Handle NewDartOSError();
   // Create a new Dart OSError object with the provided OS error.
   static Dart_Handle NewDartOSError(OSError* os_error);
-  static Dart_Handle NewDartSocketIOException(const char* message,
-                                              Dart_Handle os_error);
+  static Dart_Handle NewDartSocketException(const char* message,
+                                            Dart_Handle os_error);
   static Dart_Handle NewDartExceptionWithMessage(const char* library_url,
                                                  const char* exception_name,
                                                  const char* message);
diff --git a/runtime/bin/directory.cc b/runtime/bin/directory.cc
index d15d734..6ca4ac0 100644
--- a/runtime/bin/directory.cc
+++ b/runtime/bin/directory.cc
@@ -394,7 +394,7 @@
   args[1] = DartUtils::NewString(dir_name);
   args[2] = dart_os_error;
   Dart_ThrowException(Dart_New(
-      DartUtils::GetDartClass(DartUtils::kIOLibURL, "DirectoryIOException"),
+      DartUtils::GetDartClass(DartUtils::kIOLibURL, "DirectoryException"),
       Dart_Null(),
       3,
       args));
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index 4678ba6..e5172b7 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -21,6 +21,7 @@
 // builtin_natives.cc instead.
 #define IO_NATIVE_LIST(V)                                                      \
   V(Common_IsBuiltinList, 1)                                                   \
+  V(Common_GetVersion, 1)                                                      \
   V(Crypto_GetRandomBytes, 1)                                                  \
   V(EventHandler_Start, 1)                                                     \
   V(EventHandler_SendData, 4)                                                  \
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 6f139b7..9081f70 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -112,6 +112,9 @@
 
 static bool ProcessBreakpointOption(const char* funcname) {
   ASSERT(funcname != NULL);
+  if (*funcname == '\0') {
+    return false;
+  }
   breakpoint_at = funcname;
   return true;
 }
@@ -119,6 +122,9 @@
 
 static bool ProcessPackageRootOption(const char* arg) {
   ASSERT(arg != NULL);
+  if (*arg == '\0' || *arg == '-') {
+    return false;
+  }
   package_root = arg;
   return true;
 }
@@ -197,6 +203,9 @@
 
 static bool ProcessVmStatsRootOption(const char* arg) {
   ASSERT(arg != NULL);
+  if (*arg == '\0') {
+    return false;
+  }
   vmstats_root = arg;
   return true;
 }
@@ -217,8 +226,9 @@
       return false;
     }
     generate_script_snapshot = true;
+    return true;
   }
-  return true;
+  return false;
 }
 
 
@@ -233,12 +243,11 @@
   { "--verbose", ProcessVerboseOption },
   { "-v", ProcessVerboseOption },
   { "--package-root=", ProcessPackageRootOption },
-  { "-p", ProcessPackageRootOption },
   // VM specific options to the standalone dart program.
-  { "--break_at=", ProcessBreakpointOption },
+  { "--break-at=", ProcessBreakpointOption },
   { "--compile_all", ProcessCompileAllOption },
   { "--debug", ProcessDebugOption },
-  { "--generate-script-snapshot=", ProcessGenScriptSnapshotOption },
+  { "--snapshot=", ProcessGenScriptSnapshotOption },
   { "--stats-root=", ProcessVmStatsRootOption },
   { "--stats", ProcessVmStatsOption },
   { "--print-script", ProcessPrintScriptOption },
@@ -250,10 +259,13 @@
 static bool ProcessMainOptions(const char* option) {
   int i = 0;
   const char* name = main_options[0].option_name;
+  int option_length = strlen(option);
   while (name != NULL) {
     int length = strlen(name);
-    if (strncmp(option, name, length) == 0) {
-      return main_options[i].process(option + length);
+    if ((option_length >= length) && (strncmp(option, name, length) == 0)) {
+      if (main_options[i].process(option + length)) {
+        return true;
+      }
     }
     i += 1;
     name = main_options[i].option_name;
@@ -305,7 +317,20 @@
       i++;
     } else {
       // Check if this flag is a potentially valid VM flag.
-      if (!IsValidFlag(argv[i], kPrefix, kPrefixLen)) {
+      const char* kChecked = "-c";
+      const char* kPackageRoot = "-p";
+      if (strncmp(argv[i], kPackageRoot, strlen(kPackageRoot)) == 0) {
+        if (!ProcessPackageRootOption(argv[i] + strlen(kPackageRoot))) {
+          i++;
+          if (!ProcessPackageRootOption(argv[i])) {
+            Log::PrintErr("Invalid option specification : '%s'\n", argv[i - 1]);
+            i++;
+            break;
+          }
+        }
+      } else if (strncmp(argv[i], kChecked, strlen(kChecked)) == 0) {
+        vm_options->AddArgument("--checked");
+      } else if (!IsValidFlag(argv[i], kPrefix, kPrefixLen)) {
         break;
       }
       const char* kPrintFlags1 = "--print-flags";
@@ -516,35 +541,38 @@
   if (!has_verbose_option) {
     Log::PrintErr(
 "Common options:\n"
-"--checked Insert runtime type checks and enable assertions (checked mode).\n"
-"--version Print the VM version.\n"
-"--help    Display this message (add --verbose for information about all\n"
-"          VM options).\n");
+"--checked or -c\n"
+"  Insert runtime type checks and enable assertions (checked mode).\n"
+"--help or -h\n"
+"  Display this message (add -v or --verbose for information about\n"
+"  all VM options).\n"
+"--package-root=<path> or -p<path>\n"
+"  Where to find packages, that is, \"package:...\" imports.\n"
+"--version\n"
+"  Print the VM version.\n");
   } else {
     Log::PrintErr(
 "Supported options:\n"
-"--checked\n"
+"--checked or -c\n"
 "  Insert runtime type checks and enable assertions (checked mode).\n"
-"\n"
+"--help or -h\n"
+"  Display this message (add -v or --verbose for information about\n"
+"  all VM options).\n"
+"--package-root=<path> or -p<path>\n"
+"  Where to find packages, that is, \"package:...\" imports.\n"
 "--version\n"
 "  Print the VM version.\n"
 "\n"
-"--help\n"
-"  Display this message (add --verbose for information about all VM options).\n"
-"\n"
-"--package-root=<path>\n"
-"  Where to find packages, that is, \"package:...\" imports.\n"
-"\n"
 "--debug[:<port number>]\n"
 "  enables debugging and listens on specified port for debugger connections\n"
 "  (default port number is 5858)\n"
 "\n"
-"--break_at=<location>\n"
+"--break-at=<location>\n"
 "  sets a breakpoint at specified location where <location> is one of :\n"
 "  url:<line_num> e.g. test.dart:10\n"
 "  [<class_name>.]<function_name> e.g. B.foo\n"
 "\n"
-"--generate-script-snapshot=<file_name>\n"
+"--snapshot=<file_name>\n"
 "  loads Dart script and generates a snapshot in the specified file\n"
 "\n"
 "--print-script\n"
diff --git a/runtime/bin/secure_socket.h b/runtime/bin/secure_socket.h
index 45334d6..010b5ad 100644
--- a/runtime/bin/secure_socket.h
+++ b/runtime/bin/secure_socket.h
@@ -26,9 +26,9 @@
 namespace bin {
 
 static void ThrowException(const char* message) {
-  Dart_Handle socket_io_exception =
-      DartUtils::NewDartSocketIOException(message, Dart_Null());
-  Dart_ThrowException(socket_io_exception);
+  Dart_Handle socket_exception =
+      DartUtils::NewDartSocketException(message, Dart_Null());
+  Dart_ThrowException(socket_exception);
 }
 
 
@@ -38,9 +38,9 @@
   const char* error_message = PR_ErrorToString(error_code, PR_LANGUAGE_EN);
   OSError os_error_struct(error_code, error_message, OSError::kNSS);
   Dart_Handle os_error = DartUtils::NewDartOSError(&os_error_struct);
-  Dart_Handle socket_io_exception =
-      DartUtils::NewDartSocketIOException(message, os_error);
-  Dart_ThrowException(socket_io_exception);
+  Dart_Handle socket_exception =
+      DartUtils::NewDartSocketException(message, os_error);
+  Dart_ThrowException(socket_exception);
 }
 
 /*
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index d603532..7d0f5da 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -237,7 +237,7 @@
                                                      backlog,
                                                      v6Only);
           if (result is OSError) {
-            throw new SocketIOException(
+            throw new SocketException(
                 "Failed to create server socket", result);
           }
           if (port != 0) socket.localPort = port;
@@ -490,20 +490,20 @@
   // error objects.
   static createError(error, String message) {
     if (error is OSError) {
-      return new SocketIOException(message, error);
+      return new SocketException(message, error);
     } else if (error is List) {
       assert(isErrorResponse(error));
       switch (error[0]) {
         case _ILLEGAL_ARGUMENT_RESPONSE:
           return new ArgumentError();
         case _OSERROR_RESPONSE:
-          return new SocketIOException(
+          return new SocketException(
               message, new OSError(error[2], error[1]));
         default:
           return new Exception("Unknown error");
       }
     } else {
-      return new SocketIOException(message);
+      return new SocketException(message);
     }
   }
 
diff --git a/runtime/bin/stdio_patch.dart b/runtime/bin/stdio_patch.dart
index cb1c920..90b3a41 100644
--- a/runtime/bin/stdio_patch.dart
+++ b/runtime/bin/stdio_patch.dart
@@ -12,7 +12,7 @@
       case _STDIO_HANDLE_TYPE_FILE:
         return new _StdStream(new _FileStream.forStdin());
       default:
-        throw new FileIOException("Unsupported stdin type");
+        throw new FileException("Unsupported stdin type");
     }
   }
 
@@ -26,14 +26,14 @@
       case _STDIO_HANDLE_TYPE_FILE:
         return new _StdSink(new IOSink(new _FileStreamConsumer.fromStdio(fd)));
       default:
-        throw new FileIOException("Unsupported stdin type");
+        throw new FileException("Unsupported stdin type");
     }
   }
 
   static int _socketType(nativeSocket) {
     var result = _getSocketType(nativeSocket);
     if (result is OSError) {
-      throw new FileIOException("Error retreiving socket type", result);
+      throw new FileException("Error retreiving socket type", result);
     }
     return result;
   }
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index 3cdb2a1..16c3232 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -467,75 +467,6 @@
 
   String toLowerCase() native "String_toLowerCase";
 
-  // Implementations of Strings methods follow below.
-  static String join(Iterable<String> strings, String separator) {
-    bool first = true;
-    List<String> stringsList = <String>[];
-    for (String string in strings) {
-      if (first) {
-        first = false;
-      } else {
-        stringsList.add(separator);
-      }
-
-      if (string is! String) {
-        throw new ArgumentError(Error.safeToString(string));
-      }
-      stringsList.add(string);
-    }
-    return concatAll(stringsList);
-  }
-
-  static String concatAll(Iterable<String> strings) {
-    _ObjectArray stringsArray;
-    final len = strings.length;
-    bool isOneByteString = true;
-    int totalLength = 0;
-    if (strings._cid == _ObjectArray._clCId) {
-      stringsArray = strings;
-      for (int i = 0; i < len; i++) {
-        var string = strings[i];
-        if (string._cid == _OneByteString._classId) {
-          totalLength += string.length;
-        } else {
-          isOneByteString = false;
-          if (string is! String) throw new ArgumentError(string);
-        }
-      }
-    } else {
-      // Copy into an _ObjectArray.
-      stringsArray = new _ObjectArray(len);
-      int i = 0;
-      for (int i = 0; i < len; i++) {
-        var string = strings[i];
-        if (string._cid == _OneByteString.clCid) {
-          totalLength += s.length;
-        } else {
-          isOneByteString = false;
-          if (string is! String) throw new ArgumentError(string);
-        }
-        stringsArray[i++] = string;
-      }
-    }
-    if (isOneByteString) {
-      return _OneByteString._concatAll(stringsArray, totalLength);
-    }
-    return _concatAllNative(stringsArray);
-  }
-
-  static String _concatAll(_ObjectArray<String> strings) {
-    int totalLength = 0;
-    final stringsLength = strings.length;
-    for (int i = 0; i < stringsLength; i++) {
-      var e = strings[i];
-      if (e._cid != _OneByteString._classId) {
-        return _concatAllNative(strings);
-      }
-      totalLength += e.length;
-    }
-    return _OneByteString._concatAll(strings, totalLength);
-  }
-
   // Call this method if not all list elements are OneByteString-s.
   static String _concatAllNative(_ObjectArray<String> strings)
       native "Strings_concatAll";
diff --git a/runtime/lib/typed_data.cc b/runtime/lib/typed_data.cc
index b1b2632..23f0b83 100644
--- a/runtime/lib/typed_data.cc
+++ b/runtime/lib/typed_data.cc
@@ -42,16 +42,10 @@
 
 // Checks to see if a length will not result in an OOM error.
 static void LengthCheck(intptr_t len, intptr_t max) {
-  if (len > max) {
+  if (len < 0 || len > max) {
     const String& error = String::Handle(String::NewFormatted(
-        "insufficient memory to allocate a TypedData object of length (%"Pd")",
-        len));
-    const Array& args = Array::Handle(Array::New(1));
-    args.SetAt(0, error);
-    Exceptions::ThrowByType(Exceptions::kOutOfMemory, args);
-  } else if (len < 0) {
-    const String& error = String::Handle(String::NewFormatted(
-        "%"Pd" must be greater than 0", len));
+        "Length (%"Pd") of object must be in range [0..%"Pd"]",
+        len, max));
     const Array& args = Array::Handle(Array::New(1));
     args.SetAt(0, error);
     Exceptions::ThrowByType(Exceptions::kArgument, args);
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 9130d89..b11812d 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -59,22 +59,21 @@
 dart/byte_array_test: Fail
 dart/byte_array_optimized_test: Fail
 
+[ $arch == arm ]
+cc/DoubleToFloatConversion: Fail # Issue: 11207
+cc/DoubleToIntConversion: Fail # Issue: 11207
+cc/FloatToDoubleConversion: Fail # Issue: 11207
+cc/FloatToIntConversion: Fail # Issue: 11207
+cc/IntToDoubleConversion: Fail # Issue: 11207
+cc/IntToFloatConversion: Fail # Issue: 11207
+
 [ $arch == mips ]
 *: Skip
 
 [ $arch == simmips ]
 # Tests missing code generation support.
-cc/CorelibCompileAll: Skip
-cc/Dart2JSCompileAll: Skip
-cc/ParsePatchLibrary: Skip
 dart/byte_array_test: Skip
 dart/byte_array_optimized_test: Skip
-dart/inline_stack_frame_test: Skip
-
-# Bug in optimized code generation.
-cc/ExternalStringDeoptimize: Skip
-dart/inline_stack_frame_test: Skip
-dart/isolate_mirror_local_test: Skip
 
 # TODO(ajohnsen): Fix this as part of library changes.
 [ $compiler == none ]
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index 889eea1..8f43046 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -335,6 +335,7 @@
 
 
 void Assembler::EnterStubFrame(bool uses_pp) {
+  SetPrologueOffset();
   if (uses_pp) {
     addiu(SP, SP, Immediate(-4 * kWordSize));
     sw(ZR, Address(SP, 3 * kWordSize));  // PC marker is 0 in stubs.
@@ -442,6 +443,8 @@
 void Assembler::EnterDartFrame(intptr_t frame_size) {
   const intptr_t offset = CodeSize();
 
+  SetPrologueOffset();
+
   addiu(SP, SP, Immediate(-4 * kWordSize));
   sw(RA, Address(SP, 2 * kWordSize));
   sw(FP, Address(SP, 1 * kWordSize));
@@ -451,7 +454,7 @@
   // Branch and link to the instruction after the delay slot to get the PC.
   bal(&next);
   // RA is the address of the sw instruction below. Save it in T0.
-  delay_slot()->mov(T0, RA);
+  delay_slot()->mov(TMP1, RA);
 
   // Calculate the offset of the pool pointer from the PC.
   const intptr_t object_pool_pc_dist =
@@ -464,19 +467,19 @@
 
   // Save PC in frame for fast identification of corresponding code.
   if (offset == 0) {
-    sw(T0, Address(SP, 3 * kWordSize));
+    sw(TMP1, Address(SP, 3 * kWordSize));
   } else {
     // Adjust saved PC for any intrinsic code that could have been generated
     // before a frame is created.
-    AddImmediate(T1, T0, -offset);
-    sw(T1, Address(SP, 3 * kWordSize));
+    addiu(TMP1, TMP1, Immediate(-offset));
+    sw(TMP1, Address(SP, 3 * kWordSize));
   }
 
   // Set FP to the saved previous FP.
   addiu(FP, SP, Immediate(kWordSize));
 
-  // Load the pool pointer.
-  lw(PP, Address(T0, -object_pool_pc_dist));
+  // Load the pool pointer. offset has already been subtracted from TMP1.
+  lw(PP, Address(TMP1, -object_pool_pc_dist + offset));
 
   // Reserve space for locals.
   AddImmediate(SP, -frame_size);
@@ -513,11 +516,9 @@
       2 * kWordSize +  // FP and RA.
       kDartVolatileFpuRegCount * kWordSize;
 
-  TraceSimMsg("EnterCallRuntimeFrame");
+  SetPrologueOffset();
 
-  if (prologue_offset_ == -1) {
-    prologue_offset_ = CodeSize();
-  }
+  TraceSimMsg("EnterCallRuntimeFrame");
 
   // Save volatile CPU and FPU registers on the stack:
   // -------------
@@ -601,6 +602,32 @@
 }
 
 
+static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
+  "zr", "tmp", "v0", "v1", "a0", "a1", "a2", "a3",
+  "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
+  "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
+  "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra",
+};
+
+
+const char* Assembler::RegisterName(Register reg) {
+  ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters));
+  return cpu_reg_names[reg];
+}
+
+
+static const char* fpu_reg_names[kNumberOfFpuRegisters] = {
+  "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
+  "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
+};
+
+
+const char* Assembler::FpuRegisterName(FpuRegister reg) {
+  ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters));
+  return fpu_reg_names[reg];
+}
+
+
 void Assembler::Stop(const char* message) {
   if (FLAG_print_stop_message) {
     UNIMPLEMENTED();
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index 8becc75..9b22f3e 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -158,7 +158,7 @@
 
   // Misc. functionality
   int CodeSize() const { return buffer_.Size(); }
-  int prologue_offset() const { return -1; }
+  int prologue_offset() const { return prologue_offset_; }
   const ZoneGrowableArray<int>& GetPointerOffsets() const {
     return buffer_.pointer_offsets();
   }
@@ -205,14 +205,14 @@
 
   const Code::Comments& GetCodeComments() const;
 
-  static const char* RegisterName(Register reg) {
-    UNIMPLEMENTED();
-    return NULL;
-  }
+  static const char* RegisterName(Register reg);
 
-  static const char* FpuRegisterName(FpuRegister reg) {
-    UNIMPLEMENTED();
-    return NULL;
+  static const char* FpuRegisterName(FpuRegister reg);
+
+  void SetPrologueOffset() {
+    if (prologue_offset_ == -1) {
+      prologue_offset_ = CodeSize();
+    }
   }
 
   // A utility to be able to assemble an instruction into the delay slot.
@@ -816,7 +816,8 @@
   }
 
   void AddImmediate(Register rd, Register rs, int32_t value) {
-    if (value == 0) return;
+    if ((value == 0) && (rd == rs)) return;
+    // If value is 0, we still want to move rs to rd if they aren't the same.
     if (Utils::IsInt(kImmBits, value)) {
       addiu(rd, rs, Immediate(value));
     } else {
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 86ca5af..68e167f 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1515,7 +1515,7 @@
 // Copies saved registers and caller's frame into temporary buffers.
 // Returns the stack size of unoptimized frame.
 DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
-                          uword saved_registers_address) {
+                          1, uword saved_registers_address) {
   Isolate* isolate = Isolate::Current();
   StackZone zone(isolate);
   HANDLESCOPE(isolate);
@@ -1639,7 +1639,7 @@
 
 // The stack has been adjusted to fit all values for unoptimized frame.
 // Fill the unoptimized frame.
-DEFINE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, uword last_fp) {
+DEFINE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, 1, uword last_fp) {
   Isolate* isolate = Isolate::Current();
   StackZone zone(isolate);
   HANDLESCOPE(isolate);
@@ -1726,6 +1726,7 @@
 
 DEFINE_LEAF_RUNTIME_ENTRY(intptr_t,
                           BigintCompare,
+                          2,
                           RawBigint* left,
                           RawBigint* right) {
   Isolate* isolate = Isolate::Current();
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index a1c3f9e..a68144f 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -130,8 +130,8 @@
 
 
 // Register aliases for floating point scratch registers.
-const DRegister DTMP = D0;  // Overlaps with STMP.
-const SRegister STMP = S0;
+const DRegister DTMP = D15;  // Overlaps with STMP.
+const SRegister STMP = S30;
 
 // Architecture independent aliases.
 typedef DRegister FpuRegister;
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 0afd8df..bf35ec2 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -2043,7 +2043,7 @@
   const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(list));
   // If the list is immutable we call into Dart for the indexed setter to
   // get the unsupported operation exception as the result.
-  if (obj.IsArray() && !obj.IsImmutableArray()) {
+  if (obj.IsArray() && !Array::Cast(obj).IsImmutable()) {
     SET_LIST_ELEMENT(isolate, Array, obj, index, value);
   } else if (obj.IsGrowableObjectArray()) {
     SET_LIST_ELEMENT(isolate, GrowableObjectArray, obj, index, value);
@@ -2297,7 +2297,7 @@
       return Api::NewError("Invalid length passed in to access list elements");
     }
   }
-  if (obj.IsArray() && !obj.IsImmutableArray()) {
+  if (obj.IsArray() && !Array::Cast(obj).IsImmutable()) {
     // If the list is immutable we call into Dart for the indexed setter to
     // get the unsupported operation exception as the result.
     SET_LIST_ELEMENT_AS_BYTES(isolate,
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 449370f..27abae0 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -387,6 +387,7 @@
     const AbstractType& type,
     Label* is_instance_lbl,
     Label* is_not_instance_lbl) {
+  __ TraceSimMsg("UninstantiatedTypeTest");
   __ Comment("UninstantiatedTypeTest");
   ASSERT(!type.IsInstantiated());
   // Skip check if destination is a dynamic type.
@@ -717,6 +718,7 @@
   __ AddImmediate(T0, FP, (kFirstLocalSlotFromFp + 1) * kWordSize);
   __ sll(T2, T2, 1);  // T2 is a Smi.
 
+  __ Comment("Argument Copy Loop");
   Label loop, loop_exit;
   __ blez(T2, &loop_exit);
   __ delay_slot()->subu(T0, T0, T2);
@@ -732,6 +734,7 @@
   // Copy or initialize optional named arguments.
   Label all_arguments_processed;
   if (num_opt_named_params > 0) {
+    __ Comment("There are named parameters");
     // Start by alphabetically sorting the names of the optional parameters.
     LocalVariable** opt_param = new LocalVariable*[num_opt_named_params];
     int* opt_param_position = new int[num_opt_named_params];
@@ -804,6 +807,7 @@
     __ beq(T3, NULLREG, &all_arguments_processed);
   } else {
     ASSERT(num_opt_pos_params > 0);
+    __ Comment("There are optional positional parameters");
     __ lw(T2,
           FieldAddress(S4, ArgumentsDescriptor::positional_count_offset()));
     __ SmiUntag(T2);
@@ -882,6 +886,7 @@
   __ lw(T2, FieldAddress(S4, ArgumentsDescriptor::count_offset()));
   __ sll(T2, T2, 1);  // T2 is a Smi.
 
+  __ Comment("Null arguments loop");
   Label null_args_loop, null_args_loop_exit;
   __ blez(T2, &null_args_loop_exit);
   __ delay_slot()->addiu(T1, FP,
@@ -919,7 +924,6 @@
 
 
 void FlowGraphCompiler::EmitFrameEntry() {
-  __ TraceSimMsg("FrameEntry");
   const Function& function = parsed_function().function();
   if (CanOptimizeFunction() && function.is_optimizable()) {
     const bool can_optimize = !is_optimizing() || may_reoptimize();
@@ -1144,7 +1148,6 @@
                                      const ExternalLabel* label,
                                      PcDescriptors::Kind kind,
                                      LocationSummary* locs) {
-  __ TraceSimMsg("Call");
   __ BranchLinkPatchable(label);
   AddCurrentDescriptor(kind, Isolate::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
@@ -1156,7 +1159,6 @@
                                          const ExternalLabel* label,
                                          PcDescriptors::Kind kind,
                                          LocationSummary* locs) {
-  __ TraceSimMsg("DartCall");
   __ BranchLinkPatchable(label);
   AddCurrentDescriptor(kind, deopt_id, token_pos);
   RecordSafepoint(locs);
@@ -1179,7 +1181,6 @@
                                             intptr_t deopt_id,
                                             const RuntimeEntry& entry,
                                             LocationSummary* locs) {
-  __ TraceSimMsg("CallRuntime");
   __ CallRuntime(entry);
   AddCurrentDescriptor(PcDescriptors::kOther, deopt_id, token_pos);
   RecordSafepoint(locs);
@@ -1197,7 +1198,6 @@
                            token_pos);
     }
   }
-  __ TraceSimMsg("CallRuntime return");
 }
 
 
@@ -1215,6 +1215,7 @@
   // top-level function (parsed_function().function()) which could be
   // reoptimized and which counter needs to be incremented.
   // Pass the function explicitly, it is used in IC stub.
+  __ TraceSimMsg("OptimizedInstanceCall");
   __ LoadObject(T0, parsed_function().function());
   __ LoadObject(S4, arguments_descriptor);
   __ LoadObject(S5, ic_data);
@@ -1254,7 +1255,66 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     LocationSummary* locs) {
-  UNIMPLEMENTED();
+  MegamorphicCacheTable* table = Isolate::Current()->megamorphic_cache_table();
+  const String& name = String::Handle(ic_data.target_name());
+  const MegamorphicCache& cache =
+      MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
+  Label not_smi, load_cache;
+  __ TraceSimMsg("MegamorphicInstanceCall");
+  __ lw(T0, Address(SP, (argument_count - 1) * kWordSize));
+  __ andi(CMPRES, T0, Immediate(kSmiTagMask));
+  __ bne(CMPRES, ZR, &not_smi);
+  __ LoadImmediate(T0, Smi::RawValue(kSmiCid));
+  __ b(&load_cache);
+
+  __ Bind(&not_smi);
+  __ LoadClassId(T0, T0);
+  __ SmiTag(T0);
+
+  // T0: class ID of the receiver (smi).
+  __ Bind(&load_cache);
+  __ LoadObject(T1, cache);
+  __ lw(T2, FieldAddress(T1, MegamorphicCache::buckets_offset()));
+  __ lw(T1, FieldAddress(T1, MegamorphicCache::mask_offset()));
+  // T2: cache buckets array.
+  // T1: mask.
+  __ mov(T3, T0);
+
+  Label loop, update, call_target_function;
+  __ b(&loop);
+
+  __ Bind(&update);
+  __ addiu(T3, T3, Immediate(Smi::RawValue(1)));
+  __ Bind(&loop);
+  __ and_(T3, T3, T1);
+  const intptr_t base = Array::data_offset();
+  // T3 is smi tagged, but table entries are two words, so LSL 2.
+  __ sll(TMP1, T3, 2);
+  __ addu(TMP1, T2, TMP1);
+  __ lw(T4, FieldAddress(TMP, base));
+
+  ASSERT(kIllegalCid == 0);
+  __ beq(T4, ZR, &call_target_function);
+  __ bne(T4, T0, &update);
+
+  __ Bind(&call_target_function);
+  // Call the target found in the cache.  For a class id match, this is a
+  // proper target for the given name and arguments descriptor.  If the
+  // illegal class id was found, the target is a cache miss handler that can
+  // be invoked as a normal Dart function.
+  __ sll(TMP1, T3, 2);
+  __ addu(TMP1, T2, TMP1);
+  __ lw(T0, FieldAddress(TMP, base + kWordSize));
+  __ lw(T0, FieldAddress(T0, Function::code_offset()));
+  __ lw(T0, FieldAddress(T0, Code::instructions_offset()));
+  __ LoadObject(S5, ic_data);
+  __ LoadObject(S4, arguments_descriptor);
+  __ AddImmediate(T0, Instructions::HeaderSize() - kHeapObjectTag);
+  __ jalr(T0);
+  AddCurrentDescriptor(PcDescriptors::kOther, Isolate::kNoDeoptId, token_pos);
+  RecordSafepoint(locs);
+  AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
+  __ Drop(argument_count);
 }
 
 
@@ -1282,6 +1342,7 @@
                                                     const Object& obj,
                                                     bool needs_number_check,
                                                     intptr_t token_pos) {
+  __ TraceSimMsg("EqualityRegConstCompare");
   if (needs_number_check &&
       (obj.IsMint() || obj.IsDouble() || obj.IsBigint())) {
     __ addiu(SP, SP, Immediate(-2 * kWordSize));
@@ -1292,6 +1353,7 @@
                          Isolate::kNoDeoptId,
                          token_pos);
     __ delay_slot()->sw(TMP1, Address(SP, 0 * kWordSize));
+    __ TraceSimMsg("EqualityRegConstCompare return");
     __ lw(reg, Address(SP, 1 * kWordSize));  // Restore 'reg'.
     __ addiu(SP, SP, Immediate(2 * kWordSize));  // Discard constant.
     return;
@@ -1325,9 +1387,27 @@
 }
 
 
+// Implement equality spec: if any of the arguments is null do identity check.
+// Fallthrough calls super equality.
 void FlowGraphCompiler::EmitSuperEqualityCallPrologue(Register result,
                                                       Label* skip_call) {
-  UNIMPLEMENTED();
+  Label check_identity, is_false, fall_through;
+  __ TraceSimMsg("SuperEqualityCallPrologue");
+  __ lw(result, Address(SP, 0 * kWordSize));  // Load right operand.
+  __ lw(TMP1, Address(SP, 1 * kWordSize));  // Load left operand.
+  __ beq(result, NULLREG, &check_identity);  // Is right null?
+  __ bne(TMP1, NULLREG, &fall_through);  // If right is non-null, check left.
+
+  __ Bind(&check_identity);
+  __ bne(result, TMP1, &is_false);
+  __ LoadObject(result, Bool::True());
+  __ Drop(2);
+  __ b(skip_call);
+  __ Bind(&is_false);
+  __ LoadObject(result, Bool::False());
+  __ Drop(2);
+  __ b(skip_call);
+  __ Bind(&fall_through);
 }
 
 
@@ -1384,13 +1464,48 @@
 
 void FlowGraphCompiler::EmitTestAndCall(const ICData& ic_data,
                                         Register class_id_reg,
-                                        intptr_t arg_count,
-                                        const Array& arg_names,
+                                        intptr_t argument_count,
+                                        const Array& argument_names,
                                         Label* deopt,
                                         intptr_t deopt_id,
                                         intptr_t token_index,
                                         LocationSummary* locs) {
-  UNIMPLEMENTED();
+  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
+  Label match_found;
+  const intptr_t len = ic_data.NumberOfChecks();
+  GrowableArray<CidTarget> sorted(len);
+  SortICDataByCount(ic_data, &sorted);
+  ASSERT(class_id_reg != S4);
+  ASSERT(len > 0);  // Why bother otherwise.
+  const Array& arguments_descriptor =
+      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
+                                                 argument_names));
+  __ TraceSimMsg("EmitTestAndCall");
+  __ LoadObject(S4, arguments_descriptor);
+  for (intptr_t i = 0; i < len; i++) {
+    const bool is_last_check = (i == (len - 1));
+    Label next_test;
+    if (is_last_check) {
+      __ BranchNotEqual(class_id_reg, sorted[i].cid, deopt);
+    } else {
+      __ BranchNotEqual(class_id_reg, sorted[i].cid, &next_test);
+    }
+    // Do not use the code from the function, but let the code be patched so
+    // that we can record the outgoing edges to other code.
+    GenerateDartCall(deopt_id,
+                     token_index,
+                     &StubCode::CallStaticFunctionLabel(),
+                     PcDescriptors::kFuncCall,
+                     locs);
+    const Function& function = *sorted[i].target;
+    AddStaticCallTarget(function);
+    __ Drop(argument_count);
+    if (!is_last_check) {
+      __ b(&match_found);
+    }
+    __ Bind(&next_test);
+  }
+  __ Bind(&match_found);
 }
 
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 35b3f25..186e148 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -2453,27 +2453,27 @@
 
 extern const RuntimeEntry kPowRuntimeEntry(
     "libc_pow", reinterpret_cast<RuntimeFunction>(
-        static_cast<BinaryMathCFunction>(&pow)), 0, true);
+        static_cast<BinaryMathCFunction>(&pow)), 2, true, true);
 
 extern const RuntimeEntry kModRuntimeEntry(
     "DartModulo", reinterpret_cast<RuntimeFunction>(
-        static_cast<BinaryMathCFunction>(&DartModulo)), 0, true);
+        static_cast<BinaryMathCFunction>(&DartModulo)), 2, true, true);
 
 extern const RuntimeEntry kFloorRuntimeEntry(
     "libc_floor", reinterpret_cast<RuntimeFunction>(
-        static_cast<UnaryMathCFunction>(&floor)), 0, true);
+        static_cast<UnaryMathCFunction>(&floor)), 1, true, true);
 
 extern const RuntimeEntry kCeilRuntimeEntry(
     "libc_ceil", reinterpret_cast<RuntimeFunction>(
-        static_cast<UnaryMathCFunction>(&ceil)), 0, true);
+        static_cast<UnaryMathCFunction>(&ceil)), 1, true, true);
 
 extern const RuntimeEntry kTruncRuntimeEntry(
     "libc_trunc", reinterpret_cast<RuntimeFunction>(
-        static_cast<UnaryMathCFunction>(&trunc)), 0, true);
+        static_cast<UnaryMathCFunction>(&trunc)), 1, true, true);
 
 extern const RuntimeEntry kRoundRuntimeEntry(
     "libc_round", reinterpret_cast<RuntimeFunction>(
-        static_cast<UnaryMathCFunction>(&round)), 0, true);
+        static_cast<UnaryMathCFunction>(&round)), 1, true, true);
 
 
 const RuntimeEntry& InvokeMathCFunctionInstr::TargetFunction() const {
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index e3971af..55746ec 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -1026,7 +1026,9 @@
   // into the runtime system.
   uword entry = reinterpret_cast<uword>(native_c_function());
 #if defined(USING_SIMULATOR)
-  entry = Simulator::RedirectExternalReference(entry, Simulator::kNativeCall);
+  entry = Simulator::RedirectExternalReference(entry,
+                                               Simulator::kNativeCall,
+                                               function().NumParameters());
 #endif
   __ LoadImmediate(R5, entry);
   __ LoadImmediate(R1, NativeArguments::ComputeArgcTag(function()));
@@ -2099,7 +2101,7 @@
     } else if ((value < 0) || (value >= kCountLimit)) {
       // This condition may not be known earlier in some cases because
       // of constant propagation, inlining, etc.
-      if ((value >=kCountLimit) && is_truncating) {
+      if ((value >= kCountLimit) && is_truncating) {
         __ mov(result, ShifterOperand(0));
       } else {
         // Result is Mint or exception.
@@ -2159,7 +2161,7 @@
         __ cmp(right, ShifterOperand(0));
         __ b(deopt, MI);
       }
-      Label done, is_not_zero;
+
       __ cmp(right,
              ShifterOperand(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
       __ mov(result, ShifterOperand(0), CS);
@@ -3053,11 +3055,11 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* result =
       new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall);
-  result->set_in(0, Location::FpuRegisterLocation(D1));
+  result->set_in(0, Location::FpuRegisterLocation(D0));
   if (InputCount() == 2) {
-    result->set_in(1, Location::FpuRegisterLocation(D2));
+    result->set_in(1, Location::FpuRegisterLocation(D1));
   }
-  result->set_out(Location::FpuRegisterLocation(D1));
+  result->set_out(Location::FpuRegisterLocation(D0));
   return result;
 }
 
@@ -3075,12 +3077,11 @@
     __ b(&skip_call);
   }
   __ Bind(&do_call);
-  __ vmovrrd(R0, R1, locs()->in(0).fpu_reg());
-  __ vmovrrd(R2, R3, locs()->in(1).fpu_reg());
-  // TODO(regis): This leaf runtime call is not yet supported by the simulator.
-  // We need a new leaf floating point runtime call kind.
+  // We currently use 'hardfp' ('gnueabihf') rather than 'softfp'
+  // ('gnueabi') float ABI for leaf runtime calls, i.e. double values
+  // are passed and returned in vfp registers rather than in integer
+  // register pairs.
   __ CallRuntime(TargetFunction());
-  __ vmovdrr(locs()->out().fpu_reg(), R0, R1);
   __ Bind(&skip_call);
 }
 
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 5610b8b..5c4a45c 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -268,13 +268,37 @@
 
 
 LocationSummary* ArgumentDefinitionTestInstr::MakeLocationSummary() const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(T0));
+  locs->set_out(Location::RegisterLocation(T0));
+  return locs;
 }
 
 
 void ArgumentDefinitionTestInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register saved_args_desc = locs()->in(0).reg();
+  Register result = locs()->out().reg();
+
+  __ TraceSimMsg("ArgumentDefinitionTestInstr");
+
+  __ addiu(SP, SP, Immediate(-4 * kWordSize));
+  // Push the result place holder initialized to NULL.
+  __ LoadObject(TMP1, Object::ZoneHandle());
+  __ sw(TMP1, Address(SP, 3 * kWordSize));
+  __ LoadImmediate(TMP1, Smi::RawValue(formal_parameter_index()));
+  __ sw(TMP1, Address(SP, 2 * kWordSize));
+  __ LoadObject(TMP1, formal_parameter_name());
+  __ sw(TMP1, Address(SP, 1 * kWordSize));
+  __ sw(saved_args_desc, Address(SP, 0 * kWordSize));
+  compiler->GenerateCallRuntime(token_pos(),
+                                deopt_id(),
+                                kArgumentDefinitionTestRuntimeEntry,
+                                locs());
+  __ lw(result, Address(SP, 3 * kWordSize));  // Pop bool result.
+  __ addiu(SP, SP, Immediate(4 * kWordSize));
 }
 
 
@@ -355,7 +379,6 @@
                                        Token::Kind kind,
                                        LocationSummary* locs,
                                        const ICData& original_ic_data) {
-  __ TraceSimMsg("EmitEqualityAsInstanceCall");
   if (!compiler->is_optimizing()) {
     compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
                                    deopt_id,
@@ -365,7 +388,10 @@
   const Array& kNoArgumentNames = Array::Handle();
   const int kNumArgumentsChecked = 2;
 
+  __ TraceSimMsg("EmitEqualityAsInstanceCall");
   Label check_identity;
+  __ lw(A1, Address(SP, 1 * kWordSize));
+  __ lw(A0, Address(SP, 0 * kWordSize));
   __ beq(A1, NULLREG, &check_identity);
   __ beq(A0, NULLREG, &check_identity);
 
@@ -385,9 +411,6 @@
                                    deopt_id,
                                    kNumArgumentsChecked);
   }
-  __ addiu(SP, SP, Immediate(-2 * kWordSize));
-  __ sw(A1, Address(SP, 1 * kWordSize));
-  __ sw(A0, Address(SP, 0 * kWordSize));
   compiler->GenerateInstanceCall(deopt_id,
                                  token_pos,
                                  kNumberOfArguments,
@@ -402,6 +425,9 @@
   if (compiler->is_optimizing()) {
     // No need to update IC data.
     Label is_true;
+    __ lw(A1, Address(SP, 1 * kWordSize));
+    __ lw(A0, Address(SP, 0 * kWordSize));
+    __ addiu(SP, SP, Immediate(2 * kWordSize));
     __ beq(A1, A0, &is_true);
     __ LoadObject(V0, (kind == Token::kEQ) ? Bool::False() : Bool::True());
     __ b(&equality_done);
@@ -422,6 +448,7 @@
                            &StubCode::EqualityWithNullArgLabel(),
                            PcDescriptors::kRuntimeCall,
                            locs);
+    __ Drop(2);
   }
   __ Bind(&check_ne);
   if (kind == Token::kNE) {
@@ -458,6 +485,129 @@
 }
 
 
+static Condition TokenKindToSmiCondition(Token::Kind kind) {
+  switch (kind) {
+    case Token::kEQ: return EQ;
+    case Token::kNE: return NE;
+    case Token::kLT: return LT;
+    case Token::kGT: return GT;
+    case Token::kLTE: return LE;
+    case Token::kGTE: return GE;
+    default:
+      UNREACHABLE();
+      return VS;
+  }
+}
+
+
+// Branches on condition c assuming comparison results in CMPRES and TMP1.
+static void EmitBranchAfterCompare(
+    FlowGraphCompiler* compiler, Condition c, Label* is_true) {
+  switch (c) {
+    case EQ: __ beq(CMPRES, TMP1, is_true); break;
+    case NE: __ bne(CMPRES, TMP1, is_true); break;
+    case GT: __ bne(TMP1, ZR, is_true); break;
+    case GE: __ beq(CMPRES, ZR, is_true); break;
+    case LT: __ bne(CMPRES, ZR, is_true); break;
+    case LE: __ beq(TMP1, ZR, is_true); break;
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
+// A1: left, also on stack.
+// A0: right, also on stack.
+static void EmitEqualityAsPolymorphicCall(FlowGraphCompiler* compiler,
+                                          const ICData& orig_ic_data,
+                                          LocationSummary* locs,
+                                          BranchInstr* branch,
+                                          Token::Kind kind,
+                                          intptr_t deopt_id,
+                                          intptr_t token_pos) {
+  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
+  const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
+  ASSERT(ic_data.NumberOfChecks() > 0);
+  ASSERT(ic_data.num_args_tested() == 1);
+  Label* deopt = compiler->AddDeoptStub(deopt_id, kDeoptEquality);
+  Register left = locs->in(0).reg();
+  Register right = locs->in(1).reg();
+  ASSERT(left == A1);
+  ASSERT(right == A0);
+  Register temp = locs->temp(0).reg();
+
+  __ TraceSimMsg("EmitEqualityAsPolymorphicCall");
+
+  LoadValueCid(compiler, temp, left,
+               (ic_data.GetReceiverClassIdAt(0) == kSmiCid) ? NULL : deopt);
+  // 'temp' contains class-id of the left argument.
+  ObjectStore* object_store = Isolate::Current()->object_store();
+  Condition cond = TokenKindToSmiCondition(kind);
+  Label done;
+  const intptr_t len = ic_data.NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
+    // Assert that the Smi is at position 0, if at all.
+    ASSERT((ic_data.GetReceiverClassIdAt(i) != kSmiCid) || (i == 0));
+    Label next_test;
+    if (i < len - 1) {
+      __ BranchNotEqual(temp, ic_data.GetReceiverClassIdAt(i), &next_test);
+    } else {
+      __ BranchNotEqual(temp, ic_data.GetReceiverClassIdAt(i), deopt);
+    }
+    const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(i));
+    if (target.Owner() == object_store->object_class()) {
+      // Object.== is same as ===.
+      __ Drop(2);
+      __ slt(CMPRES, left, right);
+      __ slt(TMP1, right, left);
+      if (branch != NULL) {
+        branch->EmitBranchOnCondition(compiler, cond);
+      } else {
+        Register result = locs->out().reg();
+        Label load_true;
+        EmitBranchAfterCompare(compiler, cond, &load_true);
+        __ LoadObject(result, Bool::False());
+        __ b(&done);
+        __ Bind(&load_true);
+        __ LoadObject(result, Bool::True());
+      }
+    } else {
+      const int kNumberOfArguments = 2;
+      const Array& kNoArgumentNames = Array::Handle();
+      compiler->GenerateStaticCall(deopt_id,
+                                   token_pos,
+                                   target,
+                                   kNumberOfArguments,
+                                   kNoArgumentNames,
+                                   locs);
+      if (branch == NULL) {
+        if (kind == Token::kNE) {
+          Label is_true;
+          __ CompareObject(CMPRES, TMP1, V0, Bool::True());
+          __ beq(CMPRES, TMP1, &is_true);
+          __ LoadObject(V0, Bool::True());
+          __ b(&done);
+          __ Bind(&is_true);
+          __ LoadObject(V0, Bool::False());
+        }
+      } else {
+        if (branch->is_checked()) {
+          EmitAssertBoolean(V0, token_pos, deopt_id, locs, compiler);
+        }
+        __ CompareObject(CMPRES, TMP1, V0, Bool::True());
+        branch->EmitBranchOnCondition(compiler, cond);
+      }
+    }
+    if (i < len - 1) {
+      __ b(&done);
+      __ Bind(&next_test);
+    }
+  }
+  __ Bind(&done);
+}
+
+
 // Emit code when ICData's targets are all Object == (which is ===).
 static void EmitCheckedStrictEqual(FlowGraphCompiler* compiler,
                                    const ICData& ic_data,
@@ -479,45 +629,56 @@
                                        const ICData& ic_data,
                                        intptr_t deopt_id,
                                        intptr_t token_pos) {
-  UNIMPLEMENTED();
-}
+  ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
+  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
+  Register left = locs->in(0).reg();
+  Register right = locs->in(1).reg();
+  Label done, identity_compare, non_null_compare;
+  __ TraceSimMsg("EmitGenericEqualityCompare");
+  __ beq(right, NULLREG, &identity_compare);
+  __ bne(left, NULLREG, &non_null_compare);
 
-
-static Condition TokenKindToSmiCondition(Token::Kind kind) {
-  switch (kind) {
-    case Token::kEQ: return EQ;
-    case Token::kNE: return NE;
-    case Token::kLT: return LT;
-    case Token::kGT: return GT;
-    case Token::kLTE: return LE;
-    case Token::kGTE: return GE;
-    default:
-      UNREACHABLE();
-      return VS;
+  // Comparison with NULL is "===".
+  __ Bind(&identity_compare);
+  Condition cond = TokenKindToSmiCondition(kind);
+  __ slt(CMPRES, left, right);
+  __ slt(TMP1, right, left);
+  if (branch != NULL) {
+    branch->EmitBranchOnCondition(compiler, cond);
+  } else {
+    Register result = locs->out().reg();
+    Label load_true;
+    EmitBranchAfterCompare(compiler, cond, &load_true);
+    __ LoadObject(result, Bool::False());
+    __ b(&done);
+    __ Bind(&load_true);
+    __ LoadObject(result, Bool::True());
   }
-}
-
-
-// Branches on condition c assuming comparison results in CMPRES and TMP1.
-static void EmitBranchAfterCompare(
-    FlowGraphCompiler* compiler, Condition c, Label* is_true) {
-    switch (c) {
-      case EQ: __ beq(CMPRES, TMP1, is_true); break;
-      case NE: __ bne(CMPRES, TMP1, is_true); break;
-      case GT: __ bne(TMP1, ZR, is_true); break;
-      case GE: __ beq(CMPRES, ZR, is_true); break;
-      case LT: __ bne(CMPRES, ZR, is_true); break;
-      case LE: __ beq(TMP1, ZR, is_true); break;
-      default:
-        UNREACHABLE();
-        break;
-    }
+  __ b(&done);
+  __ Bind(&non_null_compare);  // Receiver is not null.
+  ASSERT(left == A1);
+  ASSERT(right == A0);
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ sw(A1, Address(SP, 1 * kWordSize));
+  __ sw(A0, Address(SP, 0 * kWordSize));
+  EmitEqualityAsPolymorphicCall(compiler, ic_data, locs, branch, kind,
+                                deopt_id, token_pos);
+  __ Bind(&done);
 }
 
 
 static Condition FlipCondition(Condition condition) {
-  UNIMPLEMENTED();
-  return condition;
+  switch (condition) {
+    case EQ: return EQ;
+    case NE: return NE;
+    case LT: return GT;
+    case LE: return GE;
+    case GT: return LT;
+    case GE: return LE;
+    default:
+      UNREACHABLE();
+      return EQ;
+  }
 }
 
 
@@ -612,6 +773,9 @@
   Register right = locs()->in(1).reg();
   ASSERT(left == A1);
   ASSERT(right == A0);
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ sw(A1, Address(SP, 1 * kWordSize));
+  __ sw(A0, Address(SP, 0 * kWordSize));
   EmitEqualityAsInstanceCall(compiler,
                              deopt_id(),
                              token_pos(),
@@ -655,6 +819,9 @@
   Register right = locs()->in(1).reg();
   ASSERT(left == A1);
   ASSERT(right == A0);
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ sw(A1, Address(SP, 1 * kWordSize));
+  __ sw(A0, Address(SP, 0 * kWordSize));
   EmitEqualityAsInstanceCall(compiler,
                              deopt_id(),
                              token_pos(),
@@ -853,13 +1020,26 @@
 
 
 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary() const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  // TODO(fschneider): Allow immediate operands for the char code.
+  return LocationSummary::Make(kNumInputs,
+                               Location::RequiresRegister(),
+                               LocationSummary::kNoCall);
 }
 
 
 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register char_code = locs()->in(0).reg();
+  Register result = locs()->out().reg();
+
+  __ TraceSimMsg("StringFromCharCodeInstr");
+
+  __ LoadImmediate(result,
+                   reinterpret_cast<uword>(Symbols::PredefinedAddress()));
+  __ AddImmediate(result, Symbols::kNullCharCodeSymbolOffset * kWordSize);
+  __ sll(TMP1, char_code, 1);  // Char code is a smi.
+  __ addu(TMP1, TMP1, result);
+  __ lw(result, Address(TMP1));
 }
 
 
@@ -986,6 +1166,7 @@
 
 
 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  __ TraceSimMsg("LoadIndexedInstr");
   Register array = locs()->in(0).reg();
   Location index = locs()->in(1);
 
@@ -1745,13 +1926,33 @@
 
 
 LocationSummary* CloneContextInstr::MakeLocationSummary() const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* locs =
+      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(T0));
+  locs->set_out(Location::RegisterLocation(T0));
+  return locs;
 }
 
 
 void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  Register context_value = locs()->in(0).reg();
+  Register result = locs()->out().reg();
+
+  __ TraceSimMsg("CloneContextInstr");
+
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ LoadObject(TMP1, Object::ZoneHandle());  // Make room for the result.
+  __ sw(TMP1, Address(SP, 1 * kWordSize));
+  __ sw(context_value, Address(SP, 0 * kWordSize));
+
+  compiler->GenerateCallRuntime(token_pos(),
+                                deopt_id(),
+                                kCloneContextRuntimeEntry,
+                                locs());
+  __ lw(result, Address(SP, 1 * kWordSize));  // Get result (cloned context).
+  __ addiu(SP, SP, Immediate(2 * kWordSize));
 }
 
 
@@ -1850,6 +2051,118 @@
 }
 
 
+static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
+                             BinarySmiOpInstr* shift_left) {
+  const bool is_truncating = shift_left->is_truncating();
+  const LocationSummary& locs = *shift_left->locs();
+  Register left = locs.in(0).reg();
+  Register result = locs.out().reg();
+  Label* deopt = shift_left->CanDeoptimize() ?
+      compiler->AddDeoptStub(shift_left->deopt_id(), kDeoptBinarySmiOp) : NULL;
+
+  __ TraceSimMsg("EmitSmiShiftLeft");
+
+  if (locs.in(1).IsConstant()) {
+    const Object& constant = locs.in(1).constant();
+    ASSERT(constant.IsSmi());
+    // Immediate shift operation takes 5 bits for the count.
+    const intptr_t kCountLimit = 0x1F;
+    const intptr_t value = Smi::Cast(constant).Value();
+    if (value == 0) {
+      // No code needed.
+    } else if ((value < 0) || (value >= kCountLimit)) {
+      // This condition may not be known earlier in some cases because
+      // of constant propagation, inlining, etc.
+      if ((value >= kCountLimit) && is_truncating) {
+        __ mov(result, ZR);
+      } else {
+        // Result is Mint or exception.
+        __ b(deopt);
+      }
+    } else {
+      if (!is_truncating) {
+        // Check for overflow (preserve left).
+        __ sll(TMP1, left, value);
+        __ sra(TMP1, TMP1, value);
+        __ bne(TMP1, left, deopt);  // Overflow.
+      }
+      // Shift for result now we know there is no overflow.
+      __ sll(result, left, value);
+    }
+    return;
+  }
+
+  // Right (locs.in(1)) is not constant.
+  Register right = locs.in(1).reg();
+  Range* right_range = shift_left->right()->definition()->range();
+  if (shift_left->left()->BindsToConstant() && !is_truncating) {
+    // TODO(srdjan): Implement code below for is_truncating().
+    // If left is constant, we know the maximal allowed size for right.
+    const Object& obj = shift_left->left()->BoundConstant();
+    if (obj.IsSmi()) {
+      const intptr_t left_int = Smi::Cast(obj).Value();
+      if (left_int == 0) {
+        __ bltz(right, deopt);
+        return;
+      }
+      const intptr_t max_right = kSmiBits - Utils::HighestBit(left_int);
+      const bool right_needs_check =
+          (right_range == NULL) ||
+          !right_range->IsWithin(0, max_right - 1);
+      if (right_needs_check) {
+        __ BranchUnsignedGreaterEqual(
+            right, reinterpret_cast<int32_t>(Smi::New(max_right)), deopt);
+      }
+      __ SmiUntag(right);
+      __ sllv(result, left, right);
+    }
+    return;
+  }
+
+  const bool right_needs_check =
+      (right_range == NULL) || !right_range->IsWithin(0, (Smi::kBits - 1));
+  if (is_truncating) {
+    if (right_needs_check) {
+      const bool right_may_be_negative =
+          (right_range == NULL) ||
+          !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+      if (right_may_be_negative) {
+        ASSERT(shift_left->CanDeoptimize());
+        __ bltz(right, deopt);
+      }
+      Label done, is_not_zero;
+
+      __ sltiu(CMPRES,
+          right, Immediate(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
+      __ movz(result, ZR, CMPRES);  // result = right >= kBits ? 0 : result.
+      __ mov(TMP1, right);
+      __ SmiUntag(TMP1);
+      __ sllv(TMP1, left, TMP1);
+      // result = right < kBits ? left << right : result.
+      __ movn(result, TMP1, CMPRES);
+    } else {
+      __ SmiUntag(right);
+      __ sllv(result, left, right);
+    }
+  } else {
+    if (right_needs_check) {
+      ASSERT(shift_left->CanDeoptimize());
+      __ BranchUnsignedGreaterEqual(
+          right, reinterpret_cast<int32_t>(Smi::New(Smi::kBits)), deopt);
+    }
+    // Left is not a constant.
+    // Check if count too large for handling it inlined.
+    __ SmiUntag(right);
+    // Overflow test (preserve left and right);
+    __ sllv(TMP1, left, right);
+    __ srav(TMP1, TMP1, right);
+    __ bne(TMP1, left, deopt);  // Overflow.
+    // Shift for result now we know there is no overflow.
+    __ sllv(result, left, right);
+  }
+}
+
+
 LocationSummary* BinarySmiOpInstr::MakeLocationSummary() const {
   const intptr_t kNumInputs = 2;
   if (op_kind() == Token::kTRUNCDIV) {
@@ -1876,7 +2189,7 @@
 void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ TraceSimMsg("BinarySmiOpInstr");
   if (op_kind() == Token::kSHL) {
-    UNIMPLEMENTED();
+    EmitSmiShiftLeft(compiler, this);
     return;
   }
 
@@ -1894,6 +2207,7 @@
     int32_t imm = reinterpret_cast<int32_t>(constant.raw());
     switch (op_kind()) {
       case Token::kSUB: {
+        __ TraceSimMsg("kSUB imm");
         if (deopt == NULL) {
           __ AddImmediate(result, left, -imm);
         } else {
@@ -1973,7 +2287,27 @@
         break;
       }
       case Token::kSHR: {
-        UNIMPLEMENTED();
+        // sarl operation masks the count to 5 bits.
+        const intptr_t kCountLimit = 0x1F;
+        intptr_t value = Smi::Cast(constant).Value();
+
+        __ TraceSimMsg("kSHR");
+
+        if (value == 0) {
+          // TODO(vegorov): should be handled outside.
+          __ break_(0);
+          break;
+        } else if (value < 0) {
+          // TODO(vegorov): should be handled outside.
+          __ b(deopt);
+          break;
+        }
+
+        value = value + kSmiTagSize;
+        if (value >= kCountLimit) value = kCountLimit;
+
+        __ sra(result, left, value);
+        __ SmiTag(result);
         break;
       }
 
@@ -1997,6 +2331,7 @@
       break;
     }
     case Token::kSUB: {
+      __ TraceSimMsg("kSUB");
       if (deopt == NULL) {
         __ subu(result, left, right);
       } else {
@@ -2006,11 +2341,14 @@
       break;
     }
     case Token::kMUL: {
+      __ TraceSimMsg("kMUL");
       __ SmiUntag(left);
       __ mult(left, right);
       __ mflo(result);
       if (deopt != NULL) {
-        UNIMPLEMENTED();
+        __ mfhi(TMP1);
+        __ sra(CMPRES, result, 31);
+        __ bne(TMP1, CMPRES, deopt);
       }
       break;
     }
@@ -2442,9 +2780,9 @@
 
 
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ TraceSimMsg("PolymorphicInstanceCallInstr");
   Label* deopt = compiler->AddDeoptStub(deopt_id(),
                                         kDeoptPolymorphicInstanceCallTestFail);
+  __ TraceSimMsg("PolymorphicInstanceCallInstr");
   if (ic_data().NumberOfChecks() == 0) {
     __ b(deopt);
     return;
@@ -2826,10 +3164,10 @@
   Register result = locs()->out().reg();
   Label load_true, done;
   if (kind() == Token::kEQ_STRICT) {
-    __ beq(CMPRES, ZR, &load_true);
+    __ beq(CMPRES, TMP1, &load_true);
   } else {
     ASSERT(kind() == Token::kNE_STRICT);
-    __ bne(CMPRES, ZR, &load_true);
+    __ bne(CMPRES, TMP1, &load_true);
   }
   __ LoadObject(result, Bool::False());
   __ b(&done);
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 71463e8..1e2dd8b 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -1530,7 +1530,7 @@
   __ SmiTag(R0);
   __ str(R0, FieldAddress(R1, String::hash_offset()));
   __ Ret();
-  return false;
+  return true;
 }
 
 
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index 82c06b3..9ba29ff 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -1556,10 +1556,10 @@
 
 bool Intrinsifier::OneByteString_getHashCode(Assembler* assembler) {
   Label no_hash;
-  __ Untested("Intrinsifier::OneByteString_getHashCode");
+
   __ lw(T1, Address(SP, 0 * kWordSize));
-  __ lw(T0, FieldAddress(T1, String::hash_offset()));
-  __ beq(T0, ZR, &no_hash);
+  __ lw(V0, FieldAddress(T1, String::hash_offset()));
+  __ beq(V0, ZR, &no_hash);
   __ Ret();  // Return if already computed.
   __ Bind(&no_hash);
 
@@ -1568,12 +1568,12 @@
   Label done;
   // If the string is empty, set the hash to 1, and return.
   __ BranchEqual(T2, Smi::RawValue(0), &done);
-  __ delay_slot()->mov(T0, ZR);
+  __ delay_slot()->mov(V0, ZR);
 
   __ SmiUntag(T2);
   __ AddImmediate(T3, T1, OneByteString::data_offset() - kHeapObjectTag);
   __ addu(T4, T3, T2);
-  // T0: Hash code, untagged integer.
+  // V0: Hash code, untagged integer.
   // T1: Instance of OneByteString.
   // T2: String length, untagged integer.
   // T3: String data start.
@@ -1586,37 +1586,38 @@
   // hash_ ^= hash_ >> 6;
   // Get one characters (ch).
   __ Bind(&loop);
-  __ lw(T5, Address(T3));
+  __ lbu(T5, Address(T3));
   // T5: ch.
   __ addiu(T3, T3, Immediate(1));
-  __ addu(T0, T0, T5);
-  __ sll(TMP, T0, 10);
-  __ addu(T0, T0, TMP);
-  __ srl(TMP, T0, 6);
-  __ BranchUnsignedLess(T3, T4, &loop);
-  __ delay_slot()->xor_(T0, T0, TMP);
+  __ addu(V0, V0, T5);
+  __ sll(TMP, V0, 10);
+  __ addu(V0, V0, TMP);
+  __ srl(TMP, V0, 6);
+  __ bne(T3, T4, &loop);
+  __ delay_slot()->xor_(V0, V0, TMP);
 
   // Finalize.
   // hash_ += hash_ << 3;
   // hash_ ^= hash_ >> 11;
   // hash_ += hash_ << 15;
-  __ sll(TMP, T0, 3);
-  __ addu(T0, T0, TMP);
-  __ srl(TMP, T0, 11);
-  __ xor_(T0, T0, TMP);
-  __ sll(TMP, T0, 15);
-  __ addu(T0, T0, TMP);
+  __ sll(TMP, V0, 3);
+  __ addu(V0, V0, TMP);
+  __ srl(TMP, V0, 11);
+  __ xor_(V0, V0, TMP);
+  __ sll(TMP, V0, 15);
+  __ addu(V0, V0, TMP);
   // hash_ = hash_ & ((static_cast<intptr_t>(1) << bits) - 1);
   __ LoadImmediate(TMP, (static_cast<intptr_t>(1) << String::kHashBits) - 1);
-  __ and_(T0, T0, TMP);
+  __ and_(V0, V0, TMP);
   __ Bind(&done);
 
   __ LoadImmediate(T2, 1);
-  __ movz(T0, T2, T0);  // If T0 is 0, set to 1.
-  __ SmiTag(T0);
+  __ movz(V0, T2, V0);  // If V0 is 0, set to 1.
+  __ SmiTag(V0);
+
   __ Ret();
-  __ delay_slot()->sw(T0, FieldAddress(T1, String::hash_offset()));
-  return false;
+  __ delay_slot()->sw(V0, FieldAddress(T1, String::hash_offset()));
+  return true;
 }
 
 
@@ -1628,7 +1629,6 @@
                                      Label* ok,
                                      Label* failure) {
   const Register length_reg = T2;
-  Label fail;
 
   __ mov(T6, length_reg);  // Save the length register.
   __ SmiUntag(length_reg);
@@ -1645,7 +1645,7 @@
 
   // length_reg: allocation size.
   __ AdduDetectOverflow(T1, V0, length_reg, CMPRES);
-  __ bltz(CMPRES, &fail);  // Fail on overflow.
+  __ bltz(CMPRES, failure);  // Fail on overflow.
 
   // Check if the allocation fits into the remaining space.
   // V0: potential new object start.
@@ -1654,7 +1654,7 @@
   // T3: heap->TopAddress().
   __ LoadImmediate(T4, heap->EndAddress());
   __ lw(T4, Address(T4, 0));
-  __ BranchUnsignedGreaterEqual(T1, T4, &fail);
+  __ BranchUnsignedGreaterEqual(T1, T4, failure);
 
   // Successfully allocated the object(s), now update top to point to
   // next object start and initialize the object.
@@ -1692,9 +1692,6 @@
   // Clear hash.
   __ b(ok);
   __ delay_slot()->sw(ZR, FieldAddress(V0, String::hash_offset()));
-
-  __ Bind(&fail);
-  __ b(failure);
 }
 
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index cf218c8..c29dd4f 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -530,7 +530,7 @@
   cls = Class::New<Array>();
   isolate->object_store()->set_array_class(cls);
   cls.set_type_arguments_field_offset(Array::type_arguments_offset());
-  cls = Class::New<ImmutableArray>();
+  cls = Class::New<Array>(kImmutableArrayCid);
   isolate->object_store()->set_immutable_array_class(cls);
   cls.set_type_arguments_field_offset(Array::type_arguments_offset());
   cls = Class::NewStringClass(kOneByteStringCid);
@@ -832,10 +832,11 @@
   RegisterPrivateClass(cls, Symbols::GrowableObjectArray(), core_lib);
   pending_classes.Add(cls, Heap::kOld);
 
-  cls = Class::New<ImmutableArray>();
+  cls = Class::New<Array>(kImmutableArrayCid);
   object_store->set_immutable_array_class(cls);
   cls.set_type_arguments_field_offset(Array::type_arguments_offset());
   ASSERT(object_store->immutable_array_class() != object_store->array_class());
+  cls.set_is_prefinalized();
   RegisterPrivateClass(cls, Symbols::ImmutableArray(), core_lib);
   pending_classes.Add(cls, Heap::kOld);
 
@@ -1083,11 +1084,6 @@
     return error.raw();
   }
 
-  // Remove the Object superclass cycle by setting the super type to null (not
-  // to the type of null).
-  cls = object_store->object_class();
-  cls.set_super_type(AbstractType::Handle());
-
   ClassFinalizer::VerifyBootstrapClasses();
   MarkInvisibleFunctions();
 
@@ -1125,7 +1121,7 @@
   cls = Class::New<Array>();
   object_store->set_array_class(cls);
 
-  cls = Class::New<ImmutableArray>();
+  cls = Class::New<Array>(kImmutableArrayCid);
   object_store->set_immutable_array_class(cls);
 
   cls = Class::New<GrowableObjectArray>();
@@ -11713,7 +11709,15 @@
   intptr_t char_size = kOneByteChar;
   for (intptr_t i = 0; i < strings_len; i++) {
     str ^= strings.At(i);
-    result_len += str.Length();
+    intptr_t str_len = str.Length();
+    if ((kMaxElements - result_len) < str_len) {
+      Isolate* isolate = Isolate::Current();
+      const Instance& exception =
+          Instance::Handle(isolate->object_store()->out_of_memory());
+      Exceptions::Throw(exception);
+      UNREACHABLE();
+    }
+    result_len += str_len;
     char_size = Utils::Maximum(char_size, str.CharSize());
   }
   if (char_size == kOneByteChar) {
@@ -12187,6 +12191,7 @@
     str ^= strings.At(i);
     intptr_t str_len = str.Length();
     String::Copy(result, pos, str, 0, str_len);
+    ASSERT((kMaxElements - pos) >= str_len);
     pos += str_len;
   }
   return OneByteString::raw(result);
@@ -12350,6 +12355,7 @@
     str ^= strings.At(i);
     intptr_t str_len = str.Length();
     String::Copy(result, pos, str, 0, str_len);
+    ASSERT((kMaxElements - pos) >= str_len);
     pos += str_len;
   }
   return TwoByteString::raw(result);
@@ -12547,9 +12553,10 @@
 
 const char* Array::ToCString() const {
   if (IsNull()) {
-    return "Array NULL";
+    return IsImmutable() ? "ImmutableArray NULL" : "Array NULL";
   }
-  const char* format = "Array len:%"Pd"";
+  const char* format = !IsImmutable() ? "Array len:%"Pd"" :
+      "Immutable Array len:%"Pd"";
   intptr_t len = OS::SNPrint(NULL, 0, format, Length()) + 1;
   char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
   OS::SNPrint(chars, len, format, Length());
@@ -12617,18 +12624,6 @@
 }
 
 
-const char* ImmutableArray::ToCString() const {
-  if (IsNull()) {
-    return "ImmutableArray NULL";
-  }
-  const char* format = "ImmutableArray len:%"Pd"";
-  intptr_t len = OS::SNPrint(NULL, 0, format, Length()) + 1;
-  char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
-  OS::SNPrint(chars, len, format, Length());
-  return chars;
-}
-
-
 void GrowableObjectArray::Add(const Object& value, Heap::Space space) const {
   ASSERT(!IsNull());
   if (Length() == Capacity()) {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 149b390..35786cb 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -4932,6 +4932,10 @@
     StorePointer(ObjectAddr(index), value.raw());
   }
 
+  bool IsImmutable() const {
+    return raw()->GetClassId() == kImmutableArrayCid;
+  }
+
   virtual RawAbstractTypeArguments* GetTypeArguments() const {
     return raw_ptr()->type_arguments_;
   }
@@ -5005,19 +5009,38 @@
     raw_ptr()->length_ = Smi::New(value);
   }
 
-  HEAP_OBJECT_IMPLEMENTATION(Array, Instance);
+  FINAL_HEAP_OBJECT_IMPLEMENTATION(Array, Instance);
   friend class Class;
+  friend class ImmutableArray;
   friend class Object;
   friend class String;
 };
 
 
-class ImmutableArray : public Array {
+class ImmutableArray : public AllStatic {
  public:
   static RawImmutableArray* New(intptr_t len, Heap::Space space = Heap::kNew);
 
+  static RawImmutableArray* ReadFrom(SnapshotReader* reader,
+                                     intptr_t object_id,
+                                     intptr_t tags,
+                                     Snapshot::Kind kind);
+
+  static const ClassId kClassId = kImmutableArrayCid;
+
+  static intptr_t InstanceSize() {
+    return Array::InstanceSize();
+  }
+
+  static intptr_t InstanceSize(intptr_t len) {
+    return Array::InstanceSize(len);
+  }
+
  private:
-  FINAL_HEAP_OBJECT_IMPLEMENTATION(ImmutableArray, Array);
+  static RawImmutableArray* raw(const Array& array) {
+    return reinterpret_cast<RawImmutableArray*>(array.raw());
+  }
+
   friend class Class;
 };
 
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index aff2cb1..eb3ea07 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -3334,10 +3334,12 @@
       super_type = ParseMixins(super_type);
     }
   } else {
-    // No extends clause: implicitly extend Object.
-    super_type = Type::ObjectType();
+    // No extends clause: implicitly extend Object, unless Object itself.
+    if (!cls.IsObjectClass()) {
+      super_type = Type::ObjectType();
+    }
   }
-  ASSERT(!super_type.IsNull());
+  ASSERT(!super_type.IsNull() || cls.IsObjectClass());
   cls.set_super_type(super_type);
 
   if (CurrentToken() == Token::kIMPLEMENTS) {
@@ -8057,23 +8059,30 @@
 }
 
 
-// If the field is already initialized, return no ast (NULL).
-// Otherwise, if the field is constant, initialize the field and return no ast.
-// If the field is not initialized and not const, return the ast for the getter.
+
+// If the field is constant, initialize the field if necessary and return
+// no ast (NULL).
+// Otherwise return NULL if no implicit getter exists (either never created
+// because trivial, or not needed or field not readable).
 AstNode* Parser::RunStaticFieldInitializer(const Field& field) {
   ASSERT(field.is_static());
+  const Class& field_owner = Class::ZoneHandle(field.owner());
+  const String& field_name = String::ZoneHandle(field.name());
+  const String& getter_name = String::Handle(Field::GetterName(field_name));
+  const Function& getter =
+      Function::Handle(field_owner.LookupStaticFunction(getter_name));
   const Instance& value = Instance::Handle(field.value());
   if (value.raw() == Object::transition_sentinel().raw()) {
     if (field.is_const()) {
       ErrorMsg("circular dependency while initializing static field '%s'",
-               String::Handle(field.name()).ToCString());
+               field_name.ToCString());
     } else {
       // The implicit static getter will throw the exception if necessary.
       return new StaticGetterNode(TokenPos(),
                                   NULL,
                                   false,
-                                  Class::ZoneHandle(field.owner()),
-                                  String::ZoneHandle(field.name()));
+                                  field_owner,
+                                  field_name);
     }
   } else if (value.raw() == Object::sentinel().raw()) {
     // This field has not been referenced yet and thus the value has
@@ -8081,13 +8090,9 @@
     // to evaluate the expression and canonicalize the value.
     if (field.is_const()) {
       field.set_value(Object::transition_sentinel());
-      const String& field_name = String::Handle(field.name());
-      const String& getter_name =
-          String::Handle(Field::GetterName(field_name));
-      const Class& cls = Class::Handle(field.owner());
       const int kNumArguments = 0;  // no arguments.
       const Function& func =
-          Function::Handle(Resolver::ResolveStatic(cls,
+          Function::Handle(Resolver::ResolveStatic(field_owner,
                                                    getter_name,
                                                    kNumArguments,
                                                    Object::empty_array(),
@@ -8120,15 +8125,20 @@
         instance ^= instance.Canonicalize();
       }
       field.set_value(instance);
+      return NULL;   // Constant
     } else {
       return new StaticGetterNode(TokenPos(),
                                   NULL,
                                   false,
-                                  Class::ZoneHandle(field.owner()),
-                                  String::ZoneHandle(field.name()));
+                                  field_owner,
+                                  field_name);
     }
   }
-  return NULL;
+  if (getter.IsNull() || (getter.kind() == RawFunction::kConstImplicitGetter)) {
+    return NULL;
+  }
+  ASSERT(getter.kind() == RawFunction::kImplicitGetter);
+  return new StaticGetterNode(TokenPos(), NULL, false, field_owner, field_name);
 }
 
 
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 0d57f54..4a51160 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -211,7 +211,7 @@
   if (class_id < kNumPredefinedCids) {
     switch (class_id) {
 #define RAW_VISITPOINTERS(clazz)                                               \
-      case clazz::kClassId: {                                                  \
+      case k##clazz##Cid: {                                                    \
         Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(this);             \
         size = Raw##clazz::Visit##clazz##Pointers(raw_obj, visitor);           \
         break;                                                                 \
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index fab5eec..1ef30f4 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -13,7 +13,7 @@
 namespace dart {
 
 // Macrobatics to define the Object hierarchy of VM implementation classes.
-#define CLASS_LIST_NO_OBJECT_OR_STRING(V)                                      \
+#define CLASS_LIST_NO_OBJECT_NOR_STRING_NOR_ARRAY(V)                           \
   V(Class)                                                                     \
   V(UnresolvedClass)                                                           \
   V(AbstractTypeArguments)                                                     \
@@ -60,8 +60,6 @@
         V(Bigint)                                                              \
       V(Double)                                                                \
     V(Bool)                                                                    \
-    V(Array)                                                                   \
-      V(ImmutableArray)                                                        \
     V(GrowableObjectArray)                                                     \
     V(TypedData)                                                               \
     V(ExternalTypedData)                                                       \
@@ -72,6 +70,9 @@
     V(Float32x4)                                                               \
     V(Uint32x4)                                                                \
 
+#define CLASS_LIST_ARRAYS(V)                                                   \
+  V(Array)                                                                     \
+    V(ImmutableArray)                                                          \
 
 #define CLASS_LIST_STRINGS(V)                                                  \
   V(String)                                                                    \
@@ -95,11 +96,13 @@
   V(Float32x4Array)                                                            \
 
 #define CLASS_LIST_FOR_HANDLES(V)                                              \
-  CLASS_LIST_NO_OBJECT_OR_STRING(V)                                            \
+  CLASS_LIST_NO_OBJECT_NOR_STRING_NOR_ARRAY(V)                                 \
+  V(Array)                                                                     \
   V(String)
 
 #define CLASS_LIST_NO_OBJECT(V)                                                \
-  CLASS_LIST_NO_OBJECT_OR_STRING(V)                                            \
+  CLASS_LIST_NO_OBJECT_NOR_STRING_NOR_ARRAY(V)                                 \
+  CLASS_LIST_ARRAYS(V)                                                         \
   CLASS_LIST_STRINGS(V)
 
 #define CLASS_LIST(V)                                                          \
@@ -1602,9 +1605,9 @@
 inline bool RawObject::IsBuiltinListClassId(intptr_t index) {
   // Make sure this function is updated when new builtin List types are added.
   ASSERT(kImmutableArrayCid == kArrayCid + 1 &&
-         kGrowableObjectArrayCid == kArrayCid + 2 &&
-         kTypedDataCid == kArrayCid + 3);
-  return ((index >= kArrayCid && index < kTypedDataCid) ||
+         kTypedDataCid == kGrowableObjectArrayCid + 1);
+  return ((index >= kArrayCid && index < kImmutableArrayCid) ||
+          (index >= kGrowableObjectArrayCid && index < kTypedDataCid) ||
           IsTypedDataClassId(index) ||
           IsTypedDataViewClassId(index) ||
           IsExternalTypedDataClassId(index));
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index cd4e0e5..d4f39a7 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -2082,16 +2082,15 @@
 
   // Read the length so that we can determine instance size to allocate.
   intptr_t len = reader->ReadSmiValue();
-  ImmutableArray* array = reinterpret_cast<ImmutableArray*>(
-      reader->GetBackRef(object_id));
+  Array* array = reinterpret_cast<Array*>(reader->GetBackRef(object_id));
   if (array == NULL) {
-    array = &(ImmutableArray::ZoneHandle(
+    array = &(Array::ZoneHandle(
         reader->isolate(),
         NEW_OBJECT_WITH_LEN_SPACE(ImmutableArray, len, kind)));
     reader->AddBackRef(object_id, array, kIsDeserialized);
   }
   reader->ArrayReadFrom(*array, len, tags);
-  return array->raw();
+  return raw(*array);
 }
 
 
diff --git a/runtime/vm/runtime_entry.h b/runtime/vm/runtime_entry.h
index 8c1b8a2..5cdcf9b 100644
--- a/runtime/vm/runtime_entry.h
+++ b/runtime/vm/runtime_entry.h
@@ -23,19 +23,19 @@
 class RuntimeEntry : public ValueObject {
  public:
   RuntimeEntry(const char* name, RuntimeFunction function,
-               int argument_count, bool is_leaf)
-  // TODO(regis): In order to simulate leaf runtime calls taking floating point
-  // arguments, we need to add an 'is_float' flag.
+               int argument_count, bool is_leaf, bool is_float)
       : name_(name),
         function_(function),
         argument_count_(argument_count),
-        is_leaf_(is_leaf) { }
+        is_leaf_(is_leaf),
+        is_float_(is_float) { }
   ~RuntimeEntry() {}
 
   const char* name() const { return name_; }
   RuntimeFunction function() const { return function_; }
   int argument_count() const { return argument_count_; }
   bool is_leaf() const { return is_leaf_; }
+  bool is_float() const { return is_float_; }
   uword GetEntryPoint() const { return reinterpret_cast<uword>(function()); }
 
   // Generate code to call the runtime entry.
@@ -46,6 +46,7 @@
   const RuntimeFunction function_;
   const int argument_count_;
   const bool is_leaf_;
+  const bool is_float_;
 
   DISALLOW_COPY_AND_ASSIGN(RuntimeEntry);
 };
@@ -56,7 +57,7 @@
 #define DEFINE_RUNTIME_ENTRY(name, argument_count)                             \
   extern void DRT_##name(NativeArguments arguments);                           \
   extern const RuntimeEntry k##name##RuntimeEntry(                             \
-      "DRT_"#name, &DRT_##name, argument_count, false);                        \
+      "DRT_"#name, &DRT_##name, argument_count, false, false);                 \
   static void DRT_Helper##name(Isolate* isolate, NativeArguments arguments);   \
   void DRT_##name(NativeArguments arguments) {                                 \
     CHECK_STACK_ALIGNMENT;                                                     \
@@ -74,10 +75,11 @@
 #define DECLARE_RUNTIME_ENTRY(name)                                            \
   extern const RuntimeEntry k##name##RuntimeEntry
 
-#define DEFINE_LEAF_RUNTIME_ENTRY(type, name, ...)                             \
+#define DEFINE_LEAF_RUNTIME_ENTRY(type, name, argument_count, ...)             \
   extern "C" type DLRT_##name(__VA_ARGS__);                                    \
   extern const RuntimeEntry k##name##RuntimeEntry(                             \
-      "DLRT_"#name, reinterpret_cast<RuntimeFunction>(&DLRT_##name), 0, true); \
+      "DLRT_"#name, reinterpret_cast<RuntimeFunction>(&DLRT_##name),           \
+      argument_count, true, false);                                            \
   type DLRT_##name(__VA_ARGS__) {                                              \
     CHECK_STACK_ALIGNMENT;                                                     \
     NoGCScope no_gc_scope;                                                     \
diff --git a/runtime/vm/runtime_entry_arm.cc b/runtime/vm/runtime_entry_arm.cc
index af005b6..347e952 100644
--- a/runtime/vm/runtime_entry_arm.cc
+++ b/runtime/vm/runtime_entry_arm.cc
@@ -28,11 +28,17 @@
   uword entry = GetEntryPoint();
 #if defined(USING_SIMULATOR)
   // Redirection to leaf runtime calls supports a maximum of 4 arguments passed
-  // in registers.
-  ASSERT(!is_leaf() || (argument_count() <= 4));
+  // in registers (maximum 2 double arguments for leaf float runtime calls).
+  ASSERT(argument_count() >= 0);
+  ASSERT(!is_leaf() ||
+         (!is_float() && (argument_count() <= 4)) ||
+         (argument_count() <= 2));
   Simulator::CallKind call_kind =
-      is_leaf() ? Simulator::kLeafRuntimeCall : Simulator::kRuntimeCall;
-  entry = Simulator::RedirectExternalReference(entry, call_kind);
+      is_leaf() ? (is_float() ? Simulator::kLeafFloatRuntimeCall
+                              : Simulator::kLeafRuntimeCall)
+                : Simulator::kRuntimeCall;
+  entry =
+      Simulator::RedirectExternalReference(entry, call_kind, argument_count());
 #endif
   if (is_leaf()) {
     ExternalLabel label(name(), entry);
diff --git a/runtime/vm/runtime_entry_test.cc b/runtime/vm/runtime_entry_test.cc
index a368af6..cfd24c9 100644
--- a/runtime/vm/runtime_entry_test.cc
+++ b/runtime/vm/runtime_entry_test.cc
@@ -49,7 +49,7 @@
 // arg0: a smi.
 // arg1: a smi.
 // returns a smi representing arg0 + arg1.
-DEFINE_LEAF_RUNTIME_ENTRY(RawObject*, TestLeafSmiAdd,
+DEFINE_LEAF_RUNTIME_ENTRY(RawObject*, TestLeafSmiAdd, 2,
                           RawObject* arg0, RawObject* arg1) {
   // Ignoring overflow in the calculation below and using the internal
   // representation of Smi directly without using any handlized code.
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index cea3b8d..acfed60 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -801,13 +801,16 @@
 
   Simulator::CallKind call_kind() const { return call_kind_; }
 
+  int argument_count() const { return argument_count_; }
+
   static Redirection* Get(uword external_function,
-                          Simulator::CallKind call_kind) {
+                          Simulator::CallKind call_kind,
+                          int argument_count) {
     Redirection* current;
     for (current = list_; current != NULL; current = current->next_) {
       if (current->external_function_ == external_function) return current;
     }
-    return new Redirection(external_function, call_kind);
+    return new Redirection(external_function, call_kind, argument_count);
   }
 
   static Redirection* FromSvcInstruction(Instr* svc_instruction) {
@@ -820,9 +823,12 @@
  private:
   static const int32_t kRedirectSvcInstruction =
     ((AL << kConditionShift) | (0xf << 24) | kRedirectionSvcCode);
-  Redirection(uword external_function, Simulator::CallKind call_kind)
+  Redirection(uword external_function,
+              Simulator::CallKind call_kind,
+              int argument_count)
       : external_function_(external_function),
         call_kind_(call_kind),
+        argument_count_(argument_count),
         svc_instruction_(kRedirectSvcInstruction),
         next_(list_) {
     list_ = this;
@@ -830,6 +836,7 @@
 
   uword external_function_;
   Simulator::CallKind call_kind_;
+  int argument_count_;
   uint32_t svc_instruction_;
   Redirection* next_;
   static Redirection* list_;
@@ -839,8 +846,11 @@
 Redirection* Redirection::list_ = NULL;
 
 
-uword Simulator::RedirectExternalReference(uword function, CallKind call_kind) {
-  Redirection* redirection = Redirection::Get(function, call_kind);
+uword Simulator::RedirectExternalReference(uword function,
+                                           CallKind call_kind,
+                                           int argument_count) {
+  Redirection* redirection =
+      Redirection::Get(function, call_kind, argument_count);
   return redirection->address_of_svc_instruction();
 }
 
@@ -1430,6 +1440,9 @@
 typedef int32_t (*SimulatorLeafRuntimeCall)(
     int32_t r0, int32_t r1, int32_t r2, int32_t r3);
 
+// Calls to leaf float Dart runtime functions are based on this interface.
+typedef double (*SimulatorLeafFloatRuntimeCall)(double d0, double d1);
+
 // Calls to native Dart functions are based on this interface.
 typedef void (*SimulatorNativeCall)(NativeArguments* arguments);
 
@@ -1448,7 +1461,8 @@
           OS::Print("Call to host function at 0x%"Pd"\n", external);
         }
 
-        if (redirection->call_kind() != kLeafRuntimeCall) {
+        if ((redirection->call_kind() == kRuntimeCall) ||
+            (redirection->call_kind() == kNativeCall)) {
           // The top_exit_frame_info of the current isolate points to the top of
           // the simulator stack.
           ASSERT((StackTop() - Isolate::Current()->top_exit_frame_info()) <
@@ -1468,6 +1482,8 @@
           target(arguments);
           set_register(R0, icount_);  // Zap result register from void function.
         } else if (redirection->call_kind() == kLeafRuntimeCall) {
+          ASSERT((0 <= redirection->argument_count()) &&
+                 (redirection->argument_count() <= 4));
           int32_t r0 = get_register(R0);
           int32_t r1 = get_register(R1);
           int32_t r2 = get_register(R2);
@@ -1476,6 +1492,19 @@
               reinterpret_cast<SimulatorLeafRuntimeCall>(external);
           r0 = target(r0, r1, r2, r3);
           set_register(R0, r0);  // Set returned result from function.
+        } else if (redirection->call_kind() == kLeafFloatRuntimeCall) {
+          ASSERT((0 <= redirection->argument_count()) &&
+                 (redirection->argument_count() <= 2));
+          // We currently use 'hardfp' ('gnueabihf') rather than 'softfp'
+          // ('gnueabi') float ABI for leaf runtime calls, i.e. double values
+          // are passed and returned in vfp registers rather than in integer
+          // register pairs.
+          SimulatorLeafFloatRuntimeCall target =
+              reinterpret_cast<SimulatorLeafFloatRuntimeCall>(external);
+          double d0 = get_dregister(D0);
+          double d1 = get_dregister(D1);
+          d0 = target(d0, d1);
+          set_dregister(D0, d0);
         } else {
           ASSERT(redirection->call_kind() == kNativeCall);
           NativeArguments* arguments;
@@ -1495,10 +1524,11 @@
         set_register(IP, icount_);
         set_register(LR, icount_);
         double zap_dvalue = static_cast<double>(icount_);
-        for (int i = D0; i <= D7; i++) {
+        // Do not zap D0, as it may contain a float result.
+        for (int i = D1; i <= D7; i++) {
           set_dregister(static_cast<DRegister>(i), zap_dvalue);
         }
-        // The above loop also zaps overlapping registers S0-S15.
+        // The above loop also zaps overlapping registers S2-S15.
         // Registers D8-D15 (overlapping with S16-S31) are preserved.
 #ifdef VFPv3_D32
         for (int i = D16; i <= D31; i++) {
diff --git a/runtime/vm/simulator_arm.h b/runtime/vm/simulator_arm.h
index 0fc5223..d6e8409 100644
--- a/runtime/vm/simulator_arm.h
+++ b/runtime/vm/simulator_arm.h
@@ -82,12 +82,12 @@
   enum CallKind {
     kRuntimeCall,
     kLeafRuntimeCall,
+    kLeafFloatRuntimeCall,
     kNativeCall
   };
-  // TODO(regis): In order to simulate leaf runtime calls taking floating point
-  // arguments, we need to add a 'kLeafFloatRuntimeCall' CallKind and pass the
-  // number of arguments.
-  static uword RedirectExternalReference(uword function, CallKind call_kind);
+  static uword RedirectExternalReference(uword function,
+                                         CallKind call_kind,
+                                         int argument_count);
 
   void Longjmp(uword pc,
                uword sp,
diff --git a/runtime/vm/simulator_mips.cc b/runtime/vm/simulator_mips.cc
index 1d930b2..3687bc9 100644
--- a/runtime/vm/simulator_mips.cc
+++ b/runtime/vm/simulator_mips.cc
@@ -1711,7 +1711,7 @@
       if (Simulator::IsIllegalAddress(addr)) {
         HandleIllegalAccess(addr, instr);
       } else {
-        int32_t res = ReadBU(addr);
+        uint32_t res = ReadBU(addr);
         set_register(instr->RtField(), res);
       }
       break;
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index c94965d..ff22e03 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -33,6 +33,8 @@
   // Check if this is a class which is stored in the object store.
   return (class_id == kObjectCid ||
           (class_id >= kInstanceCid && class_id <= kWeakPropertyCid) ||
+          class_id == kArrayCid ||
+          class_id == kImmutableArrayCid ||
           RawObject::IsStringClassId(class_id) ||
           RawObject::IsTypedDataClassId(class_id) ||
           RawObject::IsExternalTypedDataClassId(class_id));
@@ -296,7 +298,7 @@
   if (class_id == kImmutableArrayCid) {
     // Read the length and allocate an object based on the len.
     intptr_t len = ReadSmiValue();
-    ImmutableArray& array = ImmutableArray::ZoneHandle(
+    Array& array = Array::ZoneHandle(
         isolate(),
         (kind_ == Snapshot::kFull) ?
         NewImmutableArray(len) : ImmutableArray::New(len, HEAP_SPACE(kind_)));
diff --git a/runtime/vm/store_buffer.cc b/runtime/vm/store_buffer.cc
index b5f39ec..acf7ca6 100644
--- a/runtime/vm/store_buffer.cc
+++ b/runtime/vm/store_buffer.cc
@@ -9,7 +9,7 @@
 
 namespace dart {
 
-DEFINE_LEAF_RUNTIME_ENTRY(void, StoreBufferBlockProcess, Isolate* isolate) {
+DEFINE_LEAF_RUNTIME_ENTRY(void, StoreBufferBlockProcess, 1, Isolate* isolate) {
   StoreBuffer* buffer = isolate->store_buffer();
   buffer->Expand(true);
 }
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 1491ec3..62314eb 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -101,7 +101,7 @@
 
 
 // Print the stop message.
-DEFINE_LEAF_RUNTIME_ENTRY(void, PrintStopMessage, const char* message) {
+DEFINE_LEAF_RUNTIME_ENTRY(void, PrintStopMessage, 1, const char* message) {
   OS::Print("Stop message: %s\n", message);
 }
 END_LEAF_RUNTIME_ENTRY
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 1acfc81..0cf7c9b 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -94,7 +94,7 @@
 
 
 // Print the stop message.
-DEFINE_LEAF_RUNTIME_ENTRY(void, PrintStopMessage, const char* message) {
+DEFINE_LEAF_RUNTIME_ENTRY(void, PrintStopMessage, 1, const char* message) {
   OS::Print("Stop message: %s\n", message);
 }
 END_LEAF_RUNTIME_ENTRY
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 74f1cd4..e5cf95c 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -40,13 +40,14 @@
   const intptr_t argv_offset = NativeArguments::argv_offset();
   const intptr_t retval_offset = NativeArguments::retval_offset();
 
+  __ SetPrologueOffset();
   __ TraceSimMsg("CallToRuntimeStub");
   __ 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 R0.
+  // 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
@@ -112,7 +113,7 @@
 
 
 // Print the stop message.
-DEFINE_LEAF_RUNTIME_ENTRY(void, PrintStopMessage, const char* message) {
+DEFINE_LEAF_RUNTIME_ENTRY(void, PrintStopMessage, 1, const char* message) {
   OS::Print("Stop message: %s\n", message);
 }
 END_LEAF_RUNTIME_ENTRY
@@ -142,6 +143,7 @@
   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));
@@ -170,10 +172,10 @@
   // 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: T1 already contains argc.
+  // Set argc in NativeArguments: A1 already contains argc.
 
   ASSERT(argv_offset == 2 * kWordSize);
-  // Set argv in NativeArguments: T2 already contains argv.
+  // Set argv in NativeArguments: A2 already contains argv.
 
   ASSERT(retval_offset == 3 * kWordSize);
   __ addiu(A3, FP, Immediate(2 * kWordSize));  // Set retval in NativeArgs.
@@ -352,8 +354,6 @@
 DECLARE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, uword last_fp);
 
 
-
-
 // Used by eager and lazy deoptimization. Preserve result in V0 if necessary.
 // This stub translates optimized frame into unoptimized frame. The optimized
 // frame can contain values in registers and on stack, the unoptimized
@@ -380,12 +380,13 @@
 // Parts of the code cannot GC, part of the code can GC.
 static void GenerateDeoptimizationSequence(Assembler* assembler,
                                            bool preserve_result) {
-  __ TraceSimMsg("GenerateDeoptimizationSequence");
   const intptr_t kPushedRegistersSize =
       kNumberOfCpuRegisters * kWordSize +
       4 * kWordSize +  // PP, FP, RA, PC marker.
       kNumberOfFRegisters * kWordSize;
 
+  __ SetPrologueOffset();
+  __ TraceSimMsg("GenerateDeoptimizationSequence");
   // DeoptimizeCopyFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
   // is no need to set the correct PC marker or load PP, since they get patched.
   __ addiu(SP, SP, Immediate(-kPushedRegistersSize * kWordSize));
@@ -419,7 +420,7 @@
   }
 
   __ mov(A0, SP);  // Pass address of saved registers block.
-  __ ReserveAlignedFrameSpace(0);
+  __ ReserveAlignedFrameSpace(1 * kWordSize);
   __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry);
   // Result (V0) is stack-size (FP - SP) in bytes, incl. the return address.
 
@@ -447,7 +448,7 @@
   if (preserve_result) {
     __ Push(T1);  // Preserve result as first local.
   }
-  __ ReserveAlignedFrameSpace(0);
+  __ ReserveAlignedFrameSpace(1 * kWordSize);
   __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry);  // Pass last FP in A0.
   if (preserve_result) {
     // Restore result into T1.
@@ -1065,7 +1066,7 @@
   // Setup frame, push callee-saved registers.
 
   __ EnterCallRuntimeFrame(0 * kWordSize);
-  __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
+  __ lw(A0, FieldAddress(CTX, Context::isolate_offset()));
   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry);
   __ TraceSimMsg("UpdateStoreBufferStub return");
   // Restore callee-saved registers, tear down frame.
@@ -1644,8 +1645,6 @@
   __ lw(T3, FieldAddress(T3, Code::instructions_offset()));
   __ AddImmediate(T3, Instructions::HeaderSize() - kHeapObjectTag);
   __ jr(T3);
-  __ delay_slot()->addiu(T3, T3,
-      Immediate(Instructions::HeaderSize() - kHeapObjectTag));
 
   // Instance in T3, return its class-id in T3 as Smi.
   __ Bind(&get_class_id_as_smi);
@@ -1947,6 +1946,7 @@
 // V0: result.
 // TODO(srdjan): Move to VM stubs once Boolean objects become VM objects.
 void StubCode::GenerateEqualityWithNullArgStub(Assembler* assembler) {
+  __ TraceSimMsg("EqualityWithNullArgStub");
   __ EnterStubFrame();
   static const intptr_t kNumArgsTested = 2;
 #if defined(DEBUG)
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 21ed7c9..0b49f59 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -95,7 +95,7 @@
 
 
 // Print the stop message.
-DEFINE_LEAF_RUNTIME_ENTRY(void, PrintStopMessage, const char* message) {
+DEFINE_LEAF_RUNTIME_ENTRY(void, PrintStopMessage, 1, const char* message) {
   OS::Print("Stop message: %s\n", message);
 }
 END_LEAF_RUNTIME_ENTRY
diff --git a/sdk/lib/_internal/compiler/implementation/apiimpl.dart b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
index c5cc391..abb492c 100644
--- a/sdk/lib/_internal/compiler/implementation/apiimpl.dart
+++ b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
@@ -44,7 +44,7 @@
                 !hasOption(options, '--disable-native-live-type-analysis'),
             emitJavaScript: !hasOption(options, '--output-type=dart'),
             disallowUnsafeEval: hasOption(options, '--disallow-unsafe-eval'),
-            analyzeAll: hasOption(options, '--analyze-all'),
+            analyzeAllFlag: hasOption(options, '--analyze-all'),
             analyzeOnly: hasOption(options, '--analyze-only'),
             analyzeSignaturesOnly:
                 hasOption(options, '--analyze-signatures-only'),
@@ -56,7 +56,7 @@
             strips: extractCsvOption(options, '--force-strip='),
             enableConcreteTypeInference:
                 hasOption(options, '--enable-concrete-type-inference'),
-            disableTypeInference:
+            disableTypeInferenceFlag:
                 hasOption(options, '--disable-type-inference'),
             preserveComments: hasOption(options, '--preserve-comments'),
             verbose: hasOption(options, '--verbose'),
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 671b02a..04191ab 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -30,21 +30,18 @@
    * Invariant: [element] must be a declaration element.
    */
   final Element element;
-  TreeElements get resolutionTree;
+  TreeElements resolutionTree;
 
   WorkItem(this.element, this.compilationContext) {
     assert(invariant(element, element.isDeclaration));
   }
 
-  bool isAnalyzed() => resolutionTree != null;
 
   void run(Compiler compiler, Enqueuer world);
 }
 
 /// [WorkItem] used exclusively by the [ResolutionEnqueuer].
 class ResolutionWorkItem extends WorkItem {
-  TreeElements resolutionTree;
-
   ResolutionWorkItem(Element element,
                      ItemCompilationContext compilationContext)
       : super(element, compilationContext);
@@ -52,25 +49,25 @@
   void run(Compiler compiler, ResolutionEnqueuer world) {
     resolutionTree = compiler.analyze(this, world);
   }
+
+  bool isAnalyzed() => resolutionTree != null;
 }
 
 /// [WorkItem] used exclusively by the [CodegenEnqueuer].
 class CodegenWorkItem extends WorkItem {
-  final TreeElements resolutionTree;
-
   bool allowSpeculativeOptimization = true;
   List<HTypeGuard> guards = const <HTypeGuard>[];
 
   CodegenWorkItem(Element element,
-                  TreeElements this.resolutionTree,
                   ItemCompilationContext compilationContext)
-      : super(element, compilationContext) {
-    assert(invariant(element, resolutionTree != null,
-        message: 'Resolution tree is null for $element in codegen work item'));
-  }
+      : super(element, compilationContext);
 
   void run(Compiler compiler, CodegenEnqueuer world) {
     if (world.isProcessed(element)) return;
+    resolutionTree =
+        compiler.enqueuer.resolution.getCachedElements(element);
+    assert(invariant(element, resolutionTree != null,
+        message: 'Resolution tree is null for $element in codegen work item'));
     compiler.codegen(this, world);
   }
 }
@@ -254,14 +251,14 @@
   final bool enableUserAssertions;
   final bool trustTypeAnnotations;
   final bool enableConcreteTypeInference;
-  final bool disableTypeInference;
+  final bool disableTypeInferenceFlag;
 
   /**
    * The maximum size of a concrete type before it widens to dynamic during
    * concrete type inference.
    */
   final int maxConcreteTypeSize;
-  final bool analyzeAll;
+  final bool analyzeAllFlag;
   final bool analyzeOnly;
   /**
    * If true, skip analysis of method bodies and field initializers. Implies
@@ -457,14 +454,14 @@
             this.enableUserAssertions: false,
             this.trustTypeAnnotations: false,
             this.enableConcreteTypeInference: false,
-            this.disableTypeInference: false,
+            this.disableTypeInferenceFlag: false,
             this.maxConcreteTypeSize: 5,
             this.enableMinification: false,
             this.enableNativeLiveTypeAnalysis: false,
             bool emitJavaScript: true,
             bool generateSourceMap: true,
             bool disallowUnsafeEval: false,
-            this.analyzeAll: false,
+            this.analyzeAllFlag: false,
             bool analyzeOnly: false,
             bool analyzeSignaturesOnly: false,
             this.rejectDeprecatedFeatures: false,
@@ -525,6 +522,12 @@
 
   bool get mirrorsEnabled => mirrorSystemClass != null;
 
+  bool get analyzeAll => analyzeAllFlag || compileAll;
+
+  bool get compileAll => mirrorsEnabled;
+
+  bool get disableTypeInference => disableTypeInferenceFlag || mirrorsEnabled;
+
   int getNextFreeClassId() => nextFreeClassId++;
 
   void ensure(bool condition) {
@@ -836,7 +839,8 @@
     log('Resolving...');
     phase = PHASE_RESOLVING;
     if (analyzeAll) {
-      libraries.forEach((_, lib) => fullyEnqueueLibrary(lib));
+      libraries.forEach(
+          (_, lib) => fullyEnqueueLibrary(lib, enqueuer.resolution));
     }
     // Elements required by enqueueHelpers are global dependencies
     // that are not pulled in by a particular element.
@@ -874,6 +878,9 @@
       enqueuer.codegen.registerInvocation(NO_SUCH_METHOD, noSuchMethodSelector);
       enqueuer.codegen.addToWorkList(createInvocationMirrorElement);
     }
+    if (compileAll) {
+      libraries.forEach((_, lib) => fullyEnqueueLibrary(lib, enqueuer.codegen));
+    }
     processQueue(enqueuer.codegen, main);
     enqueuer.codegen.logSummary(log);
 
@@ -895,19 +902,21 @@
     }
   }
 
-  void fullyEnqueueLibrary(LibraryElement library) {
-    library.implementation.forEachLocalMember(fullyEnqueueTopLevelElement);
+  void fullyEnqueueLibrary(LibraryElement library, Enqueuer world) {
+    void enqueueAll(Element element) {
+      fullyEnqueueTopLevelElement(element, world);
+    }
+    library.implementation.forEachLocalMember(enqueueAll);
   }
 
-  void fullyEnqueueTopLevelElement(Element element) {
+  void fullyEnqueueTopLevelElement(Element element, Enqueuer world) {
     if (element.isClass()) {
       ClassElement cls = element;
       cls.ensureResolved(this);
-      cls.forEachLocalMember(enqueuer.resolution.addToWorkList);
-      enqueuer.resolution.registerInstantiatedClass(
-          element, globalDependencies);
+      cls.forEachLocalMember(world.addToWorkList);
+      world.registerInstantiatedClass(element, globalDependencies);
     } else {
-      enqueuer.resolution.addToWorkList(element);
+      world.addToWorkList(element);
     }
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index 116036a..a1a2ed2 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -22,12 +22,11 @@
       Link<Element> members = const Link<Element>();
       if (element.isLibrary()) {
         LibraryElementX library = element;
-        Uri uri = library.canonicalUri;
         // Don't include private implementation libraries.  These
         // libraries contain special classes that cause problems
         // in other parts of the resolver (in particular Null and Void).
         // TODO(ahe): Consider lifting this restriction.
-        if (uri.scheme != 'dart' || !uri.path.startsWith('_')) {
+        if (!library.isInternalLibrary) {
           members = library.localMembers;
           // TODO(ahe): Is this right?  Is this necessary?
           name = library.getLibraryOrScriptName();
@@ -111,42 +110,22 @@
    *
    * Invariant: [element] must be a declaration element.
    */
-  void addToWorkList(Element element, [TreeElements elements]) {
+  void addToWorkList(Element element) {
     assert(invariant(element, element.isDeclaration));
     if (element.isForeign(compiler)) return;
 
     if (element.isForwardingConstructor) {
-      addToWorkList(element.targetConstructor, elements);
+      addToWorkList(element.targetConstructor);
       return;
     }
 
-    if (!addElementToWorkList(element, elements)) return;
-
-    // Enable runtime type support if we discover a getter called runtimeType.
-    // We have to enable runtime type before hitting the codegen, so
-    // that constructors know whether they need to generate code for
-    // runtime type.
-    if (element.isGetter() && element.name == Compiler.RUNTIME_TYPE) {
-      compiler.enabledRuntimeType = true;
-      // TODO(ahe): Record precise dependency here.
-      compiler.backend.registerRuntimeType(compiler.globalDependencies);
-    } else if (element == compiler.functionApplyMethod) {
-      compiler.enabledFunctionApply = true;
-    } else if (element == compiler.invokeOnMethod) {
-      compiler.enabledInvokeOn = true;
-    }
-
-    nativeEnqueuer.registerElement(element);
+    internalAddToWorkList(element);
   }
 
   /**
    * Adds [element] to the work list if it has not already been processed.
-   *
-   * Returns [:true:] if the [element] should be processed.
    */
-  // TODO(johnniwinther): Change to 'Returns true if the element was added to
-  // the work list'?
-  bool addElementToWorkList(Element element, [TreeElements elements]);
+  void internalAddToWorkList(Element element);
 
   void registerInstantiatedType(InterfaceType type, TreeElements elements) {
     ClassElement cls = type.element;
@@ -612,6 +591,9 @@
     if (element.enclosingElement.isClosure()) {
       closureMapping.ClosureClassElement cls = element.enclosingElement;
       element = cls.methodElement;
+    } else if (element.isGenerativeConstructorBody()) {
+      ConstructorBodyElement body = element;
+      element = body.constructor;
     }
     Element owner = element.getOutermostEnclosingMemberOrTopLevel();
     if (owner == null) {
@@ -620,35 +602,15 @@
     return resolvedElements[owner.declaration];
   }
 
-  /**
-   * Sets the resolved elements of [element] to [elements], or if [elements] is
-   * [:null:], to the elements found through [getCachedElements].
-   *
-   * Returns the resolved elements.
-   */
-  TreeElements ensureCachedElements(Element element, TreeElements elements) {
-    if (elements == null) {
-      elements = getCachedElements(element);
-    }
-    resolvedElements[element] = elements;
-    return elements;
-  }
-
-  bool addElementToWorkList(Element element, [TreeElements elements]) {
+  void internalAddToWorkList(Element element) {
+    if (getCachedElements(element) != null) return;
     if (queueIsClosed) {
-      if (getCachedElements(element) != null) return false;
       throw new SpannableAssertionFailure(element,
                                           "Resolution work list is closed.");
     }
-    if (elements == null) {
-      elements = getCachedElements(element);
-    }
     compiler.world.registerUsedElement(element);
 
-    if (elements == null) {
-      queue.add(
-          new ResolutionWorkItem(element, itemCompilationContextCreator()));
-    }
+    queue.add(new ResolutionWorkItem(element, itemCompilationContextCreator()));
 
     // Enable isolate support if we start using something from the
     // isolate library, or timers for the async library.
@@ -667,7 +629,21 @@
       }
     }
 
-    return true;
+    if (element.isGetter() && element.name == Compiler.RUNTIME_TYPE) {
+      // Enable runtime type support if we discover a getter called runtimeType.
+      // We have to enable runtime type before hitting the codegen, so
+      // that constructors know whether they need to generate code for
+      // runtime type.
+      compiler.enabledRuntimeType = true;
+      // TODO(ahe): Record precise dependency here.
+      compiler.backend.registerRuntimeType(compiler.globalDependencies);
+    } else if (element == compiler.functionApplyMethod) {
+      compiler.enabledFunctionApply = true;
+    } else if (element == compiler.invokeOnMethod) {
+      compiler.enabledInvokeOn = true;
+    }
+
+    nativeEnqueuer.registerElement(element);
   }
 
   void enableIsolateSupport(LibraryElement element) {
@@ -746,23 +722,18 @@
   bool isProcessed(Element member) =>
       member.isAbstract(compiler) || generatedCode.containsKey(member);
 
-  bool addElementToWorkList(Element element, [TreeElements elements]) {
+  void internalAddToWorkList(Element element) {
     // Codegen inlines field initializers, so it does not need to add
     // individual fields in the work list.
-    if (element.isField() && element.isInstanceMember()) return true;
+    if (element.isField() && element.isInstanceMember()) return;
 
     if (queueIsClosed) {
       throw new SpannableAssertionFailure(element,
                                           "Codegen work list is closed.");
     }
-    elements =
-        compiler.enqueuer.resolution.ensureCachedElements(element, elements);
-
     CodegenWorkItem workItem = new CodegenWorkItem(
-        element, elements, itemCompilationContextCreator());
+        element, itemCompilationContextCreator());
     queue.add(workItem);
-
-    return true;
   }
 
   void forEach(f(WorkItem work)) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index fde02b4..1dfe675 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -4,607 +4,6 @@
 
 part of js_backend;
 
-typedef void Recompile(Element element);
-
-class ReturnInfo {
-  HType returnType;
-  List<Element> compiledFunctions;
-
-  ReturnInfo(HType this.returnType)
-      : compiledFunctions = new List<Element>();
-
-  ReturnInfo.unknownType() : this(null);
-
-  void update(HType type, Recompile recompile, Compiler compiler) {
-    HType newType =
-        returnType != null ? returnType.union(type, compiler) : type;
-    if (newType != returnType) {
-      if (returnType == null && identical(newType, HType.UNKNOWN)) {
-        // If the first actual piece of information is not providing any type
-        // information there is no need to recompile callers.
-        compiledFunctions.clear();
-      }
-      returnType = newType;
-      if (recompile != null) {
-        compiledFunctions.forEach(recompile);
-      }
-      compiledFunctions.clear();
-    }
-  }
-
-  // Note that lazy initializers are treated like functions (but are not
-  // of type [FunctionElement].
-  addCompiledFunction(Element function) => compiledFunctions.add(function);
-}
-
-class OptionalParameterTypes {
-  final List<SourceString> names;
-  final List<HType> types;
-
-  OptionalParameterTypes(int optionalArgumentsCount)
-      : names = new List<SourceString>(optionalArgumentsCount),
-        types = new List<HType>(optionalArgumentsCount);
-
-  int get length => names.length;
-  SourceString name(int index) => names[index];
-  HType type(int index) => types[index];
-  int indexOf(SourceString name) => names.indexOf(name);
-
-  HType typeFor(SourceString name) {
-    int index = indexOf(name);
-    if (index == -1) return null;
-    return type(index);
-  }
-
-  void update(int index, SourceString name, HType type) {
-    names[index] = name;
-    types[index] = type;
-  }
-
-  String toString() => "OptionalParameterTypes($names, $types)";
-}
-
-class HTypeList {
-  final List<HType> types;
-  final List<SourceString> namedArguments;
-
-  HTypeList(int length)
-      : types = new List<HType>(length),
-        namedArguments = null;
-  HTypeList.withNamedArguments(int length, this.namedArguments)
-      : types = new List<HType>(length);
-  const HTypeList.withAllUnknown()
-      : types = null,
-        namedArguments = null;
-
-  factory HTypeList.fromStaticInvocation(HInvokeStatic node) {
-    bool allUnknown = true;
-    for (int i = 0; i < node.inputs.length; i++) {
-      if (node.inputs[i].instructionType != HType.UNKNOWN) {
-        allUnknown = false;
-        break;
-      }
-    }
-    if (allUnknown) return HTypeList.ALL_UNKNOWN;
-
-    HTypeList result = new HTypeList(node.inputs.length);
-    for (int i = 0; i < result.types.length; i++) {
-      result.types[i] = node.inputs[i].instructionType;
-    }
-    return result;
-  }
-
-  factory HTypeList.fromDynamicInvocation(HInvoke node,
-                                          Selector selector) {
-    HTypeList result;
-    int argumentsCount = node.inputs.length - 1;
-    int startInvokeIndex = HInvoke.ARGUMENTS_OFFSET;
-
-    if (node.isInterceptedCall) {
-      argumentsCount--;
-      startInvokeIndex++;
-    }
-
-    if (selector.namedArgumentCount > 0) {
-      result =
-          new HTypeList.withNamedArguments(
-              argumentsCount, selector.namedArguments);
-    } else {
-      result = new HTypeList(argumentsCount);
-    }
-
-    for (int i = 0; i < result.types.length; i++) {
-      result.types[i] = node.inputs[i + startInvokeIndex].instructionType;
-    }
-    return result;
-  }
-
-  static const HTypeList ALL_UNKNOWN = const HTypeList.withAllUnknown();
-
-  bool get allUnknown => types == null;
-  bool get hasNamedArguments => namedArguments != null;
-  int get length => types.length;
-  HType operator[](int index) => types[index];
-  void operator[]=(int index, HType type) { types[index] = type; }
-
-  HTypeList union(HTypeList other, Compiler compiler) {
-    if (allUnknown) return this;
-    if (other.allUnknown) return other;
-    if (length != other.length) return HTypeList.ALL_UNKNOWN;
-    bool onlyUnknown = true;
-    HTypeList result = this;
-    for (int i = 0; i < length; i++) {
-      HType newType = this[i].union(other[i], compiler);
-      if (result == this && newType != this[i]) {
-        // Create a new argument types object with the matching types copied.
-        result = new HTypeList(length);
-        result.types.setRange(0, i, this.types);
-      }
-      if (result != this) {
-        result.types[i] = newType;
-      }
-      if (result[i] != HType.UNKNOWN) onlyUnknown = false;
-    }
-    return onlyUnknown ? HTypeList.ALL_UNKNOWN : result;
-  }
-
-  HTypeList unionWithOptionalParameters(
-      Selector selector,
-      FunctionSignature signature,
-      OptionalParameterTypes defaultValueTypes) {
-    assert(allUnknown || selector.argumentCount == this.length);
-    // Create a new HTypeList for holding types for all parameters.
-    HTypeList result = new HTypeList(signature.parameterCount);
-
-    // First fill in the type of the positional arguments.
-    int nextTypeIndex = -1;
-    if (allUnknown) {
-      for (int i = 0; i < selector.positionalArgumentCount; i++) {
-        result.types[i] = HType.UNKNOWN;
-      }
-    } else {
-      result.types.setRange(0, selector.positionalArgumentCount, this.types);
-      nextTypeIndex = selector.positionalArgumentCount;
-    }
-
-    // Next fill the type of the optional arguments.
-    // As the selector can pass optional arguments positionally some of the
-    // optional arguments might already have a type set. We only need to look
-    // at the optional arguments not passed positionally.
-    // The variable 'index' is counting the signatures optional arguments, the
-    // variable 'next' is set to the next optional arguments to look at and
-    // is used to skip some optional arguments.
-    int next = selector.positionalArgumentCount;
-    int index = signature.requiredParameterCount;
-    signature.forEachOptionalParameter((Element element) {
-      // If some optional parameters were passed positionally these have
-      // already been filled.
-      if (index == next) {
-        assert(result.types[index] == null);
-        HType type = null;
-        if (hasNamedArguments &&
-            selector.namedArguments.indexOf(element.name) >= 0) {
-          type = types[nextTypeIndex++];
-        } else {
-          type = defaultValueTypes.typeFor(element.name);
-        }
-        result.types[index] = type;
-        next++;
-      }
-      index++;
-    });
-    return result;
-  }
-
-  String toString() =>
-      allUnknown ? "HTypeList.ALL_UNKNOWN" : "HTypeList $types";
-}
-
-class FieldTypesRegistry {
-  final JavaScriptBackend backend;
-
-  /**
-   * For each class, [constructors] holds the set of constructors. If there is
-   * more than one constructor for a class it is currently not possible to
-   * infer the field types from construction, as the information collected does
-   * not correlate the generative constructors and generative constructor
-   * body/bodies.
-   */
-  final Map<ClassElement, Set<Element>> constructors;
-
-  /**
-   * The collected type information is stored in three maps. One for types
-   * assigned in the initializer list(s) [fieldInitializerTypeMap], one for
-   * types assigned in the constructor(s) [fieldConstructorTypeMap], and one
-   * for types assigned in the rest of the code, where the field can be
-   * resolved [fieldTypeMap].
-   *
-   * If a field has a type both from constructors and from the initializer
-   * list(s), then the type from the constructor(s) will owerride the one from
-   * the initializer list(s).
-   *
-   * Because the order in which generative constructors, generative constructor
-   * bodies and normal method/function bodies are compiled is undefined, and
-   * because they can all be recompiled, it is not possible to combine this
-   * information into one map at the moment.
-   */
-  final Map<Element, HType> fieldInitializerTypeMap;
-  final Map<Element, HType> fieldConstructorTypeMap;
-  final Map<Element, HType> fieldTypeMap;
-
-  /**
-   * The set of current names setter selectors used. If a named selector is
-   * used it is currently not possible to infer the type of the field.
-   */
-  final Set<SourceString> setterSelectorsUsed;
-
-  final Map<Element, Set<Element>> optimizedStaticFunctions;
-  final Map<Element, FunctionSet> optimizedFunctions;
-
-  FieldTypesRegistry(JavaScriptBackend backend)
-      : constructors =  new Map<ClassElement, Set<Element>>(),
-        fieldInitializerTypeMap = new Map<Element, HType>(),
-        fieldConstructorTypeMap = new Map<Element, HType>(),
-        fieldTypeMap = new Map<Element, HType>(),
-        setterSelectorsUsed = new Set<SourceString>(),
-        optimizedStaticFunctions = new Map<Element, Set<Element>>(),
-        optimizedFunctions = new Map<Element, FunctionSet>(),
-        this.backend = backend;
-
-  Compiler get compiler => backend.compiler;
-
-  void scheduleRecompilation(Element field) {
-    Set optimizedStatics = optimizedStaticFunctions[field];
-    if (optimizedStatics != null) {
-      optimizedStatics.forEach(backend.scheduleForRecompilation);
-      optimizedStaticFunctions.remove(field);
-    }
-    FunctionSet optimized = optimizedFunctions[field];
-    if (optimized != null) {
-      optimized.forEach(backend.scheduleForRecompilation);
-      optimizedFunctions.remove(field);
-    }
-  }
-
-  int constructorCount(Element element) {
-    assert(element.isClass());
-    Set<Element> ctors = constructors[element];
-    return ctors == null ? 0 : ctors.length;
-  }
-
-  void registerFieldType(Map<Element, HType> typeMap,
-                         Element field,
-                         HType type) {
-    assert(field.isField());
-    HType before = optimisticFieldType(field);
-
-    HType oldType = typeMap[field];
-    HType newType;
-
-    if (oldType != null) {
-      newType = oldType.union(type, compiler);
-    } else {
-      newType = type;
-    }
-    typeMap[field] = newType;
-    if (oldType != newType) {
-      scheduleRecompilation(field);
-    }
-  }
-
-  void registerConstructor(Element element) {
-    assert(element.isGenerativeConstructor());
-    Element cls = element.getEnclosingClass();
-    constructors.putIfAbsent(cls, () => new Set<Element>());
-    Set<Element> ctors = constructors[cls];
-    if (ctors.contains(element)) return;
-    ctors.add(element);
-    // We cannot infer field types for classes with more than one constructor.
-    // When the second constructor is seen, recompile all functions relying on
-    // optimistic field types for that class.
-    // TODO(sgjesse): Handle field types for classes with more than one
-    // constructor.
-    if (ctors.length == 2) {
-      optimizedFunctions.keys.toList().forEach((Element field) {
-        if (identical(field.enclosingElement, cls)) {
-          scheduleRecompilation(field);
-        }
-      });
-    }
-  }
-
-  void registerFieldInitializer(Element field, HType type) {
-    registerFieldType(fieldInitializerTypeMap, field, type);
-  }
-
-  void registerFieldConstructor(Element field, HType type) {
-    registerFieldType(fieldConstructorTypeMap, field, type);
-  }
-
-  void registerFieldSetter(Element element, Element field, HType type) {
-    HType initializerType = fieldInitializerTypeMap[field];
-    HType constructorType = fieldConstructorTypeMap[field];
-    HType setterType = fieldTypeMap[field];
-    if (type == HType.UNKNOWN
-        && initializerType == null
-        && constructorType == null
-        && setterType == null) {
-      // Don't register UNKNOWN if there is currently no type information
-      // present for the field. Instead register the function holding the
-      // setter for recompilation if better type information for the field
-      // becomes available.
-      registerOptimizedFunction(element, field, type);
-      return;
-    }
-    registerFieldType(fieldTypeMap, field, type);
-  }
-
-  void addedDynamicSetter(Selector setter, HType type) {
-    // Field type optimizations are disabled for all fields matching a
-    // setter selector.
-    assert(setter.isSetter());
-    // TODO(sgjesse): Take the type of the setter into account.
-    if (setterSelectorsUsed.contains(setter.name)) return;
-    setterSelectorsUsed.add(setter.name);
-    optimizedStaticFunctions.keys.toList().forEach((Element field) {
-      if (field.name == setter.name) {
-        scheduleRecompilation(field);
-      }
-    });
-    optimizedFunctions.keys.toList().forEach((Element field) {
-      if (field.name == setter.name) {
-        scheduleRecompilation(field);
-      }
-    });
-  }
-
-  HType optimisticFieldType(Element field) {
-    assert(field.isField());
-    if (constructorCount(field.getEnclosingClass()) > 1) {
-      return HType.UNKNOWN;
-    }
-    if (setterSelectorsUsed.contains(field.name)) {
-      return HType.UNKNOWN;
-    }
-    HType initializerType = fieldInitializerTypeMap[field];
-    HType constructorType = fieldConstructorTypeMap[field];
-    if (initializerType == null && constructorType == null) {
-      // If there are no constructor type information return UNKNOWN. This
-      // ensures that the function will be recompiled if useful constructor
-      // type information becomes available.
-      return HType.UNKNOWN;
-    }
-    // A type set through the constructor overrides the type from the
-    // initializer list.
-    HType result = constructorType != null ? constructorType : initializerType;
-    HType type = fieldTypeMap[field];
-    if (type != null) result = result.union(type, compiler);
-    return result;
-  }
-
-  void registerOptimizedFunction(Element element,
-                                 Element field,
-                                 HType type) {
-    assert(field.isField());
-    if (Elements.isStaticOrTopLevel(element)) {
-      optimizedStaticFunctions.putIfAbsent(
-          field, () => new Set<Element>());
-      optimizedStaticFunctions[field].add(element);
-    } else {
-      optimizedFunctions.putIfAbsent(
-          field, () => new FunctionSet(backend.compiler));
-      optimizedFunctions[field].add(element);
-    }
-  }
-
-  void dump() {
-    Set<Element> allFields = new Set<Element>();
-    fieldInitializerTypeMap.keys.forEach(allFields.add);
-    fieldConstructorTypeMap.keys.forEach(allFields.add);
-    fieldTypeMap.keys.forEach(allFields.add);
-    allFields.forEach((Element field) {
-      print("Inferred $field has type ${optimisticFieldType(field)}");
-    });
-  }
-}
-
-class ArgumentTypesRegistry {
-  final JavaScriptBackend backend;
-
-  /**
-   * Documentation wanted -- johnniwinther
-   *
-   * Invariant: Keys must be declaration elements.
-   */
-  final Map<Element, HTypeList> staticTypeMap;
-
-  /**
-   * Documentation wanted -- johnniwinther
-   *
-   * Invariant: Elements must be declaration elements.
-   */
-  final Set<Element> optimizedStaticFunctions;
-  final SelectorMap<HTypeList> selectorTypeMap;
-  final FunctionSet optimizedFunctions;
-
-  /**
-   * Documentation wanted -- johnniwinther
-   *
-   * Invariant: Keys must be declaration elements.
-   */
-  final Map<Element, HTypeList> optimizedTypes;
-  final Map<Element, OptionalParameterTypes> optimizedDefaultValueTypes;
-
-  ArgumentTypesRegistry(JavaScriptBackend backend)
-      : staticTypeMap = new Map<Element, HTypeList>(),
-        optimizedStaticFunctions = new Set<Element>(),
-        selectorTypeMap = new SelectorMap<HTypeList>(backend.compiler),
-        optimizedFunctions = new FunctionSet(backend.compiler),
-        optimizedTypes = new Map<Element, HTypeList>(),
-        optimizedDefaultValueTypes =
-            new Map<Element, OptionalParameterTypes>(),
-        this.backend = backend;
-
-  Compiler get compiler => backend.compiler;
-
-  bool updateTypes(HTypeList oldTypes, HTypeList newTypes, var key, var map) {
-    if (oldTypes.allUnknown) return false;
-    newTypes = oldTypes.union(newTypes, backend.compiler);
-    if (identical(newTypes, oldTypes)) return false;
-    map[key] = newTypes;
-    return true;
-  }
-
-  void registerStaticInvocation(HInvokeStatic node) {
-    Element element = node.element;
-    assert(invariant(node, element.isDeclaration));
-    HTypeList oldTypes = staticTypeMap[element];
-    HTypeList newTypes = new HTypeList.fromStaticInvocation(node);
-    if (oldTypes == null) {
-      staticTypeMap[element] = newTypes;
-    } else if (updateTypes(oldTypes, newTypes, element, staticTypeMap)) {
-      if (optimizedStaticFunctions.contains(element)) {
-        backend.scheduleForRecompilation(element);
-      }
-    }
-  }
-
-  void registerNonCallStaticUse(HStatic node) {
-    // When a static is used for anything else than a call target we cannot
-    // infer anything about its parameter types.
-    Element element = node.element;
-    assert(invariant(node, element.isDeclaration));
-    if (optimizedStaticFunctions.contains(element)) {
-      backend.scheduleForRecompilation(element);
-    }
-    staticTypeMap[element] = HTypeList.ALL_UNKNOWN;
-  }
-
-  void registerDynamicInvocation(HTypeList providedTypes, Selector selector) {
-    if (selector.isClosureCall()) {
-      // We cannot use the current framework to do optimizations based
-      // on the 'call' selector because we are also generating closure
-      // calls during the emitter phase, which at this point, does not
-      // track parameter types, nor invalidates optimized methods.
-      return;
-    }
-    if (!selectorTypeMap.containsKey(selector)) {
-      selectorTypeMap[selector] = providedTypes;
-    } else {
-      HTypeList oldTypes = selectorTypeMap[selector];
-      updateTypes(oldTypes, providedTypes, selector, selectorTypeMap);
-    }
-
-    // If we're not compiling, we don't have to do anything.
-    if (compiler.phase != Compiler.PHASE_COMPILING) return;
-
-    // Run through all optimized functions and figure out if they need
-    // to be recompiled because of this new invocation.
-    for (Element element in optimizedFunctions.filter(selector)) {
-      // TODO(kasperl): Maybe check if the element is already marked for
-      // recompilation? Could be pretty cheap compared to computing
-      // union types.
-      HTypeList newTypes =
-          parameterTypes(element, optimizedDefaultValueTypes[element]);
-      bool recompile = false;
-      if (newTypes.allUnknown) {
-        recompile = true;
-      } else {
-        HTypeList oldTypes = optimizedTypes[element];
-        assert(newTypes.length == oldTypes.length);
-        for (int i = 0; i < oldTypes.length; i++) {
-          if (newTypes[i] != oldTypes[i]) {
-            recompile = true;
-            break;
-          }
-        }
-      }
-      if (recompile) backend.scheduleForRecompilation(element);
-    }
-  }
-
-  HTypeList parameterTypes(FunctionElement element,
-                           OptionalParameterTypes defaultValueTypes) {
-    assert(invariant(element, element.isDeclaration));
-    // Handle static functions separately.
-    if (Elements.isStaticOrTopLevelFunction(element) ||
-        element.kind == ElementKind.GENERATIVE_CONSTRUCTOR) {
-      HTypeList types = staticTypeMap[element];
-      if (types != null) {
-        if (!optimizedStaticFunctions.contains(element)) {
-          optimizedStaticFunctions.add(element);
-        }
-        return types;
-      } else {
-        return HTypeList.ALL_UNKNOWN;
-      }
-    }
-
-    // Getters have no parameters.
-    if (element.isGetter()) return HTypeList.ALL_UNKNOWN;
-
-    // TODO(kasperl): What kind of non-members do we get here?
-    if (!element.isMember()) return HTypeList.ALL_UNKNOWN;
-
-    // If there are any getters for this method we cannot know anything about
-    // the types of the provided parameters. Use resolverWorld for now as that
-    // information does not change during compilation.
-    // TODO(ngeoffray): These checks should use the codegenWorld and keep track
-    // of changes to this information.
-    if (compiler.resolverWorld.hasInvokedGetter(element, compiler)) {
-      return HTypeList.ALL_UNKNOWN;
-    }
-
-    FunctionSignature signature = element.computeSignature(compiler);
-    HTypeList found = null;
-    selectorTypeMap.visitMatching(element,
-        (Selector selector, HTypeList types) {
-      if (selector.argumentCount != signature.parameterCount ||
-          selector.namedArgumentCount > 0) {
-        types = types.unionWithOptionalParameters(selector,
-                                                  signature,
-                                                  defaultValueTypes);
-      }
-      assert(types.allUnknown || types.length == signature.parameterCount);
-      found = (found == null) ? types : found.union(types, compiler);
-      return !found.allUnknown;
-    });
-    return found != null ? found : HTypeList.ALL_UNKNOWN;
-  }
-
-  void registerOptimizedFunction(Element element,
-                                 HTypeList parameterTypes,
-                                 OptionalParameterTypes defaultValueTypes) {
-    if (Elements.isStaticOrTopLevelFunction(element)) {
-      if (parameterTypes.allUnknown) {
-        optimizedStaticFunctions.remove(element);
-      } else {
-        optimizedStaticFunctions.add(element);
-      }
-    }
-
-    // TODO(kasperl): What kind of non-members do we get here?
-    if (!element.isInstanceMember()) return;
-
-    if (parameterTypes.allUnknown) {
-      optimizedFunctions.remove(element);
-      optimizedTypes.remove(element);
-      optimizedDefaultValueTypes.remove(element);
-    } else {
-      optimizedFunctions.add(element);
-      optimizedTypes[element] = parameterTypes;
-      optimizedDefaultValueTypes[element] = defaultValueTypes;
-    }
-  }
-
-  void dump() {
-    optimizedFunctions.forEach((Element element) {
-      HTypeList types = optimizedTypes[element];
-      print("Inferred $element has argument types ${types.types}");
-    });
-  }
-}
-
 class JavaScriptItemCompilationContext extends ItemCompilationContext {
   final Set<HInstruction> boundsChecked;
 
@@ -691,17 +90,6 @@
    */
   ClassElement jsIndexingBehaviorInterface;
 
-  final Map<Element, ReturnInfo> returnInfo;
-
-  /**
-   * Documentation wanted -- johnniwinther
-   *
-   * Invariant: Elements must be declaration elements.
-   */
-  final List<Element> invalidateAfterCodegen;
-  ArgumentTypesRegistry argumentTypes;
-  FieldTypesRegistry fieldTypes;
-
   /**
    * A collection of selectors of intercepted method calls. The
    * emitter uses this set to generate the [:ObjectInterceptor:] class
@@ -762,8 +150,6 @@
 
   JavaScriptBackend(Compiler compiler, bool generateSourceMap, bool disableEval)
       : namer = determineNamer(compiler),
-        returnInfo = new Map<Element, ReturnInfo>(),
-        invalidateAfterCodegen = new List<Element>(),
         usedInterceptors = new Set<Selector>(),
         oneShotInterceptors = new Map<String, Selector>(),
         interceptedElements = new Map<SourceString, Set<Element>>(),
@@ -776,8 +162,6 @@
     builder = new SsaBuilderTask(this);
     optimizer = new SsaOptimizerTask(this);
     generator = new SsaCodeGeneratorTask(this);
-    argumentTypes = new ArgumentTypesRegistry(this);
-    fieldTypes = new FieldTypesRegistry(this);
   }
 
   static Namer determineNamer(Compiler compiler) {
@@ -1052,23 +436,10 @@
     }
   }
 
-  void initializeNoSuchMethod() {
-    // In case the emitter generates noSuchMethod calls, we need to
-    // make sure all [noSuchMethod] methods know they might take a
-    // [JsInvocationMirror] as parameter.
-    HTypeList types = new HTypeList(1);
-    types[0] = new HType.nonNullExact(
-        compiler.jsInvocationMirrorClass.computeType(compiler),
-        compiler);
-    argumentTypes.registerDynamicInvocation(
-        types, compiler.noSuchMethodSelector);
-  }
-
   void registerInstantiatedClass(ClassElement cls,
                                  Enqueuer enqueuer,
                                  TreeElements elements) {
     if (!seenAnyClass) {
-      initializeNoSuchMethod();
       seenAnyClass = true;
       if (enqueuer.isResolutionQueue) {
         // TODO(9577): Make it so that these are not needed when there are no
@@ -1387,7 +758,13 @@
 
   void codegen(CodegenWorkItem work) {
     Element element = work.element;
-    if (element.kind.category == ElementCategory.VARIABLE) {
+    var kind = element.kind;
+    if (kind == ElementKind.TYPEDEF) return;
+    if (element.isConstructor() && element.getEnclosingClass() == jsNullClass) {
+      // Work around a problem compiling JSNull's constructor.
+      return;
+    }
+    if (kind.category == ElementCategory.VARIABLE) {
       Constant initialValue = compiler.constantHandler.compileWorkItem(work);
       if (initialValue != null) {
         return;
@@ -1411,8 +788,6 @@
     }
     jsAst.Expression code = generator.generateCode(work, graph);
     generatedCode[element] = code;
-    invalidateAfterCodegen.forEach(eagerRecompile);
-    invalidateAfterCodegen.clear();
   }
 
   native.NativeEnqueuer nativeResolutionEnqueuer(Enqueuer world) {
@@ -1442,153 +817,6 @@
     emitter.assembleProgram();
   }
 
-  /**
-   * Documentation wanted -- johnniwinther
-   *
-   * Invariant: [element] must be a declaration element.
-   */
-  void scheduleForRecompilation(Element element) {
-    assert(invariant(element, element.isDeclaration));
-    if (compiler.phase == Compiler.PHASE_COMPILING) {
-      invalidateAfterCodegen.add(element);
-    }
-  }
-
-  /**
-   *  Register a dynamic invocation and collect the provided types for the
-   *  named selector.
-   */
-  void registerDynamicInvocation(HInvoke node, Selector selector) {
-    HTypeList providedTypes =
-        new HTypeList.fromDynamicInvocation(node, selector);
-    argumentTypes.registerDynamicInvocation(providedTypes, selector);
-  }
-
-  /**
-   *  Register a static invocation and collect the provided types for the
-   *  named selector.
-   */
-  void registerStaticInvocation(HInvokeStatic node) {
-    argumentTypes.registerStaticInvocation(node);
-  }
-
-  /**
-   *  Register that a static is used for something else than a direct call
-   *  target.
-   */
-  void registerNonCallStaticUse(HStatic node) {
-    argumentTypes.registerNonCallStaticUse(node);
-  }
-
-  /**
-   * Retrieve the types of the parameters used for calling the [element]
-   * function. The types are optimistic in the sense as they are based on the
-   * possible invocations of the function seen so far.
-   *
-   * Invariant: [element] must be a declaration element.
-   */
-  HTypeList optimisticParameterTypes(
-      FunctionElement element,
-      OptionalParameterTypes defaultValueTypes) {
-    assert(invariant(element, element.isDeclaration));
-    if (element.parameterCount(compiler) == 0) return HTypeList.ALL_UNKNOWN;
-    return argumentTypes.parameterTypes(element, defaultValueTypes);
-  }
-
-  /**
-   * Register that the function [element] has been optimized under the
-   * assumptions that the types [parameterType] will be used for calling it.
-   * The passed [defaultValueTypes] holds the types of default values for
-   * the optional parameters. If this assumption fail the function will be
-   * scheduled for recompilation.
-   *
-   * Invariant: [element] must be a declaration element.
-   */
-  registerParameterTypesOptimization(
-      FunctionElement element,
-      HTypeList parameterTypes,
-      OptionalParameterTypes defaultValueTypes) {
-    assert(invariant(element, element.isDeclaration));
-    if (element.parameterCount(compiler) == 0) return;
-    argumentTypes.registerOptimizedFunction(
-        element, parameterTypes, defaultValueTypes);
-  }
-
-  registerFieldTypesOptimization(Element element,
-                                 Element field,
-                                 HType type) {
-    fieldTypes.registerOptimizedFunction(element, field, type);
-  }
-
-  /**
-   * Documentation wanted -- johnniwinther
-   *
-   * Invariant: [element] must be a declaration element.
-   */
-  void registerReturnType(FunctionElement element, HType returnType) {
-    assert(invariant(element, element.isDeclaration));
-    ReturnInfo info = returnInfo[element];
-    if (info != null) {
-      info.update(returnType, scheduleForRecompilation, compiler);
-    } else {
-      returnInfo[element] = new ReturnInfo(returnType);
-    }
-  }
-
-  /**
-   * Retrieve the return type of the function [callee]. The type is optimistic
-   * in the sense that is is based on the compilation of [callee]. If [callee]
-   * is recompiled the return type might change to someting broader. For that
-   * reason [caller] is registered for recompilation if this happens. If the
-   * function [callee] has not yet been compiled the returned type is [null].
-   *
-   * Invariant: Both [caller] and [callee] must be declaration elements.
-   */
-  HType optimisticReturnTypesWithRecompilationOnTypeChange(
-      Element caller, FunctionElement callee) {
-    assert(invariant(callee, callee.isDeclaration));
-    returnInfo.putIfAbsent(callee, () => new ReturnInfo.unknownType());
-    ReturnInfo info = returnInfo[callee];
-    HType returnType = info.returnType;
-    if (returnType != HType.UNKNOWN && returnType != null && caller != null) {
-      assert(invariant(caller, caller.isDeclaration));
-      info.addCompiledFunction(caller);
-    }
-    return info.returnType;
-  }
-
-  void dumpReturnTypes() {
-    returnInfo.forEach((Element element, ReturnInfo info) {
-      if (info.returnType != HType.UNKNOWN) {
-        print("Inferred $element has return type ${info.returnType}");
-      }
-    });
-  }
-
-  void registerConstructor(Element element) {
-    fieldTypes.registerConstructor(element);
-  }
-
-  void registerFieldInitializer(Element field, HType type) {
-    fieldTypes.registerFieldInitializer(field, type);
-  }
-
-  void registerFieldConstructor(Element field, HType type) {
-    fieldTypes.registerFieldConstructor(field, type);
-  }
-
-  void registerFieldSetter(Element element, Element field, HType type) {
-    fieldTypes.registerFieldSetter(element, field, type);
-  }
-
-  void addedDynamicSetter(Selector setter, HType type) {
-    fieldTypes.addedDynamicSetter(setter, type);
-  }
-
-  HType optimisticFieldType(Element element) {
-    return fieldTypes.optimisticFieldType(element);
-  }
-
   Element getImplementationClass(Element element) {
     if (element == compiler.intClass) {
       return jsIntClass;
@@ -1740,21 +968,6 @@
     }
   }
 
-  void dumpInferredTypes() {
-    print("Inferred argument types:");
-    print("------------------------");
-    argumentTypes.dump();
-    print("");
-    print("Inferred return types:");
-    print("----------------------");
-    dumpReturnTypes();
-    print("");
-    print("Inferred field types:");
-    print("------------------------");
-    fieldTypes.dump();
-    print("");
-  }
-
   Element getExceptionUnwrapper() {
     return compiler.findHelper(const SourceString('unwrapException'));
   }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index 494eebf..fb146ff 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -63,7 +63,8 @@
   ConstantEmitter constantEmitter;
   NativeEmitter nativeEmitter;
   CodeBuffer mainBuffer;
-  final CodeBuffer deferredBuffer = new CodeBuffer();
+  final CodeBuffer deferredLibraries = new CodeBuffer();
+  final CodeBuffer deferredConstants = new CodeBuffer();
   /** Shorter access to [isolatePropertiesName]. Both here in the code, as
       well as in the generated code. */
   String isolateProperties;
@@ -1901,9 +1902,7 @@
     for (FunctionElement element in
              Elements.sortedByPosition(staticGetters.keys)) {
       Element closure = staticGetters[element];
-      // TODO(ahe): This should be emitted as a constant.  Currently,
-      // this breaks deferred loading.
-      CodeBuffer buffer = eagerBuffer;
+      CodeBuffer buffer = isDeferred(element) ? deferredConstants : eagerBuffer;
       String closureClass = namer.isolateAccess(closure);
       String name = namer.getStaticClosureName(element);
       String staticName = namer.getName(element);
@@ -3127,12 +3126,7 @@
         mainBuffer
             ..write(getReflectionDataParser())
             ..write('([$n');
-        emitDeferredPreambleWhenEmpty(deferredBuffer);
-        deferredBuffer.add('\$\$$_=$_{};$n');
 
-        deferredBuffer
-            ..write(getReflectionDataParser())
-            ..write('([$n');
         var sortedLibraries = Elements.sortedByPosition(libraryBuffers.keys);
         for (LibraryElement library in sortedLibraries) {
           List<CodeBuffer> buffers = libraryBuffers[library];
@@ -3159,7 +3153,7 @@
           }
           buffer = buffers[1];
           if (buffer != null) {
-            deferredBuffer
+            deferredLibraries
                 ..write('["${library.getLibraryOrScriptName()}",$_')
                 ..write('"${uri}",$_')
                 ..write('[],$_')
@@ -3171,15 +3165,6 @@
         }
         mainBuffer.write('])$N');
 
-        deferredBuffer.write('])$N');
-        if (!deferredClasses.isEmpty) {
-          deferredBuffer.add('$finishClassesName(\$\$,'
-                             '$_${namer.CURRENT_ISOLATE},'
-                             '$_$isolatePropertiesName)$N');
-        }
-
-        // Reset the map.
-        deferredBuffer.add("\$\$$_=${_}null$N$n");
         emitFinishClassesInvocationIfNecessary(mainBuffer);
         classesCollector = oldClassesCollector;
       }
@@ -3213,7 +3198,7 @@
       compiler.assembledCode = mainBuffer.getText();
       outputSourceMap(mainBuffer, compiler.assembledCode, '');
 
-      emitDeferredCode(deferredBuffer);
+      emitDeferredCode();
 
     });
     return compiler.assembledCode;
@@ -3235,8 +3220,6 @@
     return buffer;
   }
 
-  bool firstDeferredConstant = true;
-
   /**
    * Returns the appropriate buffer for [constant].  If [constant] is
    * itself an instance of a deferred type (or built from constants
@@ -3249,29 +3232,59 @@
     while (!queue.isEmpty) {
       constant = queue.removeFirst();
       if (isDeferred(constant.computeType(compiler).element)) {
-        emitDeferredPreambleWhenEmpty(deferredBuffer);
-        if (firstDeferredConstant) {
-          deferredBuffer.write(
-              '${namer.CURRENT_ISOLATE}$_=${_}old${namer.CURRENT_ISOLATE}$N');
-          deferredBuffer.write(
-              'old${namer.CURRENT_ISOLATE}$_=${_}${namer.CURRENT_ISOLATE}$N');
-        }
-        firstDeferredConstant = false;
-        return deferredBuffer;
+        return deferredConstants;
       }
       queue.addAll(constant.getDependencies());
     }
     return eagerBuffer;
   }
 
-  void emitDeferredCode(CodeBuffer buffer) {
-    if (buffer.isEmpty) return;
 
-    buffer.write(n);
+
+  void emitDeferredCode() {
+    if (deferredLibraries.isEmpty && deferredConstants.isEmpty) return;
+
+    var oldClassesCollector = classesCollector;
+    classesCollector = r"$$";
+
+    // It does not make sense to defer constants if there are no
+    // deferred elements.
+    assert(!deferredLibraries.isEmpty);
+
+    var buffer = new CodeBuffer()
+        ..write(buildGeneratedBy())
+        ..write('var old${namer.CURRENT_ISOLATE}$_='
+                '$_${namer.CURRENT_ISOLATE}$N'
+                // TODO(ahe): This defines a lot of properties on the
+                // Isolate.prototype object.  We know this will turn it into a
+                // slow object in V8, so instead we should do something similar
+                // to Isolate.$finishIsolateConstructor.
+                '${namer.CURRENT_ISOLATE}$_='
+                '$_${namer.isolateName}.prototype$N$n'
+                // The classesCollector object ($$).
+                '$classesCollector$_=$_{};$n')
+        ..write(getReflectionDataParser())
+        ..write('([$n')
+        ..addBuffer(deferredLibraries)
+        ..write('])$N');
+
+    if (!deferredClasses.isEmpty) {
+      buffer.write(
+          '$finishClassesName($classesCollector,$_${namer.CURRENT_ISOLATE},'
+          '$_$isolatePropertiesName)$N');
+    }
 
     buffer.write(
+        // Reset the classesCollector ($$).
+        '$classesCollector$_=${_}null$N$n'
         '${namer.CURRENT_ISOLATE}$_=${_}old${namer.CURRENT_ISOLATE}$N');
 
+    classesCollector = oldClassesCollector;
+
+    if (!deferredConstants.isEmpty) {
+      buffer.addBuffer(deferredConstants);
+    }
+
     String code = buffer.getText();
     compiler.outputProvider('part', 'js')
       ..add(code)
@@ -3279,22 +3292,6 @@
     outputSourceMap(buffer, compiler.assembledCode, 'part');
   }
 
-  void emitDeferredPreambleWhenEmpty(CodeBuffer buffer) {
-    if (!buffer.isEmpty) return;
-
-    buffer.write(buildGeneratedBy());
-
-    buffer.write('var old${namer.CURRENT_ISOLATE}$_='
-                 '$_${namer.CURRENT_ISOLATE}$N');
-
-    // TODO(ahe): This defines a lot of properties on the
-    // Isolate.prototype object.  We know this will turn it into a
-    // slow object in V8, so instead we should do something similar to
-    // Isolate.$finishIsolateConstructor.
-    buffer.write('${namer.CURRENT_ISOLATE}$_='
-                 '$_${namer.isolateName}.prototype$N$n');
-  }
-
   String buildGeneratedBy() {
     var suffix = '';
     if (compiler.hasBuildId) suffix = ' version: ${compiler.buildId}';
diff --git a/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart b/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
index 37dc6b8..e006fa5 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/io_patch.dart
@@ -303,3 +303,9 @@
     throw new UnsupportedError("newZLibInflateFilter");
   }
 }
+
+patch class _OptionsImpl {
+  patch String get version {
+    throw new UnsupportedError("_OptionsImpl.version");
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart
index c06e251..db8d87f 100644
--- a/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart
@@ -198,7 +198,9 @@
 
 final Expando<ClassMirror> classMirrors = new Expando<ClassMirror>();
 
-ClassMirror reflectType(Type key) => reflectClassByName(s('$key'));
+ClassMirror reflectType(Type key) {
+  return reflectClassByName(s('$key'.split('<')[0]));
+}
 
 ClassMirror reflectClassByName(Symbol symbol) {
   String className = n(symbol);
@@ -316,6 +318,8 @@
   final String _fields;
   final List _fieldsMetadata;
   List _metadata;
+  JsClassMirror _superclass;
+
   // Set as side-effect of accessing JsLibraryMirror.classes.
   JsLibraryMirror _owner;
 
@@ -346,8 +350,8 @@
 
   Map<Symbol, VariableMirror> get variables {
     var result = new Map<Symbol, VariableMirror>();
-    var s = _fields.split(";");
-    var fields = s[1] == "" ? [] : s[1].split(",");
+    var s = _fields.split(';');
+    var fields = s[1] == '' ? [] : s[1].split(',');
     int fieldNumber = 0;
     for (String field in fields) {
       var metadata;
@@ -439,6 +443,16 @@
     return _metadata.map(reflect).toList();
   }
 
+  ClassMirror get superclass {
+    if (_superclass == null) {
+      var superclassName = _fields.split(';')[0];
+      // Use _superclass == this to represent class with no superclass (Object).
+      _superclass =
+          (superclassName == '') ? this : reflectClassByName(s(superclassName));
+    }
+    return _superclass == this ? null : _superclass;
+  }
+
   String toString() => 'ClassMirror(${n(simpleName)})';
 }
 
@@ -473,7 +487,7 @@
     }
     String jsName;
     String accessorName = jsName = descriptor.substring(0, length);
-    int divider = descriptor.indexOf(":");
+    int divider = descriptor.indexOf(':');
     if (divider > 0) {
       accessorName = accessorName.substring(0, divider);
       jsName = accessorName.substring(divider + 1);
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 135da9d..d0ffd9a 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -485,8 +485,7 @@
         cls.supertypeLoadState = STATE_DONE;
         cls.allSupertypes = const Link<DartType>().prepend(
             compiler.objectClass.computeType(compiler));
-        // TODO(ahe): We should also set cls.supertype here to avoid
-        // creating a malformed class hierarchy.
+        cls.supertype = cls.allSupertypes.head;
         return;
       }
       cls.supertypeLoadState = STATE_STARTED;
@@ -3234,9 +3233,9 @@
     // resolve this class again.
     resolveTypeVariableBounds(node.typeParameters);
 
-    // Setup the supertype for the element.
-    assert(element.supertype == null);
-    if (node.superclass != null) {
+    // Setup the supertype for the element (if there is a cycle in the
+    // class hierarchy, it has already been set to Object).
+    if (element.supertype == null && node.superclass != null) {
       MixinApplication superMixin = node.superclass.asMixinApplication();
       if (superMixin != null) {
         DartType supertype = resolveSupertype(element, superMixin.superclass);
diff --git a/sdk/lib/_internal/compiler/implementation/source_file_provider.dart b/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
index e10a4bd..9916c98 100644
--- a/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
+++ b/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
@@ -37,7 +37,7 @@
     String source;
     try {
       source = readAll(uriPathToNative(resourceUri.path));
-    } on FileIOException catch (ex) {
+    } on FileException catch (ex) {
       throw 'Error: Cannot read "${relativize(cwd, resourceUri, isWindows)}" '
             '(${ex.osError}).';
     }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 1187969..9121747 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -54,33 +54,11 @@
       if (!identical(kind, ElementKind.FIELD)) {
         FunctionElement function = element;
         graph.calledInLoop = compiler.world.isCalledInLoop(function);
-        OptionalParameterTypes defaultValueTypes = null;
         FunctionSignature signature = function.computeSignature(compiler);
-        if (signature.optionalParameterCount > 0) {
-          defaultValueTypes =
-              new OptionalParameterTypes(signature.optionalParameterCount);
-          int index = 0;
-          signature.forEachOptionalParameter((Element parameter) {
-            Constant defaultValue = builder.compileVariable(parameter);
-            HType type = HGraph.mapConstantTypeToSsaType(defaultValue);
-            defaultValueTypes.update(index, parameter.name, type);
-            index++;
-          });
-        } else {
-          // BUG(10938): the types are stored in the wrong order.
-          // order.
-          HTypeList parameterTypes =
-              backend.optimisticParameterTypes(element.declaration,
-                                               defaultValueTypes);
-          if (!parameterTypes.allUnknown) {
-            int i = 0;
-            signature.forEachParameter((Element param) {
-              builder.parameters[param].instructionType = parameterTypes[i++];
-            });
-          }
-          backend.registerParameterTypesOptimization(
-              element.declaration, parameterTypes, defaultValueTypes);
-        }
+        signature.forEachOptionalParameter((Element parameter) {
+          // This ensures the default value will be computed.
+          builder.compileVariable(parameter);
+        });
       }
 
       if (compiler.tracer.enabled) {
@@ -1092,11 +1070,6 @@
     });
     if (bodyElement == null) {
       bodyElement = new ConstructorBodyElementX(constructor);
-      // [:resolveMethodElement:] require the passed element to be a
-      // declaration.
-      TreeElements treeElements =
-          compiler.enqueuer.resolution.getCachedElements(
-              constructor.declaration);
       classElement.addBackendMember(bodyElement);
 
       if (constructor.isPatch) {
@@ -1105,11 +1078,6 @@
         bodyElement.origin.patch = bodyElement;
         classElement.origin.addBackendMember(bodyElement.origin);
       }
-      // Set the [TreeElements] of the generative constructor body to
-      // be the same as the generative constructor.
-      compiler.enqueuer.resolution.ensureCachedElements(
-          bodyElement.declaration,
-          treeElements);
     }
     assert(bodyElement.isGenerativeConstructorBody());
     return bodyElement;
@@ -1141,12 +1109,6 @@
     List<HInstruction> compiledArguments;
     bool isInstanceMember = function.isInstanceMember();
 
-    if (function.isGenerativeConstructor()) {
-      // The optimistic field type optimization requires
-      // to know all generative constructors seen in codegen.
-      backend.registerConstructor(function);
-    }
-
     if (currentNode == null
         || currentNode.asForIn() != null
         || !isInstanceMember
@@ -2454,7 +2416,7 @@
         nestedClosureData.closureClassElement;
     FunctionElement callElement = nestedClosureData.callElement;
     // TODO(ahe): This should be registered in codegen, not here.
-    compiler.enqueuer.codegen.addToWorkList(callElement, elements);
+    compiler.enqueuer.codegen.addToWorkList(callElement);
     // TODO(ahe): This should be registered in codegen, not here.
     compiler.enqueuer.codegen.registerInstantiatedClass(
         closureClassElement, work.resolutionTree);
@@ -3790,14 +3752,6 @@
 
     if (type == null) {
       type = new HType.inferredReturnTypeForElement(element, compiler);
-      if (type.isUnknown()) {
-        // TODO(ngeoffray): Only do this if knowing the return type is
-        // useful.
-        type =
-            builder.backend.optimisticReturnTypesWithRecompilationOnTypeChange(
-                currentElement, element);
-        if (type == null) type = HType.UNKNOWN;
-      }
     }
     // TODO(5346): Try to avoid the need for calling [declaration] before
     // creating an [HInvokeStatic].
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index cbf3579..2287d54 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -303,21 +303,6 @@
     allocator.visitGraph(graph);
     variableNames = allocator.names;
     shouldGroupVarDeclarations = allocator.names.numberOfVariables > 1;
-
-    // Don't register a return type for lazily initialized variables.
-    if (work.element is! FunctionElement) return;
-
-    // Register return types to the backend.
-    graph.exit.predecessors.forEach((HBasicBlock block) {
-      HInstruction last = block.last;
-      assert(last is HGoto || last is HReturn || last is HThrow);
-      if (last is HReturn) {
-        backend.registerReturnType(
-            work.element, last.inputs[0].instructionType);
-      } else if (last is HGoto) {
-        backend.registerReturnType(work.element, HType.NULL);
-      }
-    });
   }
 
   void handleDelayedVariableDeclarations() {
@@ -1545,10 +1530,19 @@
   }
 
   Selector getOptimizedSelectorFor(HInvokeDynamic node, Selector selector) {
+    if (node.element != null) {
+      // Create an artificial type mask to make sure only
+      // [node.element] will be enqueued. We're not using the receiver
+      // type because our optimizations might end up in a state where the
+      // invoke dynamic knows more than the receiver.
+      HType receiverType = new HType.fromMask(
+          new TypeMask.nonNullExact(node.element.getEnclosingClass().rawType),
+          compiler);
+      return receiverType.refine(selector, compiler);
+    }
     // If [JSInvocationMirror._invokeOn] has been called, we must not create a
     // typed selector based on the receiver type.
-    if (node.element == null && // Invocation is not exact.
-        backend.compiler.enabledInvokeOn) {
+    if (backend.compiler.enabledInvokeOn) {
       return selector.asUntyped;
     }
     HType receiverType = node.getDartReceiver(compiler).instructionType;
@@ -1563,8 +1557,6 @@
 
   void registerMethodInvoke(HInvokeDynamic node) {
     Selector selector = getOptimizedSelectorFor(node, node.selector);
-    // Register this invocation to collect the types used at all call sites.
-    backend.registerDynamicInvocation(node, selector);
 
     // If we don't know what we're calling or if we are calling a getter,
     // we need to register that fact that we may be calling a closure
@@ -1595,7 +1587,6 @@
     HType valueType = node.isInterceptedCall
         ? node.inputs[2].instructionType
         : node.inputs[1].instructionType;
-    backend.addedDynamicSetter(selector, valueType);
     registerInvoke(node, selector);
   }
 
@@ -1632,10 +1623,6 @@
   }
 
   visitInvokeStatic(HInvokeStatic node) {
-    if (node.typeCode() == HInstruction.INVOKE_STATIC_TYPECODE) {
-      // Register this invocation to collect the types used at all call sites.
-      backend.registerStaticInvocation(node);
-    }
     Element element = node.element;
     world.registerStaticUse(element);
     ClassElement cls = element.getEnclosingClass();
@@ -1674,8 +1661,6 @@
           new js.PropertyAccess.field(prototype, methodName);
       push(jsPropertyCall(
           method, "call", visitArguments(node.inputs, start: 0)), node);
-      // Register this invocation to collect the types used at all call sites.
-      backend.registerDynamicInvocation(node, node.selector);
     }
   }
 
@@ -1696,16 +1681,8 @@
 
   visitFieldSet(HFieldSet node) {
     Element element = node.element;
+    world.registerFieldSetter(element);
     String name = _fieldPropertyName(element);
-    if (!node.receiver.instructionType.isUnknown()) {
-      // Field setters in the generative constructor body are handled in a
-      // step "SsaConstructionFieldTypes" in the ssa optimizer.
-      if (!work.element.isGenerativeConstructorBody()) {
-        world.registerFieldSetter(element);
-        backend.registerFieldSetter(
-            work.element, element, node.value.instructionType);
-      }
-    }
     use(node.receiver);
     js.Expression receiver = pop();
     use(node.value);
@@ -2020,7 +1997,6 @@
   void visitStatic(HStatic node) {
     Element element = node.element;
     if (element.isFunction()) {
-      backend.registerNonCallStaticUse(node);
       world.registerInstantiatedClass(
           compiler.functionClass, work.resolutionTree);
       push(new js.VariableUse(
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index a0a6005..68d1455 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -59,9 +59,6 @@
           new SsaSimplifyInterceptors(compiler, constantSystem, work),
           new SsaDeadCodeEliminator()];
       runPhases(graph, phases);
-      if (!speculative) {
-        runPhase(graph, new SsaConstructionFieldTypes(backend, work));
-      }
     });
   }
 
@@ -693,17 +690,8 @@
           native.NativeBehavior.ofFieldLoad(field, compiler),
           compiler);
     } else {
-      HType type = new HType.inferredTypeForElement(field, compiler);
-      if (type.isUnknown()) {
-        type = backend.optimisticFieldType(field);
-        if (type != null) {
-          backend.registerFieldTypesOptimization(
-              work.element, field, result.instructionType);
-        }
-      }
-      if (type != null) {
-        result.instructionType = type;
-      }
+      result.instructionType =
+          new HType.inferredTypeForElement(field, compiler);
     }
     return result;
   }
@@ -1347,150 +1335,3 @@
     }
   }
 }
-
-
-// Analyze the constructors to see if some fields will always have a specific
-// type after construction. If this is the case we can ignore the type given
-// by the field initializer. This is especially useful when the field
-// initializer is initializing the field to null.
-class SsaConstructionFieldTypes
-    extends HBaseVisitor implements OptimizationPhase {
-  final JavaScriptBackend backend;
-  final CodegenWorkItem work;
-  final String name = "SsaConstructionFieldTypes";
-  final Set<HInstruction> thisUsers;
-  final Set<Element> allSetters;
-  final Map<HBasicBlock, Map<Element, HType>> blockFieldSetters;
-  bool thisExposed = false;
-  HGraph currentGraph;
-  Map<Element, HType> currentFieldSetters;
-
-  SsaConstructionFieldTypes(this.backend, this.work)
-      : thisUsers = new Set<HInstruction>(),
-        allSetters = new Set<Element>(),
-        blockFieldSetters = new Map<HBasicBlock, Map<Element, HType>>();
-
-  void visitGraph(HGraph graph) {
-    currentGraph = graph;
-    if (!work.element.isGenerativeConstructorBody() &&
-        !work.element.isGenerativeConstructor()) return;
-    visitDominatorTree(graph);
-    if (work.element.isGenerativeConstructor()) {
-      backend.registerConstructor(work.element);
-    }
-  }
-
-  visitBasicBlock(HBasicBlock block) {
-    if (block.predecessors.length == 0) {
-      // Create a new empty map for the first block.
-      currentFieldSetters = new Map<Element, HType>();
-    } else {
-      // Build a map which intersects the fields from all predecessors. For
-      // each field in this intersection it unions the types.
-      currentFieldSetters =
-          new Map.from(blockFieldSetters[block.predecessors[0]]);
-      // Loop headers are the only nodes with back edges.
-      if (!block.isLoopHeader()) {
-        for (int i = 1; i < block.predecessors.length; i++) {
-          Map<Element, HType> predecessorsFieldSetters =
-              blockFieldSetters[block.predecessors[i]];
-          Map<Element, HType> newFieldSetters = new Map<Element, HType>();
-          predecessorsFieldSetters.forEach((Element element, HType type) {
-            HType currentType = currentFieldSetters[element];
-            if (currentType != null) {
-              newFieldSetters[element] =
-                  currentType.union(type, backend.compiler);
-            }
-          });
-          currentFieldSetters = newFieldSetters;
-        }
-      } else {
-        assert(block.predecessors.length <= 2);
-      }
-    }
-    block.forEachPhi((HPhi phi) => phi.accept(this));
-    block.forEachInstruction(
-        (HInstruction instruction) => instruction.accept(this));
-    assert(currentFieldSetters != null);
-    blockFieldSetters[block] = currentFieldSetters;
-  }
-
-  visitInstruction(HInstruction instruction) {
-    // All instructions not explicitly handled below will flag the this
-    // exposure if using this.
-    thisExposed = thisExposed || thisUsers.contains(instruction);
-  }
-
-  visitPhi(HPhi phi) {
-    if (thisUsers.contains(phi)) {
-      thisUsers.addAll(phi.usedBy);
-    }
-  }
-
-  visitThis(HThis instruction) {
-    // Collect all users of this in a set to make the this exposed check simple
-    // and cheap.
-    thisUsers.addAll(instruction.usedBy);
-  }
-
-  visitFieldGet(HInstruction _) {
-    // The field get instruction is allowed to use this.
-  }
-
-  visitForeignNew(HForeignNew node) {
-    if (!work.element.isGenerativeConstructor()) return;
-    // Check if this is the new object allocated by this generative
-    // constructor. Inlining might add other [HForeignNew]
-    // instructions in the graph.
-    if (!node.usedBy.any((user) => user is HReturn)) return;
-    // The HForeignNew instruction is used in the generative constructor to
-    // initialize all fields in newly created objects. The fields are
-    // initialized to the value present in the initializer list or set to null
-    // if not otherwise initialized.
-    // Here we handle members in superclasses as well, as the handling of
-    // the generative constructor bodies will ensure, that the initializer
-    // type will not be used if the field is in any of these.
-    int j = 0;
-    node.element.forEachInstanceField(
-        (ClassElement enclosingClass, Element element) {
-          backend.registerFieldInitializer(
-              element, node.inputs[j].instructionType);
-          j++;
-        },
-        includeSuperAndInjectedMembers: true);
-  }
-
-  visitFieldSet(HFieldSet node) {
-    Element field = node.element;
-    HInstruction value = node.value;
-    HType type = value.instructionType;
-    // [HFieldSet] is also used for variables in try/catch.
-    if (field.isField()) allSetters.add(field);
-    // Don't handle fields defined in superclasses. Given that the field is
-    // always added to the [allSetters] set, setting a field defined in a
-    // superclass will get an inferred type of UNKNOWN.
-    if (work.element.getEnclosingClass() == field.getEnclosingClass()) {
-      currentFieldSetters[field] = type;
-    }
-  }
-
-  visitExit(HExit node) {
-    // If this has been exposed then we cannot say anything about types after
-    // construction.
-    if (!thisExposed) {
-      // Register the known field types.
-      currentFieldSetters.forEach((Element element, HType type) {
-        if (type.isUnknown()) return;
-        backend.registerFieldConstructor(element, type);
-        allSetters.remove(element);
-      });
-    }
-
-    // For other fields having setters in the generative constructor body, set
-    // the type to UNKNOWN to avoid relying on the type set in the initializer
-    // list.
-    allSetters.forEach((Element element) {
-      backend.registerFieldConstructor(element, HType.UNKNOWN);
-    });
-  }
-}
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
index 5227623..6eed301 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
@@ -327,6 +327,10 @@
     }
     return desiredType;
   }
+  
+  bool hasBeenSpeculativelyOptimized(HInstruction instruction) {
+    return savedTypes.containsKey(instruction);
+  }
 
   HType computeType(HInstruction instruction) {
     // Once we are in a conflicting state don't update the type anymore.
@@ -334,7 +338,7 @@
     if (oldType.isConflicting()) return oldType;
 
     HType newType = super.computeType(instruction);
-    if (oldType != newType && !savedTypes.containsKey(instruction)) {
+    if (oldType != newType && !hasBeenSpeculativelyOptimized(instruction)) {
       savedTypes[instruction] = oldType;
     }
     // [computeDesiredType] goes to all usedBys and lets them compute their
@@ -344,11 +348,16 @@
     HType desiredType = computeDesiredType(instruction);
     // If the desired type is conflicting just return the computed type.
     if (desiredType.isConflicting()) return newType;
+    if (desiredType.isUnknown() && hasBeenSpeculativelyOptimized(instruction)) {
+      // If we ever change our decision for a desired type to unknown,
+      // we stop the computation on this instruction.
+      return HType.CONFLICTING;
+    }
     // TODO(ngeoffray): Allow speculative optimizations on
     // non-primitive types?
     if (!desiredType.isPrimitive()) return newType;
     desiredType = newType.intersection(desiredType, compiler);
-    if (desiredType != newType && !savedTypes.containsKey(instruction)) {
+    if (desiredType != newType && !hasBeenSpeculativelyOptimized(instruction)) {
       savedTypes[instruction] = oldType;
     }
     return desiredType;
diff --git a/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
index 9a21b45..a75f930 100644
--- a/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart
@@ -342,6 +342,7 @@
     buildWorkQueue();
     int analyzed = 0;
     compiler.progress.reset();
+    int maxReanalysis = (numberOfElementsToAnalyze * 1.5).toInt();
     do {
       if (compiler.progress.elapsedMilliseconds > 500) {
         compiler.log('Inferred $analyzed methods.');
@@ -353,7 +354,7 @@
       bool wasAnalyzed = analyzeCount.containsKey(element);
       if (wasAnalyzed) {
         recompiles++;
-        if (recompiles >= numberOfElementsToAnalyze) {
+        if (recompiles >= maxReanalysis) {
           compiler.log('Ran out of budget for inferring.');
           break;
         }
@@ -1170,7 +1171,9 @@
         if (constraint.isOperator()) {
           // If the constraint is on an operator, we type the receiver
           // to be the field.
-          constraint = new TypedSelector(fieldType, constraint);
+          if (fieldType != null) {
+            constraint = new TypedSelector(fieldType, constraint);
+          }
         } else {
           // Otherwise the constraint is on the form [: field = other.field :].
           assert(constraint.isGetter());
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index 8ee58d2b..ae3b54b 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -116,79 +116,93 @@
   final int argumentCount;
   final List<SourceString> namedArguments;
   final List<SourceString> orderedNamedArguments;
+  final int hashCode;
 
-  int cachedHashCode;
+  static const SourceString INDEX_NAME = const SourceString("[]");
+  static const SourceString INDEX_SET_NAME = const SourceString("[]=");
+  static const SourceString CALL_NAME = Compiler.CALL_OPERATOR_NAME;
 
-  Selector(
-      this.kind,
-      SourceString name,
-      LibraryElement library,
-      this.argumentCount,
-      [List<SourceString> namedArguments = const <SourceString>[]])
-    : this.name = name,
-      this.library = name.isPrivate() ? library : null,
-      this.namedArguments = namedArguments,
-      this.orderedNamedArguments = namedArguments.isEmpty
-          ? namedArguments
-          : <SourceString>[] {
+  Selector.internal(this.kind,
+                    this.name,
+                    this.library,
+                    this.argumentCount,
+                    this.namedArguments,
+                    this.orderedNamedArguments,
+                    this.hashCode) {
     assert(!name.isPrivate() || library != null);
   }
 
-  Selector.getter(SourceString name, LibraryElement library)
-      : this(SelectorKind.GETTER, name, library, 0);
+  factory Selector(SelectorKind kind,
+                   SourceString name,
+                   LibraryElement library,
+                   int argumentCount,
+                   [List<SourceString> namedArguments]) {
+    if (!name.isPrivate()) library = null;
+    List<SourceString> orderedNamedArguments = const <SourceString>[];
+    if (namedArguments == null) {
+      namedArguments = const <SourceString>[];
+    } else if (!namedArguments.isEmpty) {
+      orderedNamedArguments = <SourceString>[];
+    }
+    int hashCode = computeHashCode(
+        kind, name, library, argumentCount, namedArguments);
+    return new Selector.internal(
+        kind, name, library, argumentCount,
+        namedArguments, orderedNamedArguments,
+        hashCode);
+  }
 
-  Selector.getterFrom(Selector selector)
-      : this(SelectorKind.GETTER, selector.name, selector.library, 0);
+  factory Selector.getter(SourceString name, LibraryElement library)
+      => new Selector(SelectorKind.GETTER, name, library, 0);
 
-  Selector.setter(SourceString name, LibraryElement library)
-      : this(SelectorKind.SETTER, name, library, 1);
+  factory Selector.getterFrom(Selector selector)
+      => new Selector(SelectorKind.GETTER, selector.name, selector.library, 0);
 
-  Selector.unaryOperator(SourceString name)
-      : this(SelectorKind.OPERATOR,
-             Elements.constructOperatorName(name, true),
-             null, 0);
+  factory Selector.setter(SourceString name, LibraryElement library)
+      => new Selector(SelectorKind.SETTER, name, library, 1);
 
-  Selector.binaryOperator(SourceString name)
-      : this(SelectorKind.OPERATOR,
-             Elements.constructOperatorName(name, false),
-             null, 1);
+  factory Selector.unaryOperator(SourceString name)
+      => new Selector(SelectorKind.OPERATOR,
+                      Elements.constructOperatorName(name, true),
+                      null, 0);
 
-  Selector.index()
-      : this(SelectorKind.INDEX,
-             Elements.constructOperatorName(const SourceString("[]"), false),
-             null, 1);
+  factory Selector.binaryOperator(SourceString name)
+      => new Selector(SelectorKind.OPERATOR,
+                      Elements.constructOperatorName(name, false),
+                      null, 1);
 
-  Selector.indexSet()
-      : this(SelectorKind.INDEX,
-             Elements.constructOperatorName(const SourceString("[]="), false),
-             null, 2);
+  factory Selector.index()
+      => new Selector(SelectorKind.INDEX,
+                      Elements.constructOperatorName(INDEX_NAME, false),
+                      null, 1);
 
-  Selector.call(SourceString name,
-                LibraryElement library,
-                int arity,
-                [List<SourceString> named = const []])
-      : this(SelectorKind.CALL, name, library, arity, named);
+  factory Selector.indexSet()
+      => new Selector(SelectorKind.INDEX,
+                      Elements.constructOperatorName(INDEX_SET_NAME, false),
+                      null, 2);
 
-  Selector.callClosure(int arity, [List<SourceString> named = const []])
-      : this(SelectorKind.CALL, Compiler.CALL_OPERATOR_NAME, null,
-             arity, named);
+  factory Selector.call(SourceString name,
+                        LibraryElement library,
+                        int arity,
+                        [List<SourceString> namedArguments])
+      => new Selector(SelectorKind.CALL, name, library, arity, namedArguments);
 
-  Selector.callClosureFrom(Selector selector)
-      : this(SelectorKind.CALL, Compiler.CALL_OPERATOR_NAME, null,
-             selector.argumentCount, selector.namedArguments);
+  factory Selector.callClosure(int arity, [List<SourceString> namedArguments])
+      => new Selector(SelectorKind.CALL, CALL_NAME, null,
+                      arity, namedArguments);
 
-  Selector.callConstructor(SourceString constructorName,
-                           LibraryElement library,
-                           [int arity = 0,
-                            List<SourceString> named = const []])
-      : this(SelectorKind.CALL,
-             constructorName,
-             library,
-             arity,
-             named);
+  factory Selector.callClosureFrom(Selector selector)
+      => new Selector(SelectorKind.CALL, CALL_NAME, null,
+                      selector.argumentCount, selector.namedArguments);
 
-  Selector.callDefaultConstructor(LibraryElement library)
-      : this(SelectorKind.CALL, const SourceString(""), library, 0, const []);
+  factory Selector.callConstructor(SourceString name, LibraryElement library,
+                                   [int arity = 0,
+                                    List<SourceString> namedArguments])
+      => new Selector(SelectorKind.CALL, name, library,
+                      arity, namedArguments);
+
+  factory Selector.callDefaultConstructor(LibraryElement library)
+      => new Selector(SelectorKind.CALL, const SourceString(""), library, 0);
 
   bool isGetter() => identical(kind, SelectorKind.GETTER);
   bool isSetter() => identical(kind, SelectorKind.SETTER);
@@ -369,26 +383,23 @@
   bool operator ==(other) {
     if (other is !Selector) return false;
     if (identical(this, other)) return true;
-    return mask == other.mask && equalsUntyped(other);
-  }
-
-  bool equalsUntyped(Selector other) {
     return hashCode == other.hashCode  // Fast because it is cached.
-           && name == other.name
-           && kind == other.kind
-           && identical(library, other.library)
-           && argumentCount == other.argumentCount
-           && namedArguments.length == other.namedArguments.length
-           && sameNames(namedArguments, other.namedArguments);
+        && kind == other.kind
+        && name == other.name
+        && mask == other.mask
+        && identical(library, other.library)
+        && argumentCount == other.argumentCount
+        && namedArguments.length == other.namedArguments.length
+        && sameNames(namedArguments, other.namedArguments);
   }
 
-  int get hashCode {
-    // Check the hash code cache first.
-    if (cachedHashCode != null) return cachedHashCode;
+  static int computeHashCode(SelectorKind kind,
+                             SourceString name,
+                             LibraryElement library,
+                             int argumentCount,
+                             List<SourceString> namedArguments) {
     // Add bits from name and kind.
     int hash = mixHashCodeBits(name.hashCode, kind.hashCode);
-    // Add bits from the type mask.
-    if (mask != null) hash = mixHashCodeBits(hash, mask.hashCode);
     // Add bits from the library.
     if (library != null) hash = mixHashCodeBits(hash, library.hashCode);
     // Add bits from the unnamed arguments.
@@ -399,7 +410,7 @@
     for (int i = 0; i < named; i++) {
       hash = mixHashCodeBits(hash, namedArguments[i].hashCode);
     }
-    return cachedHashCode = hash;
+    return hash;
   }
 
   // TODO(kasperl): Move this out so it becomes useful in other places too?
@@ -456,25 +467,33 @@
   final Selector asUntyped;
   final TypeMask mask;
 
-  TypedSelector(this.mask, Selector selector)
-      : asUntyped = selector.asUntyped,
-        super(selector.kind,
-              selector.name,
-              selector.library,
-              selector.argumentCount,
-              selector.namedArguments) {
+  TypedSelector.internal(this.mask, Selector selector, int hashCode)
+      : asUntyped = selector,
+        super.internal(selector.kind,
+                       selector.name,
+                       selector.library,
+                       selector.argumentCount,
+                       selector.namedArguments,
+                       selector.orderedNamedArguments,
+                       hashCode) {
+    assert(mask != null);
     assert(asUntyped.mask == null);
   }
 
-  TypedSelector.exact(DartType base, Selector selector)
-      : this(new TypeMask.exact(base), selector);
+  factory TypedSelector(TypeMask mask, Selector selector) {
+    Selector untyped = selector.asUntyped;
+    int hashCode = Selector.mixHashCodeBits(untyped.hashCode, mask.hashCode);
+    return new TypedSelector.internal(mask, untyped, hashCode);
+  }
 
-  TypedSelector.subclass(DartType base, Selector selector)
-      : this(new TypeMask.subclass(base), selector);
+  factory TypedSelector.exact(DartType base, Selector selector)
+      => new TypedSelector(new TypeMask.exact(base), selector);
 
-  TypedSelector.subtype(DartType base, Selector selector)
-      : this(new TypeMask.subtype(base), selector);
+  factory TypedSelector.subclass(DartType base, Selector selector)
+      => new TypedSelector(new TypeMask.subclass(base), selector);
 
+  factory TypedSelector.subtype(DartType base, Selector selector)
+      => new TypedSelector(new TypeMask.subtype(base), selector);
 
   bool appliesUnnamed(Element element, Compiler compiler) {
     assert(sameNameHack(element, compiler));
diff --git a/sdk/lib/_internal/compiler/samples/leap/leap_server.dart b/sdk/lib/_internal/compiler/samples/leap/leap_server.dart
index fd46a37..31aaa55 100644
--- a/sdk/lib/_internal/compiler/samples/leap/leap_server.dart
+++ b/sdk/lib/_internal/compiler/samples/leap/leap_server.dart
@@ -71,7 +71,7 @@
   }
 
   static onError(error) {
-    if (error is HttpParserException) {
+    if (error is HttpException) {
       print('Error: ${error.message}');
     } else {
       print('Error: ${error}');
diff --git a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
index ed1e8a6..7d5eba0 100644
--- a/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
+++ b/sdk/lib/_internal/dartdoc/lib/dartdoc.dart
@@ -87,7 +87,7 @@
     // due to invalid result from dir.existsSync() (probably due to race
     // conditions).
     outputDir.createSync();
-  } on DirectoryIOException catch (e) {
+  } on DirectoryException catch (e) {
     // Ignore.
   }
 }
@@ -140,7 +140,8 @@
       new Path(dartPath), libPath,
       options: const <String>['--categories=Client,Server', '--minify'])
   .then((jsCode) {
-    if (jsCode != null) writeString(new File(jsPath), jsCode);
+    if (jsCode == null) throw new StateError("No javascript was generated.");
+    writeString(new File(jsPath), jsCode);
   });
 }
 
@@ -601,7 +602,7 @@
       // race conditions).
       try {
         dir.createSync();
-      } on DirectoryIOException catch (e) {
+      } on DirectoryException catch (e) {
         // Ignore.
       }
     }
@@ -778,9 +779,10 @@
 
   /// Gets the path to the dartdoc directory normalized for running in different
   /// places.
-  String get normalizedDartdocPath => runningFromSdk ?
-      pathos.join(sdkDir, 'lib', '_internal', 'dartdoc') :
-      dartdocPath.toString();
+  String get normalizedDartdocPath => pathos.normalize(
+      pathos.absolute(runningFromSdk ?
+          pathos.join(sdkDir, 'lib', '_internal', 'dartdoc') :
+          dartdocPath.toString()));
 
   void docNavigationDart() {
     var tmpDir = new Directory(tmpPath);
@@ -791,20 +793,15 @@
     String dartString = jsonString.replaceAll(r"$", r"\$");
     var filePath = pathos.join(tmpPath, 'client.dart');
 
-    var fileBuilder = new pathos.Builder(style: pathos.Style.url);
-
-    var clientDir = fileBuilder.join(
-        'file:///',
-        fileBuilder.relative(
-          fileBuilder.join(normalizedDartdocPath, 'lib', 'src', 'client'),
-          from: tmpPath));
+    var clientDir = pathos.join(normalizedDartdocPath,'lib', 'src', 'client');
 
     writeString(new File(filePath),
         '''library client;
         import 'dart:html';
         import 'dart:json';
-        import '${fileBuilder.join(clientDir, 'client-shared.dart')}';
-        import '${fileBuilder.join(clientDir, 'dropdown.dart')}';
+        import r'${pathToFileUri(
+          pathos.join(clientDir, 'client-shared.dart'))}';
+        import r'${pathToFileUri(pathos.join(clientDir, 'dropdown.dart'))}';
 
         main() {
           setup();
diff --git a/sdk/lib/_internal/dartdoc/lib/src/export_map.dart b/sdk/lib/_internal/dartdoc/lib/src/export_map.dart
index 0173009..28d8503 100644
--- a/sdk/lib/_internal/dartdoc/lib/src/export_map.dart
+++ b/sdk/lib/_internal/dartdoc/lib/src/export_map.dart
@@ -46,7 +46,7 @@
       var importsAndExports;
       try {
         importsAndExports = _importsAndExportsForFile(path, packageRoot);
-      } on FileIOException catch (_) {
+      } on FileException catch (_) {
         // Ignore unreadable/nonexistent files.
         return;
       }
diff --git a/sdk/lib/_internal/docgen/docgen.dart b/sdk/lib/_internal/docgen/docgen.dart
new file mode 100644
index 0000000..b245bf5
--- /dev/null
+++ b/sdk/lib/_internal/docgen/docgen.dart
@@ -0,0 +1,177 @@
+/**
+ * The docgen tool takes in a library as input and produces documentation
+ * for the library as well as all libraries it imports and uses. The tool can
+ * be run by passing in the path to a .dart file like this:
+ *
+ *   ./dart docgen.dart path/to/file.dart
+ *
+ * This outputs information about all classes, variables, functions, and
+ * methods defined in the library and its imported libraries.
+ */
+library docgen;
+
+import 'dart:io';
+import 'dart:async';
+import 'lib/src/dart2js_mirrors.dart';
+import 'lib/dart2yaml.dart';
+import '../../../../pkg/args/lib/args.dart';
+import '../compiler/implementation/mirrors/mirrors.dart';
+import '../compiler/implementation/mirrors/mirrors_util.dart';
+
+/**
+ * Entry function to create YAML documentation from Dart files.
+ */
+void main() {
+  // TODO(tmandel): Use args library once flags are clear.
+  Options opts = new Options();
+  
+  if (opts.arguments.length > 0) {
+    List<Path> libraries = [new Path(opts.arguments[0])];
+    Path sdkDirectory = new Path("../../../");
+    var workingMirrors = analyze(libraries, sdkDirectory, 
+        options: ['--preserve-comments', '--categories=Client,Server']);
+    workingMirrors.then( (MirrorSystem mirrorSystem) {
+      var mirrors = mirrorSystem.libraries;
+      if (mirrors.isEmpty) {
+        print("no LibraryMirrors");
+      } else {
+        mirrors.values.forEach( (library) {
+          // TODO(tmandel): Use flags to filter libraries.
+          if (library.uri.scheme != "dart") {
+            String result = _getDocumentation(library);
+            if (result != null) {
+              _writeToFile(result, "${library.qualifiedName}.yaml");
+            }
+          }
+        });
+      }
+    });
+  }
+}
+
+/**
+ *  Creates YAML output from relevant libraries.
+ */
+//TODO(tmandel): Also allow for output to JSON based on flags
+String _getDocumentation(LibraryMirror library) {
+  Map libMap = new Map();
+  String libraryName = library.qualifiedName;
+  
+  // Get library top-level information.
+  libMap[libraryName] = new Map();
+  
+  libMap[libraryName]["variables"] = new Map();
+  _getVariables(libMap[libraryName]["variables"], library.variables);
+  
+  libMap[libraryName]["functions"] = new Map();
+  _getMethods(libMap[libraryName]["functions"], library.functions);
+  
+  String comment = _getComment(library);
+  libMap[libraryName]["comment"] = comment != null ? comment.trim() : null;
+  
+  // Get specific information about each class.
+  Map classes = new Map();
+  library.classes.forEach( (String cName, ClassMirror mir) {
+    
+    classes[cName] = new Map();
+    _getMethods(classes[cName], mir.methods);
+    
+    classes[cName]["variables"] = new Map();
+    _getVariables(classes[cName]["variables"], mir.variables);
+    
+    classes[cName]["superclass"] = mir.superclass;
+    classes[cName]["interfaces"] = mir.superinterfaces;
+    classes[cName]["abstract"]   = mir.isAbstract;
+    
+    String comment = _getComment(mir);
+    classes[cName]["comment"] = comment != null ? comment.trim() : null;
+
+  });
+  libMap[libraryName]["classes"] = classes;
+  return getYamlString(libMap);
+}
+
+/**
+ * Returns any documentation comments associated with a mirror.
+ */
+// TODO(tmandel): Handle reference links in comments.
+String _getComment(DeclarationMirror mirror) {
+  String commentText;
+  mirror.metadata.forEach( (metadata) {
+    if (metadata is CommentInstanceMirror) {
+      CommentInstanceMirror comment = metadata;
+      if (comment.isDocComment) {
+        if (commentText == null) {
+          commentText = comment.trimmedText;
+        } else {
+          commentText = "$commentText ${comment.trimmedText}";
+        }
+      } 
+    }
+  });
+  return commentText;
+}
+  
+/**
+ * Populates an input Map with characteristics of variables.
+ */
+void _getVariables(Map data, Map<String, VariableMirror> mirrorMap) {
+  mirrorMap.forEach( (String name, VariableMirror mirror) {
+    data[name] = new Map();
+    data[name]["final"] = mirror.isFinal.toString();
+    data[name]["static"] = mirror.isStatic.toString();
+    data[name]["type"] = mirror.type.toString();
+    
+    String comment = _getComment(mirror);
+    data[name]["comment"] = comment != null ? comment.trim() : null;  
+  });
+}
+
+/**
+ * Populates an input Map with characteristics of methods.
+ */
+void _getMethods(Map data, Map<String, MethodMirror> mirrorMap) {
+  mirrorMap.forEach( (String mirrorName, MethodMirror mirror) {
+    String category = mirror.isSetter ? "setters" : 
+        mirror.isGetter ? "getters" :
+        mirror.isConstructor ? "constructors" : 
+        mirror.isTopLevel ? "functions" : "methods";
+    
+    if (data[category] == null) {
+      data[category] = new Map();
+    }
+    data[category][mirrorName] = new Map();
+    data[category][mirrorName]["operator"] = mirror.isOperator;
+    data[category][mirrorName]["static"] = mirror.isStatic;
+    data[category][mirrorName]["rtype"] = mirror.returnType;
+    data[category][mirrorName]["parameters"] = new Map();
+    List parameters = mirror.parameters;
+    parameters.forEach( (ParameterMirror param) {
+      String pName = param.simpleName;
+      data[category][mirrorName]
+        ["parameters"][pName] = new Map();
+      data[category][mirrorName]
+        ["parameters"][pName]["optional"] = param.isOptional;
+      data[category][mirrorName]
+        ["parameters"][pName]["default"] = param.defaultValue;
+      data[category][mirrorName]
+        ["parameters"][pName]["type"] = param.type.toString();
+    });  
+    String comment = _getComment(mirror);
+    data[category][mirrorName]["comment"] = 
+        comment != null ? comment.trim() : null;
+  });
+}
+
+/**
+ * Writes documentation for a library to a file.
+ */
+//TODO(tmandel): Use flags to put files in specific directory if supported.
+void _writeToFile(String text, String filename) {
+  File file = new File(filename);
+  if (!file.exists()) {
+    file.createSync();
+  }
+  file.openSync();
+  file.writeAsString(text);
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/docgen/examples/test.dart b/sdk/lib/_internal/docgen/examples/test.dart
new file mode 100755
index 0000000..026663e
--- /dev/null
+++ b/sdk/lib/_internal/docgen/examples/test.dart
@@ -0,0 +1,52 @@
+/**
+ * This library is used solely for testing during development and is not
+ * intended to be run by the testing machines.
+ */
+// TODO(tmandel): Remove this file once docgen is ready for more clear tests.
+library DummyLibrary;
+
+import 'dart:json';
+
+/// Doc comment for top-level variable.
+int _variable1 = 0;
+
+void set variable1(int abc) => _variable1 = abc;
+
+abstract class B {
+
+}
+
+/**
+ * Doc comment for class A.
+ */
+/*
+ * Normal comment for class A.
+ */
+class A implements B {
+
+  int _someNumber;
+
+  A() {
+    _someNumber = 12;
+  }
+
+  int get someNumber => _someNumber;
+
+  void doThis(int a) {
+    print(a);
+  }
+
+  int multi(int a) {
+    return a * _someNumber;
+  } 
+
+}
+
+main() {
+  A a = new A();
+  print(a.someNumber);
+}
+
+A getA(int testInt, [String testString="default"]) {
+  return new A();
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/docgen/lib/dart2yaml.dart b/sdk/lib/_internal/docgen/lib/dart2yaml.dart
new file mode 100644
index 0000000..a8be283
--- /dev/null
+++ b/sdk/lib/_internal/docgen/lib/dart2yaml.dart
@@ -0,0 +1,66 @@
+/**
+ * This library is used to convert data from a map to a YAML string.
+ */
+library dart2yaml;
+
+/**
+ * Gets a String representing the input Map in YAML format.
+ */
+String getYamlString(Map documentData) {
+  StringBuffer yaml = new StringBuffer();
+  _addLevel(yaml, documentData, 0);
+  return yaml.toString();
+}
+
+/**
+ * This recursive function adds to its input StringBuffer and builds
+ * a YAML string from the input Map.
+ */
+// TODO(tmandel): Fix quotes with String objects.
+void _addLevel(StringBuffer yaml, Map documentData, int level) {
+  documentData.keys.forEach( (key) {
+    _calcSpaces(level, yaml);
+    yaml.write("\"$key\" : ");
+
+    if (documentData[key] is Map) {
+      yaml.write("\n");
+      _addLevel(yaml, documentData[key], level + 1);
+
+    } else if (documentData[key] is List) {
+      var elements = documentData[key];
+      yaml.write("\n");
+      elements.forEach( (element) {
+        if (element is Map) {
+          _addLevel(yaml, element, level + 1);
+        } else {
+          _calcSpaces(level + 1, yaml);
+          yaml.write("- ${_processElement(element)}");
+        }
+      });
+      
+    } else {
+      yaml.write(_processElement(documentData[key]));
+    }
+  });
+}
+
+/**
+ * Writes to a StringBuffer the correct output for the inputted element.
+ */
+String _processElement(var element) {
+  if (element.toString().contains("\"")) {
+    return "$element\n";
+  } else {
+    return "\"$element\"\n";
+  }
+}
+
+/**
+ * Based on the depth in the file, this function returns the correct spacing
+ * for an element in the YAML output.
+ */
+void _calcSpaces(int spaceLevel, StringBuffer yaml) {
+  for (int i = 0; i < spaceLevel; i++) {
+    yaml.write("  ");
+  }
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/docgen/lib/src/dart2js_mirrors.dart b/sdk/lib/_internal/docgen/lib/src/dart2js_mirrors.dart
new file mode 100644
index 0000000..1885363
--- /dev/null
+++ b/sdk/lib/_internal/docgen/lib/src/dart2js_mirrors.dart
@@ -0,0 +1,77 @@
+// 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.
+
+library dart2js_util;
+
+// TODO(tmandel): This is a temporary copy of the dart2js_mirrors.dart
+//   file in the dartdoc folder. One of the two should be deleted
+//   when docgen can replace dartdoc.
+
+import 'dart:async' show Future;
+import 'dart:io' show Path;
+
+import '../../../compiler/compiler.dart' as api;
+import '../../../compiler/implementation/mirrors/dart2js_mirror.dart' as dart2js
+    show analyze, Dart2JsMirrorSystem;
+import '../../../compiler/implementation/mirrors/mirrors.dart'
+    show MirrorSystem;
+import '../../../compiler/implementation/source_file_provider.dart'
+    show FormattingDiagnosticHandler, SourceFileProvider;
+import '../../../compiler/implementation/filenames.dart'
+    show appendSlash, currentDirectory;
+
+// TODO(johnniwinther): Support client configurable providers.
+
+/**
+ * Returns a future that completes to a non-null String when [script]
+ * has been successfully compiled.
+ */
+// TODO(amouravski): Remove this method and call dart2js via a process instead.
+Future<String> compile(Path script,
+                       Path libraryRoot,
+                       {Path packageRoot,
+                        List<String> options: const <String>[],
+                        api.DiagnosticHandler diagnosticHandler}) {
+  SourceFileProvider provider = new SourceFileProvider();
+  if (diagnosticHandler == null) {
+    diagnosticHandler =
+        new FormattingDiagnosticHandler(provider).diagnosticHandler;
+  }
+  Uri scriptUri = currentDirectory.resolve(script.toString());
+  Uri libraryUri = currentDirectory.resolve(appendSlash('$libraryRoot'));
+  Uri packageUri = null;
+  if (packageRoot != null) {
+    packageUri = currentDirectory.resolve(appendSlash('$packageRoot'));
+  }
+  return api.compile(scriptUri, libraryUri, packageUri,
+      provider.readStringFromUri, diagnosticHandler, options);
+}
+
+/**
+ * Analyzes set of libraries and provides a mirror system which can be used for
+ * static inspection of the source code.
+ */
+Future<MirrorSystem> analyze(List<Path> libraries,
+                             Path libraryRoot,
+                             {Path packageRoot,
+                              List<String> options: const <String>[],
+                              api.DiagnosticHandler diagnosticHandler}) {
+  SourceFileProvider provider = new SourceFileProvider();
+  if (diagnosticHandler == null) {
+    diagnosticHandler =
+        new FormattingDiagnosticHandler(provider).diagnosticHandler;
+  }
+  Uri libraryUri = currentDirectory.resolve(appendSlash('$libraryRoot'));
+  Uri packageUri = null;
+  if (packageRoot != null) {
+    packageUri = currentDirectory.resolve(appendSlash('$packageRoot'));
+  }
+  List<Uri> librariesUri = <Uri>[];
+  for (Path library in libraries) {
+    librariesUri.add(currentDirectory.resolve(library.toString()));
+  }
+  return dart2js.analyze(librariesUri, libraryUri, packageUri,
+                         provider.readStringFromUri, diagnosticHandler,
+                         options);
+}
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index abc2468..73bf471 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -173,8 +173,8 @@
   /// Returns the appropriate exit code for [exception], falling back on 1 if no
   /// appropriate exit code could be found.
   int _chooseExitCode(exception) {
-    if (exception is HttpException || exception is HttpParserException ||
-        exception is SocketIOException || exception is PubHttpException) {
+    if (exception is HttpException || exception is HttpException ||
+        exception is SocketException || exception is PubHttpException) {
       return exit_codes.UNAVAILABLE;
     } else if (exception is FormatException) {
       return exit_codes.DATA;
diff --git a/sdk/lib/_internal/pub/lib/src/hosted_source.dart b/sdk/lib/_internal/pub/lib/src/hosted_source.dart
index beabfd1..6967aa6 100644
--- a/sdk/lib/_internal/pub/lib/src/hosted_source.dart
+++ b/sdk/lib/_internal/pub/lib/src/hosted_source.dart
@@ -156,7 +156,7 @@
       fail('Timed out trying to find package "$package" at $url.');
     }
 
-    if (error is io.SocketIOException) {
+    if (error is io.SocketException) {
       fail('Got socket error trying to find package "$package" at $url.\n'
           '${error.osError}');
     }
diff --git a/sdk/lib/_internal/pub/lib/src/http.dart b/sdk/lib/_internal/pub/lib/src/http.dart
index e7da34c..b23dfd0 100644
--- a/sdk/lib/_internal/pub/lib/src/http.dart
+++ b/sdk/lib/_internal/pub/lib/src/http.dart
@@ -86,7 +86,7 @@
         throw new PubHttpException(response);
       });
     }).catchError((error) {
-      if (error is SocketIOException &&
+      if (error is SocketException &&
           error.osError != null) {
         if (error.osError.errorCode == 8 ||
             error.osError.errorCode == -2 ||
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index e9d803b..8b6c7fd 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -217,7 +217,7 @@
 
   try {
     createDir(dirPath);
-  } on DirectoryIOException catch (ex) {
+  } on DirectoryException catch (ex) {
     // Error 17 means the directory already exists (or 183 on Windows).
     if (ex.osError.errorCode == 17 || ex.osError.errorCode == 183) {
       log.fine("Got 'already exists' error when creating directory.");
diff --git a/sdk/lib/_internal/pub/lib/src/safe_http_server.dart b/sdk/lib/_internal/pub/lib/src/safe_http_server.dart
index a580770b..0f3b9f1 100644
--- a/sdk/lib/_internal/pub/lib/src/safe_http_server.dart
+++ b/sdk/lib/_internal/pub/lib/src/safe_http_server.dart
@@ -50,9 +50,9 @@
       // Ignore socket error 104, which is caused by a request being cancelled
       // before it writes any headers. There's no reason to care about such
       // requests.
-      if (error is SocketIOException && error.osError.errorCode == 104) return;
+      if (error is SocketException && error.osError.errorCode == 104) return;
       // Ignore any parsing errors, which come from malformed requests.
-      if (error is HttpParserException) return;
+      if (error is HttpException) return;
       // Manually handle cancelOnError so the above (ignored) errors don't
       // cause unsubscription.
       if (cancelOnError) subscription.cancel();
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index aceec1c..c67ce57 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -298,7 +298,7 @@
 /// parameters if a name conflict occurs.
 Uri addQueryParameters(Uri url, Map<String, String> parameters) {
   var queryMap = queryToMap(url.query);
-  mapAddAll(queryMap, parameters);
+  queryMap.addAll(parameters);
   return url.resolve("?${mapToQuery(queryMap)}");
 }
 
@@ -342,11 +342,6 @@
   return uri;
 }
 
-/// Add all key/value pairs from [source] to [destination], overwriting any
-/// pre-existing values.
-void mapAddAll(Map destination, Map source) =>
-  source.forEach((key, value) => destination[key] = value);
-
 /// Decodes a URL-encoded string. Unlike [Uri.decodeComponent], this includes
 /// replacing `+` with ` `.
 String urlDecode(String encoded) =>
@@ -534,14 +529,14 @@
 bool isUserFacingException(error) {
   return error is ApplicationException ||
     // TODO(nweiz): clean up this branch when issue 9955 is fixed.
-    error is DirectoryIOException ||
-    error is FileIOException ||
+    error is DirectoryException ||
+    error is FileException ||
     error is HttpException ||
-    error is HttpParserException ||
-    error is LinkIOException ||
+    error is HttpException ||
+    error is LinkException ||
     error is MimeMultipartException ||
     error is OSError ||
     error is ProcessException ||
-    error is SocketIOException ||
+    error is SocketException ||
     error is WebSocketException;
 }
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index 00fafbc..7d8c4fb 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -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.
 
-test/pub_uploader_test: Pass, Fail # Issue 9357
-test/oauth2/with_server_rejected_credentials_authenticates_again_test: Pass, Fail # Issue 9839.
-
 # Pub only runs on the VM, so just rule out all compilers.
 [ $compiler == dart2js || $compiler == dart2dart ]
 *: Skip
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
index 6457091..f670fe1 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
@@ -41,9 +41,7 @@
     // TODO(rnystrom): The confirm line is run together with this one because
     // in normal usage, the user will have entered a newline on stdin which
     // gets echoed to the terminal. Do something better here?
-    expect(pub.nextLine(), completion(equals(
-        'Looks great! Are you ready to upload your package (y/n)? '
-        'Pub needs your authorization to upload packages on your behalf.')));
+    expect(pub.nextLine(), completion(equals('Uploading...')));
     pub.kill();
   });
 }
diff --git a/sdk/lib/_internal/pub/test/pub_uploader_test.dart b/sdk/lib/_internal/pub/test/pub_uploader_test.dart
index 741abf0..b52a5e3 100644
--- a/sdk/lib/_internal/pub/test/pub_uploader_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_uploader_test.dart
@@ -17,15 +17,16 @@
 import 'test_pub.dart';
 
 final USAGE_STRING = '''
-    Manage uploaders for a package on pub.dartlang.org.
+Manage uploaders for a package on pub.dartlang.org.
 
-    Usage: pub uploader [options] {add/remove} <email>
-    --server     The package server on which the package is hosted
+Usage: pub uploader [options] {add/remove} <email>
+-h, --help       Print usage information for this command.
+    --server     The package server on which the package is hosted.
                  (defaults to "https://pub.dartlang.org")
 
-    --package    The package whose uploaders will be modified
+    --package    The package whose uploaders will be modified.
                  (defaults to the current package)
-    ''';
+''';
 
 ScheduledProcess startPubUploader(ScheduledServer server, List<String> args) {
   var tokenEndpoint = server.url.then((url) =>
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index 0414397..4700896 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -675,7 +675,7 @@
   };
 
   if (full) {
-    mapAddAll(map, {
+    map.addAll({
       'downloads': 0,
       'created': '2012-09-25T18:38:28.685260',
       'libraries': ['$name.dart'],
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index 3086f7d..47c51ec 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -86,35 +86,67 @@
 }
 
 class _FutureImpl<T> implements Future<T> {
+  // State of the future. The state determines the interpretation of the
+  // [resultOrListeners] field.
+  // TODO(lrn): rename field since it can also contain a chained future.
+
+  /// Initial state, waiting for a result. In this state, the
+  /// [resultOrListeners] field holds a single-linked list of
+  /// [FutureListener] listeners.
   static const int _INCOMPLETE = 0;
-  static const int _VALUE = 1;
-  static const int _ERROR = 2;
-  static const int _UNHANDLED_ERROR = 4;
+  /// The future has been chained to another future. The result of that
+  /// other future becomes the result of this future as well.
+  /// In this state, the [resultOrListeners] field holds the future that
+  /// will give the result to this future. Both existing and new listeners are
+  /// forwarded directly to the other future.
+  static const int _CHAINED = 1;
+  /// The future has been chained to another future, but there hasn't been
+  /// any listeners added to this future yet. If it is completed with an
+  /// error, the error will be considered unhandled.
+  static const int _CHAINED_UNLISTENED = 3;
+  /// The future has been completed with a value result.
+  static const int _VALUE = 4;
+  /// The future has been completed with an error result.
+  static const int _ERROR = 6;
+  /// Extra bit set when the future has been completed with an error result.
+  /// but no listener has been scheduled to receive the error.
+  /// If the bit is still set when a [runAsync] call triggers, the error will
+  /// be reported to the top-level handler.
+  /// Assigning a listener before that time will clear the bit.
+  static const int _UNHANDLED_ERROR = 8;
 
   /** Whether the future is complete, and as what. */
   int _state = _INCOMPLETE;
 
-  bool get _isComplete => _state != _INCOMPLETE;
+  bool get _isChained => (_state & _CHAINED) != 0;
+  bool get _hasChainedListener => _state == _CHAINED;
+  bool get _isComplete => _state >= _VALUE;
   bool get _hasValue => _state == _VALUE;
-  bool get _hasError => (_state & _ERROR) != 0;
-  bool get _hasUnhandledError => (_state & _UNHANDLED_ERROR) != 0;
+  bool get _hasError => _state >= _ERROR;
+  bool get _hasUnhandledError => _state >= _UNHANDLED_ERROR;
 
   void _clearUnhandledError() {
-    // Works because _UNHANDLED_ERROR is highest bit in use.
     _state &= ~_UNHANDLED_ERROR;
   }
 
   /**
-   * Either the result, or a list of listeners until the future completes.
+   * Either the result, a list of listeners or another future.
    *
    * The result of the future is either a value or an error.
    * A result is only stored when the future has completed.
    *
    * The listeners is an internally linked list of [_FutureListener]s.
-   * Listeners are only remembered while the future is not yet complete.
+   * Listeners are only remembered while the future is not yet complete,
+   * and it is not chained to another future.
    *
-   * Since the result and the listeners cannot occur at the same time,
-   * we can use the same field for both.
+   * The future is another future that his future is chained to. This future
+   * is waiting for the other future to complete, and when it does, this future
+   * will complete with the same result.
+   * All listeners are forwarded to the other future.
+   *
+   * The cases are disjoint (incomplete and unchained, incomplete and
+   * chained, or completed with value or error), so the field only needs to hold
+   * one value at a time.
    */
   var _resultOrListeners;
 
@@ -185,7 +217,7 @@
 
   void _setValue(T value) {
     if (_isComplete) throw new StateError("Future already completed");
-    _FutureListener listeners = _removeListeners();
+    _FutureListener listeners = _isChained ? null : _removeListeners();
     _state = _VALUE;
     _resultOrListeners = value;
     while (listeners != null) {
@@ -198,29 +230,42 @@
 
   void _setError(error) {
     if (_isComplete) throw new StateError("Future already completed");
-    _FutureListener listeners = _removeListeners();
+
+    _FutureListener listeners;
+    bool hasListeners;
+    if (_isChained) {
+      listeners = null;
+      hasListeners = (_state == _CHAINED);  // and not _CHAINED_UNLISTENED.
+    } else {
+      listeners = _removeListeners();
+      hasListeners = (listeners != null);
+    }
+
     _state = _ERROR;
     _resultOrListeners = error;
-    if (listeners == null) {
+
+    if (!hasListeners) {
       _scheduleUnhandledError();
       return;
     }
-    do {
+    while (listeners != null) {
       _FutureListener listener = listeners;
       listeners = listener._nextListener;
       listener._nextListener = null;
       listener._sendError(error);
-    } while (listeners != null);
+    }
   }
 
   void _scheduleUnhandledError() {
-    _state |= _UNHANDLED_ERROR;
+    assert(_state == _ERROR);
+    _state = _ERROR | _UNHANDLED_ERROR;
     // Wait for the rest of the current event's duration to see
     // if a subscriber is added to handle the error.
     runAsync(() {
       if (_hasUnhandledError) {
         // No error handler has been added since the error was set.
         _clearUnhandledError();
+        // TODO(floitsch): Hook this into unhandled error handling.
         var error = _resultOrListeners;
         print("Uncaught Error: ${error}");
         var trace = getAttachedStackTrace(error);
@@ -233,6 +278,12 @@
   }
 
   void _addListener(_FutureListener listener) {
+    if (_isChained) {
+      _state = _CHAINED;  // In case it was _CHAINED_UNLISTENED.
+      _FutureImpl resultSource = _chainSource;
+      resultSource._addListener(listener);
+      return;
+    }
     if (_isComplete) {
       _clearUnhandledError();
       // Handle late listeners asynchronously.
@@ -278,7 +329,7 @@
    */
   void _chain(_FutureImpl future) {
     if (!_isComplete) {
-      _addListener(future._asListener());
+      future._chainFromFuture(this);
     } else if (_hasValue) {
       future._setValue(_resultOrListeners);
     } else {
@@ -289,12 +340,67 @@
   }
 
   /**
+   * Returns the future that this future is chained to.
+   *
+   * If that future is itself chained to something else,
+   * get the [_chainSource] of that future instead, and make this
+   * future chain directly to the earliest source.
+   */
+  _FutureImpl get _chainSource {
+    assert(_isChained);
+    _FutureImpl future = _resultOrListeners;
+    if (future._isChained) {
+      future = _resultOrListeners = future._chainSource;
+    }
+    return future;
+  }
+
+  /**
+   * Make this incomplete future end up with the same result as [resultSource].
+   *
+   * This is done by moving all listeners to [resultSource] and forwarding all
+   * future [_addListener] calls to [resultSource] directly.
+   */
+  void _chainFromFuture(_FutureImpl resultSource) {
+    assert(!_isComplete);
+    assert(!_isChained);
+    if (resultSource._isChained) {
+      resultSource = resultSource._chainSource;
+    }
+    assert(!resultSource._isChained);
+    if (identical(this, resultSource)) {
+      // The only unchained future in a future dependency tree (as defined
+      // by the chain-relations) is the "root" that every other future depends
+      // on. The future we are adding is unchained, so if it is already in the
+      // tree, it must be the root, so that's the only one we need to check
+      // against to detect a cycle.
+      _setError(new StateError("Cyclic future dependency."));
+      return;
+    }
+    _FutureListener cursor = _removeListeners();
+    bool hadListeners = cursor != null;
+    while (cursor != null) {
+      _FutureListener listener = cursor;
+      cursor = cursor._nextListener;
+      listener._nextListener = null;
+      resultSource._addListener(listener);
+    }
+    // Listen with this future as well, so that when the other future completes,
+    // this future will be completed as well.
+    resultSource._addListener(this._asListener());
+    _resultOrListeners = resultSource;
+    _state = hadListeners ? _CHAINED : _CHAINED_UNLISTENED;
+  }
+
+  /**
    * Helper function to handle the result of transforming an incoming event.
    *
    * If the result is itself a [Future], this future is linked to that
    * future's output. If not, this future is completed with the result.
    */
   void _setOrChainValue(var result) {
+    assert(!_isChained);
+    assert(!_isComplete);
     if (result is Future) {
       // Result should be a Future<T>.
       if (result is _FutureImpl) {
diff --git a/sdk/lib/collection/splay_tree.dart b/sdk/lib/collection/splay_tree.dart
index b959a55..20cc84c 100644
--- a/sdk/lib/collection/splay_tree.dart
+++ b/sdk/lib/collection/splay_tree.dart
@@ -248,6 +248,9 @@
   SplayTreeMap([int compare(K key1, K key2)])
       : _comparator = (compare == null) ? Comparable.compare : compare;
 
+  factory SplayTreeMap.from(Map<K, V> other, [int compare(K key1, K key2)]) =>
+      new SplayTreeMap(compare)..addAll(other);
+
   int _compare(K key1, K key2) => _comparator(key1, key2);
 
   SplayTreeMap._internal();
@@ -307,9 +310,11 @@
     return value;
   }
 
+  void addAll(Map<K, V> other) {
+    other.forEach((K key, V value) { this[key] = value; });
+  }
+
   bool get isEmpty {
-    // assert(!((_root == null) && (_count != 0)));
-    // assert(!((_count == 0) && (_root != null)));
     return (_root == null);
   }
 
diff --git a/sdk/lib/core/map.dart b/sdk/lib/core/map.dart
index fe68fd8..4f67ea1 100644
--- a/sdk/lib/core/map.dart
+++ b/sdk/lib/core/map.dart
@@ -19,7 +19,6 @@
    */
   factory Map.from(Map<K, V> other) => new HashMap<K, V>.from(other);
 
-
   /**
    * Returns whether this map contains the given [value].
    */
@@ -54,6 +53,17 @@
   V putIfAbsent(K key, V ifAbsent());
 
   /**
+   * Adds all key-value pairs of [other] to this map.
+   *
+   * If a key of [other] is already in this map, its value is overwritten.
+   *
+   * The operation is equivalent to doing `this[key] = value` for each key
+   * and associated value in other. It iterates over [other], which must
+   * therefore not change during the iteration.
+   */
+  void addAll(Map<K, V> other);
+
+  /**
    * Removes the association for the given [key]. Returns the value for
    * [key] in the map or null if [key] is not in the map. Note that values
    * can be null and a returned null value does not always imply that the
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 703977e..1022653 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -65,7 +65,8 @@
   return JS('var', r'ReceivePortSync.dispatchCall(#, #)', id, message);
 }
 
-spawnDomFunction(Function f) => IsolateNatives.spawnDomFunction(f);
+Future<SendPort> spawnDomFunction(Function f) =>
+  new Future.value(IsolateNatives.spawnDomFunction(f));
 // 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.
@@ -1928,12 +1929,11 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://www.w3.org/TR/filter-effects/
 class CssFilterRule extends CssRule native "WebKitCSSFilterRule" {
 
   @DomName('WebKitCSSFilterRule.style')
   @DocsEditable
-  @Experimental // untriaged
   final CssStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1946,77 +1946,64 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 class CssFilterValue extends _CssValueList native "WebKitCSSFilterValue" {
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_BLUR')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_BLUR = 10;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_BRIGHTNESS')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_BRIGHTNESS = 8;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_CONTRAST')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_CONTRAST = 9;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_CUSTOM')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_CUSTOM = 12;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_DROP_SHADOW')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_DROP_SHADOW = 11;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_GRAYSCALE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_GRAYSCALE = 2;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_HUE_ROTATE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_HUE_ROTATE = 5;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_INVERT')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_INVERT = 6;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_OPACITY')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_OPACITY = 7;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_REFERENCE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_REFERENCE = 1;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_SATURATE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_SATURATE = 4;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_SEPIA')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_SEPIA = 3;
 
   @DomName('WebKitCSSFilterValue.operationType')
   @DocsEditable
-  @Experimental // untriaged
   final int operationType;
 
   @DomName('WebKitCSSFilterValue.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   _CSSValue __getter__(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2108,17 +2095,15 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://www.w3.org/TR/css3-animations/#CSSKeyframeRule-interface
 class CssKeyframeRule extends CssRule native "WebKitCSSKeyframeRule" {
 
   @DomName('WebKitCSSKeyframeRule.keyText')
   @DocsEditable
-  @Experimental // untriaged
   String keyText;
 
   @DomName('WebKitCSSKeyframeRule.style')
   @DocsEditable
-  @Experimental // untriaged
   final CssStyleDeclaration style;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2131,39 +2116,33 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://www.w3.org/TR/css3-animations/#csskeyframesrule
 class CssKeyframesRule extends CssRule native "WebKitCSSKeyframesRule" {
 
   @DomName('WebKitCSSKeyframesRule.cssRules')
   @DocsEditable
-  @Experimental // untriaged
   @Returns('_CssRuleList')
   @Creates('_CssRuleList')
   final List<CssRule> cssRules;
 
   @DomName('WebKitCSSKeyframesRule.name')
   @DocsEditable
-  @Experimental // untriaged
   String name;
 
   @DomName('WebKitCSSKeyframesRule.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   CssKeyframeRule __getter__(int index) native;
 
   @DomName('WebKitCSSKeyframesRule.deleteRule')
   @DocsEditable
-  @Experimental // untriaged
   void deleteRule(String key) native;
 
   @DomName('WebKitCSSKeyframesRule.findRule')
   @DocsEditable
-  @Experimental // untriaged
   CssKeyframeRule findRule(String key) native;
 
   @DomName('WebKitCSSKeyframesRule.insertRule')
   @DocsEditable
-  @Experimental // untriaged
   void insertRule(String rule) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2179,7 +2158,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 class CssMatrix native "WebKitCSSMatrix" {
 
   @DomName('WebKitCSSMatrix.CSSMatrix')
@@ -2195,162 +2175,130 @@
 
   @DomName('WebKitCSSMatrix.a')
   @DocsEditable
-  @Experimental // untriaged
   num a;
 
   @DomName('WebKitCSSMatrix.b')
   @DocsEditable
-  @Experimental // untriaged
   num b;
 
   @DomName('WebKitCSSMatrix.c')
   @DocsEditable
-  @Experimental // untriaged
   num c;
 
   @DomName('WebKitCSSMatrix.d')
   @DocsEditable
-  @Experimental // untriaged
   num d;
 
   @DomName('WebKitCSSMatrix.e')
   @DocsEditable
-  @Experimental // untriaged
   num e;
 
   @DomName('WebKitCSSMatrix.f')
   @DocsEditable
-  @Experimental // untriaged
   num f;
 
   @DomName('WebKitCSSMatrix.m11')
   @DocsEditable
-  @Experimental // untriaged
   num m11;
 
   @DomName('WebKitCSSMatrix.m12')
   @DocsEditable
-  @Experimental // untriaged
   num m12;
 
   @DomName('WebKitCSSMatrix.m13')
   @DocsEditable
-  @Experimental // untriaged
   num m13;
 
   @DomName('WebKitCSSMatrix.m14')
   @DocsEditable
-  @Experimental // untriaged
   num m14;
 
   @DomName('WebKitCSSMatrix.m21')
   @DocsEditable
-  @Experimental // untriaged
   num m21;
 
   @DomName('WebKitCSSMatrix.m22')
   @DocsEditable
-  @Experimental // untriaged
   num m22;
 
   @DomName('WebKitCSSMatrix.m23')
   @DocsEditable
-  @Experimental // untriaged
   num m23;
 
   @DomName('WebKitCSSMatrix.m24')
   @DocsEditable
-  @Experimental // untriaged
   num m24;
 
   @DomName('WebKitCSSMatrix.m31')
   @DocsEditable
-  @Experimental // untriaged
   num m31;
 
   @DomName('WebKitCSSMatrix.m32')
   @DocsEditable
-  @Experimental // untriaged
   num m32;
 
   @DomName('WebKitCSSMatrix.m33')
   @DocsEditable
-  @Experimental // untriaged
   num m33;
 
   @DomName('WebKitCSSMatrix.m34')
   @DocsEditable
-  @Experimental // untriaged
   num m34;
 
   @DomName('WebKitCSSMatrix.m41')
   @DocsEditable
-  @Experimental // untriaged
   num m41;
 
   @DomName('WebKitCSSMatrix.m42')
   @DocsEditable
-  @Experimental // untriaged
   num m42;
 
   @DomName('WebKitCSSMatrix.m43')
   @DocsEditable
-  @Experimental // untriaged
   num m43;
 
   @DomName('WebKitCSSMatrix.m44')
   @DocsEditable
-  @Experimental // untriaged
   num m44;
 
   @DomName('WebKitCSSMatrix.inverse')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix inverse() native;
 
   @DomName('WebKitCSSMatrix.multiply')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix multiply(CssMatrix secondMatrix) native;
 
   @DomName('WebKitCSSMatrix.rotate')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix rotate(num rotX, num rotY, num rotZ) native;
 
   @DomName('WebKitCSSMatrix.rotateAxisAngle')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix rotateAxisAngle(num x, num y, num z, num angle) native;
 
   @DomName('WebKitCSSMatrix.scale')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix scale(num scaleX, num scaleY, num scaleZ) native;
 
   @DomName('WebKitCSSMatrix.setMatrixValue')
   @DocsEditable
-  @Experimental // untriaged
   void setMatrixValue(String string) native;
 
   @DomName('WebKitCSSMatrix.skewX')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix skewX(num angle) native;
 
   @DomName('WebKitCSSMatrix.skewY')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix skewY(num angle) native;
 
   @DomName('WebKitCSSMatrix.toString')
   @DocsEditable
-  @Experimental // untriaged
   String toString() native;
 
   @DomName('WebKitCSSMatrix.translate')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix translate(num x, num y, num z) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2390,7 +2338,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 class CssMixFunctionValue extends _CssValueList native "WebKitCSSMixFunctionValue" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2420,12 +2369,11 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://dev.w3.org/csswg/css-regions/#region-style-rule-interface
 class CssRegionRule extends CssRule native "WebKitCSSRegionRule" {
 
   @DomName('WebKitCSSRegionRule.cssRules')
   @DocsEditable
-  @Experimental // untriaged
   @Returns('_CssRuleList')
   @Creates('_CssRuleList')
   final List<CssRule> cssRules;
@@ -2549,7 +2497,6 @@
 
   @DomName('CSSStyleDeclaration.__setter__')
   @DocsEditable
-  @Experimental // untriaged
   void __setter__(String propertyName, String propertyValue) native;
 
   @DomName('CSSStyleDeclaration.getPropertyPriority')
@@ -5858,122 +5805,100 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 class CssTransformValue extends _CssValueList native "WebKitCSSTransformValue" {
 
   @DomName('WebKitCSSTransformValue.CSS_MATRIX')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_MATRIX = 11;
 
   @DomName('WebKitCSSTransformValue.CSS_MATRIX3D')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_MATRIX3D = 21;
 
   @DomName('WebKitCSSTransformValue.CSS_PERSPECTIVE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_PERSPECTIVE = 20;
 
   @DomName('WebKitCSSTransformValue.CSS_ROTATE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_ROTATE = 4;
 
   @DomName('WebKitCSSTransformValue.CSS_ROTATE3D')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_ROTATE3D = 17;
 
   @DomName('WebKitCSSTransformValue.CSS_ROTATEX')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_ROTATEX = 14;
 
   @DomName('WebKitCSSTransformValue.CSS_ROTATEY')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_ROTATEY = 15;
 
   @DomName('WebKitCSSTransformValue.CSS_ROTATEZ')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_ROTATEZ = 16;
 
   @DomName('WebKitCSSTransformValue.CSS_SCALE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SCALE = 5;
 
   @DomName('WebKitCSSTransformValue.CSS_SCALE3D')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SCALE3D = 19;
 
   @DomName('WebKitCSSTransformValue.CSS_SCALEX')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SCALEX = 6;
 
   @DomName('WebKitCSSTransformValue.CSS_SCALEY')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SCALEY = 7;
 
   @DomName('WebKitCSSTransformValue.CSS_SCALEZ')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SCALEZ = 18;
 
   @DomName('WebKitCSSTransformValue.CSS_SKEW')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SKEW = 8;
 
   @DomName('WebKitCSSTransformValue.CSS_SKEWX')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SKEWX = 9;
 
   @DomName('WebKitCSSTransformValue.CSS_SKEWY')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SKEWY = 10;
 
   @DomName('WebKitCSSTransformValue.CSS_TRANSLATE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_TRANSLATE = 1;
 
   @DomName('WebKitCSSTransformValue.CSS_TRANSLATE3D')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_TRANSLATE3D = 13;
 
   @DomName('WebKitCSSTransformValue.CSS_TRANSLATEX')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_TRANSLATEX = 2;
 
   @DomName('WebKitCSSTransformValue.CSS_TRANSLATEY')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_TRANSLATEY = 3;
 
   @DomName('WebKitCSSTransformValue.CSS_TRANSLATEZ')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_TRANSLATEZ = 12;
 
   @DomName('WebKitCSSTransformValue.operationType')
   @DocsEditable
-  @Experimental // untriaged
   final int operationType;
 
   @DomName('WebKitCSSTransformValue.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   _CSSValue __getter__(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6018,6 +5943,7 @@
 
   @DomName('CustomEvent.detail')
   @DocsEditable
+  @Creates('Null')
   final Object detail;
 
   @JSName('initCustomEvent')
@@ -7553,7 +7479,6 @@
 
   @DomName('DOMSettableTokenList.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   String __getter__(int index) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8076,8 +8001,7 @@
   Rect get offset => new Rect(offsetLeft, offsetTop, offsetWidth, offsetHeight);
 
   /**
-   * Adds the specified text as a text node after the last child of this
-   * element.
+   * Adds the specified text after the last child of this element.
    */
   void appendText(String text) {
     this.insertAdjacentText('beforeend', text);
@@ -8211,7 +8135,7 @@
     return 'transitionend';
   }
   /**
-   * Creates a text node and inserts it into the DOM at the specified location.
+   * Inserts text into the DOM at the specified location.
    *
    * To see the possible values for [where], read the doc for
    * [insertAdjacentHtml].
@@ -9596,12 +9520,10 @@
 
   @DomName('HTMLEmbedElement.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   bool __getter__(index_OR_name) native;
 
   @DomName('HTMLEmbedElement.__setter__')
   @DocsEditable
-  @Experimental // untriaged
   void __setter__(index_OR_name, Node value) native;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10286,6 +10208,7 @@
   @JSName('lastModifiedDate')
   @DomName('File.lastModifiedDate')
   @DocsEditable
+  @Creates('Null')
   final dynamic _get_lastModifiedDate;
 
   @DomName('File.name')
@@ -10855,6 +10778,7 @@
   @JSName('relatedTarget')
   @DomName('FocusEvent.relatedTarget')
   @DocsEditable
+  @Creates('Null')
   final dynamic _get_relatedTarget;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -11046,7 +10970,6 @@
 
   @DomName('HTMLFormElement.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   Node __getter__(int index) native;
 
   @DomName('HTMLFormElement.checkValidity')
@@ -11467,7 +11390,6 @@
 
   @DomName('HTMLAllCollection.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   Node __getter__(int index) native;
 
   @DomName('HTMLAllCollection.item')
@@ -11543,7 +11465,6 @@
 
   @DomName('HTMLCollection.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   Node __getter__(String name) native;
 
   @DomName('HTMLCollection.item')
@@ -11741,7 +11662,6 @@
 
   @DomName('HTMLFormControlsCollection.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   Node __getter__(int index) native;
 
   @DomName('HTMLFormControlsCollection.namedItem')
@@ -12811,6 +12731,7 @@
   @JSName('valueAsDate')
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable
+  @Creates('Null')
   final dynamic _get_valueAsDate;
 
   void set valueAsDate(DateTime value) {
@@ -13750,7 +13671,8 @@
 
   @DomName('HTMLLinkElement.import')
   @DocsEditable
-  @Experimental // untriaged
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html#interface-import
+  @Experimental
   final DocumentFragment import;
 
   @DomName('HTMLLinkElement.media')
@@ -13837,11 +13759,6 @@
   @DocsEditable
   String toString() native;
 
-  @DomName('Location.valueOf')
-  @DocsEditable
-  @Experimental // nonstandard
-  Object valueOf() native;
-
 
   @DomName('Location.origin')
   String get origin {
@@ -14624,6 +14541,27 @@
 @Experimental
 class MediaKeySession extends EventTarget native "MediaKeySession" {
 
+  @DomName('MediaKeySession.webkitkeyaddedEvent')
+  @DocsEditable
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental
+  static const EventStreamProvider<MediaKeyEvent> keyAddedEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');
+
+  @DomName('MediaKeySession.webkitkeyerrorEvent')
+  @DocsEditable
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental
+  static const EventStreamProvider<MediaKeyEvent> keyErrorEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');
+
+  @DomName('MediaKeySession.webkitkeymessageEvent')
+  @DocsEditable
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental
+  static const EventStreamProvider<MediaKeyEvent> keyMessageEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeymessage');
+
   @DomName('MediaKeySession.error')
   @DocsEditable
   final MediaKeyError error;
@@ -14657,6 +14595,18 @@
   @DomName('MediaKeySession.update')
   @DocsEditable
   void update(Uint8List key) native;
+
+  @DomName('MediaKeySession.onwebkitkeyadded')
+  @DocsEditable
+  Stream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forTarget(this);
+
+  @DomName('MediaKeySession.onwebkitkeyerror')
+  @DocsEditable
+  Stream<MediaKeyEvent> get onKeyError => keyErrorEvent.forTarget(this);
+
+  @DomName('MediaKeySession.onwebkitkeymessage')
+  @DocsEditable
+  Stream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.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
@@ -15244,6 +15194,10 @@
 @DomName('HTMLMetaElement')
 class MetaElement extends Element native "HTMLMetaElement" {
 
+  @DomName('HTMLMetaElement.HTMLMetaElement')
+  @DocsEditable
+  factory MetaElement() => document.$dom_createElement("meta");
+
   @DomName('HTMLMetaElement.content')
   @DocsEditable
   String content;
@@ -15271,6 +15225,7 @@
   @JSName('modificationTime')
   @DomName('Metadata.modificationTime')
   @DocsEditable
+  @Creates('Null')
   final dynamic _get_modificationTime;
 
   @DomName('Metadata.size')
@@ -15346,35 +15301,47 @@
 
 @DocsEditable
 @DomName('MIDIAccess')
-@Experimental // untriaged
+// http://webaudio.github.io/web-midi-api/#midiaccess-interface
+@Experimental
 class MidiAccess extends EventTarget native "MIDIAccess" {
 
+  @DomName('MIDIAccess.connectEvent')
+  @DocsEditable
+  static const EventStreamProvider<MidiConnectionEvent> connectEvent = const EventStreamProvider<MidiConnectionEvent>('connect');
+
+  @DomName('MIDIAccess.disconnectEvent')
+  @DocsEditable
+  static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
+
   @JSName('addEventListener')
   @DomName('MIDIAccess.addEventListener')
   @DocsEditable
-  @Experimental // untriaged
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native;
 
   @DomName('MIDIAccess.dispatchEvent')
   @DocsEditable
-  @Experimental // untriaged
   bool dispatchEvent(Event event) native;
 
   @DomName('MIDIAccess.inputs')
   @DocsEditable
-  @Experimental // untriaged
   List<MidiInput> inputs() native;
 
   @DomName('MIDIAccess.outputs')
   @DocsEditable
-  @Experimental // untriaged
   List<MidiOutput> outputs() native;
 
   @JSName('removeEventListener')
   @DomName('MIDIAccess.removeEventListener')
   @DocsEditable
-  @Experimental // untriaged
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native;
+
+  @DomName('MIDIAccess.onconnect')
+  @DocsEditable
+  Stream<MidiConnectionEvent> get onConnect => connectEvent.forTarget(this);
+
+  @DomName('MIDIAccess.ondisconnect')
+  @DocsEditable
+  Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.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
@@ -15401,6 +15368,14 @@
 // http://webaudio.github.io/web-midi-api/#idl-def-MIDIInput
 @Experimental
 class MidiInput extends MidiPort implements EventTarget native "MIDIInput" {
+
+  @DomName('MIDIInput.midimessageEvent')
+  @DocsEditable
+  static const EventStreamProvider<MidiMessageEvent> midiMessageEvent = const EventStreamProvider<MidiMessageEvent>('midimessage');
+
+  @DomName('MIDIInput.onmidimessage')
+  @DocsEditable
+  Stream<MidiMessageEvent> get onMidiMessage => midiMessageEvent.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
@@ -15575,7 +15550,6 @@
 
   @DomName('MimeTypeArray.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   MimeType __getter__(String name) native;
 
   @DomName('MimeTypeArray.item')
@@ -16067,7 +16041,6 @@
 
   @DomName('WebKitNamedFlowCollection.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   NamedFlow __getter__(String name) native;
 
   @DomName('WebKitNamedFlowCollection.item')
@@ -16289,17 +16262,14 @@
 
   @DomName('NavigatorUserMediaError.constraintName')
   @DocsEditable
-  @Experimental // untriaged
   final String constraintName;
 
   @DomName('NavigatorUserMediaError.message')
   @DocsEditable
-  @Experimental // untriaged
   final String message;
 
   @DomName('NavigatorUserMediaError.name')
   @DocsEditable
-  @Experimental // untriaged
   final String name;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17248,12 +17218,10 @@
 
   @DomName('HTMLObjectElement.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   bool __getter__(index_OR_name) native;
 
   @DomName('HTMLObjectElement.__setter__')
   @DocsEditable
-  @Experimental // untriaged
   void __setter__(index_OR_name, Node value) native;
 
   @DomName('HTMLObjectElement.checkValidity')
@@ -17933,7 +17901,6 @@
 
   @DomName('Plugin.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   MimeType __getter__(String name) native;
 
   @DomName('Plugin.item')
@@ -18004,7 +17971,6 @@
 
   @DomName('PluginArray.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   Plugin __getter__(String name) native;
 
   @DomName('PluginArray.item')
@@ -18201,6 +18167,10 @@
 @DomName('HTMLQuoteElement')
 class QuoteElement extends Element native "HTMLQuoteElement" {
 
+  @DomName('HTMLQuoteElement.HTMLQuoteElement')
+  @DocsEditable
+  factory QuoteElement() => document.$dom_createElement("q");
+
   @DomName('HTMLQuoteElement.cite')
   @DocsEditable
   String cite;
@@ -18442,12 +18412,12 @@
 
 @DocsEditable
 @DomName('ResourceProgressEvent')
-@Experimental // untriaged
+// https://chromiumcodereview.appspot.com/14773025/
+@deprecated // experimental
 class ResourceProgressEvent extends ProgressEvent native "ResourceProgressEvent" {
 
   @DomName('ResourceProgressEvent.url')
   @DocsEditable
-  @Experimental // untriaged
   final String url;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19050,6 +19020,7 @@
   @JSName('timestamp')
   @DomName('RTCStatsReport.timestamp')
   @DocsEditable
+  @Creates('Null')
   final dynamic _get_timestamp;
 
   @DomName('RTCStatsReport.type')
@@ -19077,7 +19048,6 @@
 
   @DomName('RTCStatsResponse.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   RtcStatsReport __getter__(String name) native;
 
   @DomName('RTCStatsResponse.namedItem')
@@ -19398,7 +19368,6 @@
 
   @DomName('HTMLSelectElement.__setter__')
   @DocsEditable
-  @Experimental // untriaged
   void __setter__(int index, OptionElement value) native;
 
   @DomName('HTMLSelectElement.checkValidity')
@@ -19571,6 +19540,10 @@
 // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-element
 class ShadowElement extends Element native "HTMLShadowElement" {
 
+  @DomName('HTMLShadowElement.HTMLShadowElement')
+  @DocsEditable
+  factory ShadowElement() => document.$dom_createElement("shadow");
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => Element.isTagSupported('shadow');
 
@@ -20470,17 +20443,14 @@
 
   @DomName('Storage.__delete__')
   @DocsEditable
-  @Experimental // untriaged
   bool __delete__(index_OR_name) native;
 
   @DomName('Storage.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   String __getter__(index_OR_name) native;
 
   @DomName('Storage.__setter__')
   @DocsEditable
-  @Experimental // untriaged
   void __setter__(index_OR_name, String value) native;
 
   @JSName('clear')
@@ -22091,6 +22061,7 @@
 
   @DomName('TrackEvent.track')
   @DocsEditable
+  @Creates('Null')
   final Object track;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23466,7 +23437,6 @@
 
   @DomName('Window.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   WindowBase __getter__(index_OR_name) {
@@ -23481,14 +23451,12 @@
   @JSName('__getter__')
   @DomName('Window.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   ___getter___1(int index) native;
   @JSName('__getter__')
   @DomName('Window.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   @Creates('Window|=Object')
   @Returns('Window|=Object')
   ___getter___2(String name) native;
@@ -23638,6 +23606,7 @@
 
   @DomName('Window.showModalDialog')
   @DocsEditable
+  @Creates('Null')
   Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) native;
 
   @DomName('Window.stop')
@@ -24779,7 +24748,7 @@
 
 @DocsEditable
 @DomName('Entity')
-@Experimental // untriaged
+@deprecated // deprecated
 class _Entity extends Node native "Entity" {
 
   @DomName('Entity.notationName')
@@ -25172,7 +25141,6 @@
 
   @DomName('NamedNodeMap.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   Node __getter__(String name) native;
 
   @DomName('NamedNodeMap.getNamedItem')
@@ -25462,7 +25430,6 @@
 
   @DomName('StyleSheetList.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   CssStyleSheet __getter__(String name) native;
 
   @DomName('StyleSheetList.item')
@@ -25475,150 +25442,6 @@
 
 
 @DocsEditable
-@DomName('WebKitCSSFilterValue')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-abstract class _WebKitCSSFilterValue extends _CssValueList native "WebKitCSSFilterValue" {
-}
-// 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('WebKitCSSMatrix')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-abstract class _WebKitCSSMatrix native "WebKitCSSMatrix" {
-
-  @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
-  @DocsEditable
-  factory _WebKitCSSMatrix([String cssValue]) {
-    if (cssValue != null) {
-      return _WebKitCSSMatrix._create_1(cssValue);
-    }
-    return _WebKitCSSMatrix._create_2();
-  }
-  static _WebKitCSSMatrix _create_1(cssValue) => JS('_WebKitCSSMatrix', 'new WebKitCSSMatrix(#)', cssValue);
-  static _WebKitCSSMatrix _create_2() => JS('_WebKitCSSMatrix', 'new WebKitCSSMatrix()');
-}
-// 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('WebKitCSSMixFunctionValue')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-abstract class _WebKitCSSMixFunctionValue extends _CssValueList native "WebKitCSSMixFunctionValue" {
-}
-// 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('WebKitCSSTransformValue')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-abstract class _WebKitCSSTransformValue extends _CssValueList native "WebKitCSSTransformValue" {
-}
-// 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('WebKitCSSFilterRule')
-// http://www.w3.org/TR/filter-effects/
-@Experimental
-class _WebKitCssFilterRule extends CssRule native "WebKitCSSFilterRule" {
-
-  @DomName('WebKitCSSFilterRule.style')
-  @DocsEditable
-  final CssStyleDeclaration style;
-}
-// 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('WebKitCSSKeyframeRule')
-// http://www.w3.org/TR/css3-animations/#CSSKeyframeRule-interface
-@Experimental
-class _WebKitCssKeyframeRule extends CssRule native "WebKitCSSKeyframeRule" {
-
-  @DomName('WebKitCSSKeyframeRule.keyText')
-  @DocsEditable
-  String keyText;
-
-  @DomName('WebKitCSSKeyframeRule.style')
-  @DocsEditable
-  final CssStyleDeclaration style;
-}
-// 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('WebKitCSSKeyframesRule')
-// http://www.w3.org/TR/css3-animations/#csskeyframesrule
-@Experimental
-class _WebKitCssKeyframesRule extends CssRule native "WebKitCSSKeyframesRule" {
-
-  @DomName('WebKitCSSKeyframesRule.cssRules')
-  @DocsEditable
-  @Returns('_CssRuleList')
-  @Creates('_CssRuleList')
-  final List<CssRule> cssRules;
-
-  @DomName('WebKitCSSKeyframesRule.name')
-  @DocsEditable
-  String name;
-
-  @DomName('WebKitCSSKeyframesRule.__getter__')
-  @DocsEditable
-  @Experimental // untriaged
-  _WebKitCssKeyframeRule __getter__(int index) native;
-
-  @DomName('WebKitCSSKeyframesRule.deleteRule')
-  @DocsEditable
-  void deleteRule(String key) native;
-
-  @DomName('WebKitCSSKeyframesRule.findRule')
-  @DocsEditable
-  _WebKitCssKeyframeRule findRule(String key) native;
-
-  @DomName('WebKitCSSKeyframesRule.insertRule')
-  @DocsEditable
-  void insertRule(String rule) native;
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
-@DocsEditable
-@DomName('WebKitCSSRegionRule')
-// http://dev.w3.org/csswg/css-regions/#region-style-rule-interface
-@Experimental
-class _WebKitCssRegionRule extends CssRule native "WebKitCSSRegionRule" {
-
-  @DomName('WebKitCSSRegionRule.cssRules')
-  @DocsEditable
-  @Returns('_CssRuleList')
-  @Creates('_CssRuleList')
-  final List<CssRule> cssRules;
-}
-// 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
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 420dd93..8409fee 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -2332,13 +2332,12 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://www.w3.org/TR/filter-effects/
 class CssFilterRule extends CssRule {
   CssFilterRule.internal() : super.internal();
 
   @DomName('WebKitCSSFilterRule.style')
   @DocsEditable
-  @Experimental // untriaged
   CssStyleDeclaration get style native "CSSFilterRule_style_Getter";
 
 }
@@ -2354,78 +2353,65 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 class CssFilterValue extends _CssValueList {
   CssFilterValue.internal() : super.internal();
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_BLUR')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_BLUR = 10;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_BRIGHTNESS')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_BRIGHTNESS = 8;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_CONTRAST')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_CONTRAST = 9;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_CUSTOM')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_CUSTOM = 12;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_DROP_SHADOW')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_DROP_SHADOW = 11;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_GRAYSCALE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_GRAYSCALE = 2;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_HUE_ROTATE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_HUE_ROTATE = 5;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_INVERT')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_INVERT = 6;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_OPACITY')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_OPACITY = 7;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_REFERENCE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_REFERENCE = 1;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_SATURATE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_SATURATE = 4;
 
   @DomName('WebKitCSSFilterValue.CSS_FILTER_SEPIA')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_FILTER_SEPIA = 3;
 
   @DomName('WebKitCSSFilterValue.operationType')
   @DocsEditable
-  @Experimental // untriaged
   int get operationType native "CSSFilterValue_operationType_Getter";
 
   @DomName('WebKitCSSFilterValue.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   _CSSValue __getter__(int index) native "CSSFilterValue___getter___Callback";
 
 }
@@ -2534,23 +2520,20 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://www.w3.org/TR/css3-animations/#CSSKeyframeRule-interface
 class CssKeyframeRule extends CssRule {
   CssKeyframeRule.internal() : super.internal();
 
   @DomName('WebKitCSSKeyframeRule.keyText')
   @DocsEditable
-  @Experimental // untriaged
   String get keyText native "CSSKeyframeRule_keyText_Getter";
 
   @DomName('WebKitCSSKeyframeRule.keyText')
   @DocsEditable
-  @Experimental // untriaged
   void set keyText(String value) native "CSSKeyframeRule_keyText_Setter";
 
   @DomName('WebKitCSSKeyframeRule.style')
   @DocsEditable
-  @Experimental // untriaged
   CssStyleDeclaration get style native "CSSKeyframeRule_style_Getter";
 
 }
@@ -2566,43 +2549,36 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://www.w3.org/TR/css3-animations/#csskeyframesrule
 class CssKeyframesRule extends CssRule {
   CssKeyframesRule.internal() : super.internal();
 
   @DomName('WebKitCSSKeyframesRule.cssRules')
   @DocsEditable
-  @Experimental // untriaged
   List<CssRule> get cssRules native "CSSKeyframesRule_cssRules_Getter";
 
   @DomName('WebKitCSSKeyframesRule.name')
   @DocsEditable
-  @Experimental // untriaged
   String get name native "CSSKeyframesRule_name_Getter";
 
   @DomName('WebKitCSSKeyframesRule.name')
   @DocsEditable
-  @Experimental // untriaged
   void set name(String value) native "CSSKeyframesRule_name_Setter";
 
   @DomName('WebKitCSSKeyframesRule.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   CssKeyframeRule __getter__(int index) native "CSSKeyframesRule___getter___Callback";
 
   @DomName('WebKitCSSKeyframesRule.deleteRule')
   @DocsEditable
-  @Experimental // untriaged
   void deleteRule(String key) native "CSSKeyframesRule_deleteRule_Callback";
 
   @DomName('WebKitCSSKeyframesRule.findRule')
   @DocsEditable
-  @Experimental // untriaged
   CssKeyframeRule findRule(String key) native "CSSKeyframesRule_findRule_Callback";
 
   @DomName('WebKitCSSKeyframesRule.insertRule')
   @DocsEditable
-  @Experimental // untriaged
   void insertRule(String rule) native "CSSKeyframesRule_insertRule_Callback";
 
 }
@@ -2621,7 +2597,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 class CssMatrix extends NativeFieldWrapperClass1 {
   CssMatrix.internal();
 
@@ -2636,272 +2613,218 @@
 
   @DomName('WebKitCSSMatrix.a')
   @DocsEditable
-  @Experimental // untriaged
   num get a native "CSSMatrix_a_Getter";
 
   @DomName('WebKitCSSMatrix.a')
   @DocsEditable
-  @Experimental // untriaged
   void set a(num value) native "CSSMatrix_a_Setter";
 
   @DomName('WebKitCSSMatrix.b')
   @DocsEditable
-  @Experimental // untriaged
   num get b native "CSSMatrix_b_Getter";
 
   @DomName('WebKitCSSMatrix.b')
   @DocsEditable
-  @Experimental // untriaged
   void set b(num value) native "CSSMatrix_b_Setter";
 
   @DomName('WebKitCSSMatrix.c')
   @DocsEditable
-  @Experimental // untriaged
   num get c native "CSSMatrix_c_Getter";
 
   @DomName('WebKitCSSMatrix.c')
   @DocsEditable
-  @Experimental // untriaged
   void set c(num value) native "CSSMatrix_c_Setter";
 
   @DomName('WebKitCSSMatrix.d')
   @DocsEditable
-  @Experimental // untriaged
   num get d native "CSSMatrix_d_Getter";
 
   @DomName('WebKitCSSMatrix.d')
   @DocsEditable
-  @Experimental // untriaged
   void set d(num value) native "CSSMatrix_d_Setter";
 
   @DomName('WebKitCSSMatrix.e')
   @DocsEditable
-  @Experimental // untriaged
   num get e native "CSSMatrix_e_Getter";
 
   @DomName('WebKitCSSMatrix.e')
   @DocsEditable
-  @Experimental // untriaged
   void set e(num value) native "CSSMatrix_e_Setter";
 
   @DomName('WebKitCSSMatrix.f')
   @DocsEditable
-  @Experimental // untriaged
   num get f native "CSSMatrix_f_Getter";
 
   @DomName('WebKitCSSMatrix.f')
   @DocsEditable
-  @Experimental // untriaged
   void set f(num value) native "CSSMatrix_f_Setter";
 
   @DomName('WebKitCSSMatrix.m11')
   @DocsEditable
-  @Experimental // untriaged
   num get m11 native "CSSMatrix_m11_Getter";
 
   @DomName('WebKitCSSMatrix.m11')
   @DocsEditable
-  @Experimental // untriaged
   void set m11(num value) native "CSSMatrix_m11_Setter";
 
   @DomName('WebKitCSSMatrix.m12')
   @DocsEditable
-  @Experimental // untriaged
   num get m12 native "CSSMatrix_m12_Getter";
 
   @DomName('WebKitCSSMatrix.m12')
   @DocsEditable
-  @Experimental // untriaged
   void set m12(num value) native "CSSMatrix_m12_Setter";
 
   @DomName('WebKitCSSMatrix.m13')
   @DocsEditable
-  @Experimental // untriaged
   num get m13 native "CSSMatrix_m13_Getter";
 
   @DomName('WebKitCSSMatrix.m13')
   @DocsEditable
-  @Experimental // untriaged
   void set m13(num value) native "CSSMatrix_m13_Setter";
 
   @DomName('WebKitCSSMatrix.m14')
   @DocsEditable
-  @Experimental // untriaged
   num get m14 native "CSSMatrix_m14_Getter";
 
   @DomName('WebKitCSSMatrix.m14')
   @DocsEditable
-  @Experimental // untriaged
   void set m14(num value) native "CSSMatrix_m14_Setter";
 
   @DomName('WebKitCSSMatrix.m21')
   @DocsEditable
-  @Experimental // untriaged
   num get m21 native "CSSMatrix_m21_Getter";
 
   @DomName('WebKitCSSMatrix.m21')
   @DocsEditable
-  @Experimental // untriaged
   void set m21(num value) native "CSSMatrix_m21_Setter";
 
   @DomName('WebKitCSSMatrix.m22')
   @DocsEditable
-  @Experimental // untriaged
   num get m22 native "CSSMatrix_m22_Getter";
 
   @DomName('WebKitCSSMatrix.m22')
   @DocsEditable
-  @Experimental // untriaged
   void set m22(num value) native "CSSMatrix_m22_Setter";
 
   @DomName('WebKitCSSMatrix.m23')
   @DocsEditable
-  @Experimental // untriaged
   num get m23 native "CSSMatrix_m23_Getter";
 
   @DomName('WebKitCSSMatrix.m23')
   @DocsEditable
-  @Experimental // untriaged
   void set m23(num value) native "CSSMatrix_m23_Setter";
 
   @DomName('WebKitCSSMatrix.m24')
   @DocsEditable
-  @Experimental // untriaged
   num get m24 native "CSSMatrix_m24_Getter";
 
   @DomName('WebKitCSSMatrix.m24')
   @DocsEditable
-  @Experimental // untriaged
   void set m24(num value) native "CSSMatrix_m24_Setter";
 
   @DomName('WebKitCSSMatrix.m31')
   @DocsEditable
-  @Experimental // untriaged
   num get m31 native "CSSMatrix_m31_Getter";
 
   @DomName('WebKitCSSMatrix.m31')
   @DocsEditable
-  @Experimental // untriaged
   void set m31(num value) native "CSSMatrix_m31_Setter";
 
   @DomName('WebKitCSSMatrix.m32')
   @DocsEditable
-  @Experimental // untriaged
   num get m32 native "CSSMatrix_m32_Getter";
 
   @DomName('WebKitCSSMatrix.m32')
   @DocsEditable
-  @Experimental // untriaged
   void set m32(num value) native "CSSMatrix_m32_Setter";
 
   @DomName('WebKitCSSMatrix.m33')
   @DocsEditable
-  @Experimental // untriaged
   num get m33 native "CSSMatrix_m33_Getter";
 
   @DomName('WebKitCSSMatrix.m33')
   @DocsEditable
-  @Experimental // untriaged
   void set m33(num value) native "CSSMatrix_m33_Setter";
 
   @DomName('WebKitCSSMatrix.m34')
   @DocsEditable
-  @Experimental // untriaged
   num get m34 native "CSSMatrix_m34_Getter";
 
   @DomName('WebKitCSSMatrix.m34')
   @DocsEditable
-  @Experimental // untriaged
   void set m34(num value) native "CSSMatrix_m34_Setter";
 
   @DomName('WebKitCSSMatrix.m41')
   @DocsEditable
-  @Experimental // untriaged
   num get m41 native "CSSMatrix_m41_Getter";
 
   @DomName('WebKitCSSMatrix.m41')
   @DocsEditable
-  @Experimental // untriaged
   void set m41(num value) native "CSSMatrix_m41_Setter";
 
   @DomName('WebKitCSSMatrix.m42')
   @DocsEditable
-  @Experimental // untriaged
   num get m42 native "CSSMatrix_m42_Getter";
 
   @DomName('WebKitCSSMatrix.m42')
   @DocsEditable
-  @Experimental // untriaged
   void set m42(num value) native "CSSMatrix_m42_Setter";
 
   @DomName('WebKitCSSMatrix.m43')
   @DocsEditable
-  @Experimental // untriaged
   num get m43 native "CSSMatrix_m43_Getter";
 
   @DomName('WebKitCSSMatrix.m43')
   @DocsEditable
-  @Experimental // untriaged
   void set m43(num value) native "CSSMatrix_m43_Setter";
 
   @DomName('WebKitCSSMatrix.m44')
   @DocsEditable
-  @Experimental // untriaged
   num get m44 native "CSSMatrix_m44_Getter";
 
   @DomName('WebKitCSSMatrix.m44')
   @DocsEditable
-  @Experimental // untriaged
   void set m44(num value) native "CSSMatrix_m44_Setter";
 
   @DomName('WebKitCSSMatrix.inverse')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix inverse() native "CSSMatrix_inverse_Callback";
 
   @DomName('WebKitCSSMatrix.multiply')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix multiply(CssMatrix secondMatrix) native "CSSMatrix_multiply_Callback";
 
   @DomName('WebKitCSSMatrix.rotate')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix rotate(num rotX, num rotY, num rotZ) native "CSSMatrix_rotate_Callback";
 
   @DomName('WebKitCSSMatrix.rotateAxisAngle')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix rotateAxisAngle(num x, num y, num z, num angle) native "CSSMatrix_rotateAxisAngle_Callback";
 
   @DomName('WebKitCSSMatrix.scale')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix scale(num scaleX, num scaleY, num scaleZ) native "CSSMatrix_scale_Callback";
 
   @DomName('WebKitCSSMatrix.setMatrixValue')
   @DocsEditable
-  @Experimental // untriaged
   void setMatrixValue(String string) native "CSSMatrix_setMatrixValue_Callback";
 
   @DomName('WebKitCSSMatrix.skewX')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix skewX(num angle) native "CSSMatrix_skewX_Callback";
 
   @DomName('WebKitCSSMatrix.skewY')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix skewY(num angle) native "CSSMatrix_skewY_Callback";
 
   @DomName('WebKitCSSMatrix.toString')
   @DocsEditable
-  @Experimental // untriaged
   String toString() native "CSSMatrix_toString_Callback";
 
   @DomName('WebKitCSSMatrix.translate')
   @DocsEditable
-  @Experimental // untriaged
   CssMatrix translate(num x, num y, num z) native "CSSMatrix_translate_Callback";
 
 }
@@ -2946,7 +2869,8 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 class CssMixFunctionValue extends _CssValueList {
   CssMixFunctionValue.internal() : super.internal();
 
@@ -2988,13 +2912,12 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://dev.w3.org/csswg/css-regions/#region-style-rule-interface
 class CssRegionRule extends CssRule {
   CssRegionRule.internal() : super.internal();
 
   @DomName('WebKitCSSRegionRule.cssRules')
   @DocsEditable
-  @Experimental // untriaged
   List<CssRule> get cssRules native "CSSRegionRule_cssRules_Getter";
 
 }
@@ -3130,7 +3053,6 @@
 
   @DomName('CSSStyleDeclaration.__setter__')
   @DocsEditable
-  @Experimental // untriaged
   void __setter__(String propertyName, String propertyValue) native "CSSStyleDeclaration___setter___Callback";
 
   @DomName('CSSStyleDeclaration.getPropertyPriority')
@@ -6447,123 +6369,101 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Experimental
-@Experimental // untriaged
+// http://dev.w3.org/csswg/cssom/
+@deprecated // deprecated
 class CssTransformValue extends _CssValueList {
   CssTransformValue.internal() : super.internal();
 
   @DomName('WebKitCSSTransformValue.CSS_MATRIX')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_MATRIX = 11;
 
   @DomName('WebKitCSSTransformValue.CSS_MATRIX3D')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_MATRIX3D = 21;
 
   @DomName('WebKitCSSTransformValue.CSS_PERSPECTIVE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_PERSPECTIVE = 20;
 
   @DomName('WebKitCSSTransformValue.CSS_ROTATE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_ROTATE = 4;
 
   @DomName('WebKitCSSTransformValue.CSS_ROTATE3D')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_ROTATE3D = 17;
 
   @DomName('WebKitCSSTransformValue.CSS_ROTATEX')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_ROTATEX = 14;
 
   @DomName('WebKitCSSTransformValue.CSS_ROTATEY')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_ROTATEY = 15;
 
   @DomName('WebKitCSSTransformValue.CSS_ROTATEZ')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_ROTATEZ = 16;
 
   @DomName('WebKitCSSTransformValue.CSS_SCALE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SCALE = 5;
 
   @DomName('WebKitCSSTransformValue.CSS_SCALE3D')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SCALE3D = 19;
 
   @DomName('WebKitCSSTransformValue.CSS_SCALEX')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SCALEX = 6;
 
   @DomName('WebKitCSSTransformValue.CSS_SCALEY')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SCALEY = 7;
 
   @DomName('WebKitCSSTransformValue.CSS_SCALEZ')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SCALEZ = 18;
 
   @DomName('WebKitCSSTransformValue.CSS_SKEW')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SKEW = 8;
 
   @DomName('WebKitCSSTransformValue.CSS_SKEWX')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SKEWX = 9;
 
   @DomName('WebKitCSSTransformValue.CSS_SKEWY')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_SKEWY = 10;
 
   @DomName('WebKitCSSTransformValue.CSS_TRANSLATE')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_TRANSLATE = 1;
 
   @DomName('WebKitCSSTransformValue.CSS_TRANSLATE3D')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_TRANSLATE3D = 13;
 
   @DomName('WebKitCSSTransformValue.CSS_TRANSLATEX')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_TRANSLATEX = 2;
 
   @DomName('WebKitCSSTransformValue.CSS_TRANSLATEY')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_TRANSLATEY = 3;
 
   @DomName('WebKitCSSTransformValue.CSS_TRANSLATEZ')
   @DocsEditable
-  @Experimental // untriaged
   static const int CSS_TRANSLATEZ = 12;
 
   @DomName('WebKitCSSTransformValue.operationType')
   @DocsEditable
-  @Experimental // untriaged
   int get operationType native "CSSTransformValue_operationType_Getter";
 
   @DomName('WebKitCSSTransformValue.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   _CSSValue __getter__(int index) native "CSSTransformValue___getter___Callback";
 
 }
@@ -8115,7 +8015,6 @@
 
   @DomName('DOMSettableTokenList.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   String __getter__(int index) native "DOMSettableTokenList___getter___Callback";
 
 }
@@ -8203,17 +8102,14 @@
 
   @DomName('DOMStringMap.__delete__')
   @DocsEditable
-  @Experimental // untriaged
   bool __delete__(String name) native "DOMStringMap___delete___Callback";
 
   @DomName('DOMStringMap.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   String __getter__(String name) native "DOMStringMap___getter___Callback";
 
   @DomName('DOMStringMap.__setter__')
   @DocsEditable
-  @Experimental // untriaged
   void __setter__(String name, String value) native "DOMStringMap___setter___Callback";
 
 }
@@ -8669,8 +8565,7 @@
   Rect get offset => new Rect(offsetLeft, offsetTop, offsetWidth, offsetHeight);
 
   /**
-   * Adds the specified text as a text node after the last child of this
-   * element.
+   * Adds the specified text after the last child of this element.
    */
   void appendText(String text) {
     this.insertAdjacentText('beforeend', text);
@@ -10075,12 +9970,10 @@
 
   @DomName('HTMLEmbedElement.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   bool __getter__(index_OR_name) native "HTMLEmbedElement___getter___Callback";
 
   @DomName('HTMLEmbedElement.__setter__')
   @DocsEditable
-  @Experimental // untriaged
   void __setter__(index_OR_name, Node value) native "HTMLEmbedElement___setter___Callback";
 
 }
@@ -11603,7 +11496,6 @@
 
   @DomName('HTMLFormElement.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   Node __getter__(int index) native "HTMLFormElement___getter___Callback";
 
   @DomName('HTMLFormElement.checkValidity')
@@ -12024,7 +11916,6 @@
 
   @DomName('HTMLAllCollection.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   Node __getter__(int index) native "HTMLAllCollection___getter___Callback";
 
   @DomName('HTMLAllCollection.item')
@@ -12103,7 +11994,6 @@
 
   @DomName('HTMLCollection.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   Node __getter__(String name) native "HTMLCollection___getter___Callback";
 
   @DomName('HTMLCollection.item')
@@ -12313,7 +12203,6 @@
 
   @DomName('HTMLFormControlsCollection.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   Node __getter__(int index) native "HTMLFormControlsCollection___getter___Callback";
 
   @DomName('HTMLFormControlsCollection.namedItem')
@@ -14682,7 +14571,8 @@
 
   @DomName('HTMLLinkElement.import')
   @DocsEditable
-  @Experimental // untriaged
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html#interface-import
+  @Experimental
   DocumentFragment get import native "HTMLLinkElement_import_Getter";
 
   @DomName('HTMLLinkElement.media')
@@ -14823,11 +14713,6 @@
   @DocsEditable
   String toString() native "Location_toString_Callback";
 
-  @DomName('Location.valueOf')
-  @DocsEditable
-  @Experimental // nonstandard
-  Object valueOf() native "Location_valueOf_Callback";
-
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15746,6 +15631,27 @@
 class MediaKeySession extends EventTarget {
   MediaKeySession.internal() : super.internal();
 
+  @DomName('MediaKeySession.webkitkeyaddedEvent')
+  @DocsEditable
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental
+  static const EventStreamProvider<MediaKeyEvent> keyAddedEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyadded');
+
+  @DomName('MediaKeySession.webkitkeyerrorEvent')
+  @DocsEditable
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental
+  static const EventStreamProvider<MediaKeyEvent> keyErrorEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeyerror');
+
+  @DomName('MediaKeySession.webkitkeymessageEvent')
+  @DocsEditable
+  @SupportedBrowser(SupportedBrowser.CHROME)
+  @SupportedBrowser(SupportedBrowser.SAFARI)
+  @Experimental
+  static const EventStreamProvider<MediaKeyEvent> keyMessageEvent = const EventStreamProvider<MediaKeyEvent>('webkitkeymessage');
+
   @DomName('MediaKeySession.error')
   @DocsEditable
   MediaKeyError get error native "MediaKeySession_error_Getter";
@@ -15778,6 +15684,18 @@
   @DocsEditable
   void update(Uint8List key) native "MediaKeySession_update_Callback";
 
+  @DomName('MediaKeySession.onwebkitkeyadded')
+  @DocsEditable
+  Stream<MediaKeyEvent> get onKeyAdded => keyAddedEvent.forTarget(this);
+
+  @DomName('MediaKeySession.onwebkitkeyerror')
+  @DocsEditable
+  Stream<MediaKeyEvent> get onKeyError => keyErrorEvent.forTarget(this);
+
+  @DomName('MediaKeySession.onwebkitkeymessage')
+  @DocsEditable
+  Stream<MediaKeyEvent> get onKeyMessage => keyMessageEvent.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
@@ -16402,6 +16320,10 @@
 class MetaElement extends _Element_Merged {
   MetaElement.internal() : super.internal();
 
+  @DomName('HTMLMetaElement.HTMLMetaElement')
+  @DocsEditable
+  factory MetaElement() => document.$dom_createElement("meta");
+
   @DomName('HTMLMetaElement.content')
   @DocsEditable
   String get content native "HTMLMetaElement_content_Getter";
@@ -16547,35 +16469,47 @@
 
 @DocsEditable
 @DomName('MIDIAccess')
-@Experimental // untriaged
+// http://webaudio.github.io/web-midi-api/#midiaccess-interface
+@Experimental
 class MidiAccess extends EventTarget {
   MidiAccess.internal() : super.internal();
 
+  @DomName('MIDIAccess.connectEvent')
+  @DocsEditable
+  static const EventStreamProvider<MidiConnectionEvent> connectEvent = const EventStreamProvider<MidiConnectionEvent>('connect');
+
+  @DomName('MIDIAccess.disconnectEvent')
+  @DocsEditable
+  static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
+
   @DomName('MIDIAccess.addEventListener')
   @DocsEditable
-  @Experimental // untriaged
   void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIAccess_addEventListener_Callback";
 
   @DomName('MIDIAccess.dispatchEvent')
   @DocsEditable
-  @Experimental // untriaged
   bool dispatchEvent(Event event) native "MIDIAccess_dispatchEvent_Callback";
 
   @DomName('MIDIAccess.inputs')
   @DocsEditable
-  @Experimental // untriaged
   List<MidiInput> inputs() native "MIDIAccess_inputs_Callback";
 
   @DomName('MIDIAccess.outputs')
   @DocsEditable
-  @Experimental // untriaged
   List<MidiOutput> outputs() native "MIDIAccess_outputs_Callback";
 
   @DomName('MIDIAccess.removeEventListener')
   @DocsEditable
-  @Experimental // untriaged
   void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MIDIAccess_removeEventListener_Callback";
 
+  @DomName('MIDIAccess.onconnect')
+  @DocsEditable
+  Stream<MidiConnectionEvent> get onConnect => connectEvent.forTarget(this);
+
+  @DomName('MIDIAccess.ondisconnect')
+  @DocsEditable
+  Stream<MidiConnectionEvent> get onDisconnect => disconnectEvent.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
@@ -16610,6 +16544,14 @@
 class MidiInput extends MidiPort implements EventTarget {
   MidiInput.internal() : super.internal();
 
+  @DomName('MIDIInput.midimessageEvent')
+  @DocsEditable
+  static const EventStreamProvider<MidiMessageEvent> midiMessageEvent = const EventStreamProvider<MidiMessageEvent>('midimessage');
+
+  @DomName('MIDIInput.onmidimessage')
+  @DocsEditable
+  Stream<MidiMessageEvent> get onMidiMessage => midiMessageEvent.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
@@ -16811,7 +16753,6 @@
 
   @DomName('MimeTypeArray.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   MimeType __getter__(String name) native "MimeTypeArray___getter___Callback";
 
   @DomName('MimeTypeArray.item')
@@ -17285,7 +17226,6 @@
 
   @DomName('WebKitNamedFlowCollection.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   NamedFlow __getter__(String name) native "DOMNamedFlowCollection___getter___Callback";
 
   @DomName('WebKitNamedFlowCollection.item')
@@ -17502,17 +17442,14 @@
 
   @DomName('NavigatorUserMediaError.constraintName')
   @DocsEditable
-  @Experimental // untriaged
   String get constraintName native "NavigatorUserMediaError_constraintName_Getter";
 
   @DomName('NavigatorUserMediaError.message')
   @DocsEditable
-  @Experimental // untriaged
   String get message native "NavigatorUserMediaError_message_Getter";
 
   @DomName('NavigatorUserMediaError.name')
   @DocsEditable
-  @Experimental // untriaged
   String get name native "NavigatorUserMediaError_name_Getter";
 
 }
@@ -18518,12 +18455,10 @@
 
   @DomName('HTMLObjectElement.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   bool __getter__(index_OR_name) native "HTMLObjectElement___getter___Callback";
 
   @DomName('HTMLObjectElement.__setter__')
   @DocsEditable
-  @Experimental // untriaged
   void __setter__(index_OR_name, Node value) native "HTMLObjectElement___setter___Callback";
 
   @DomName('HTMLObjectElement.checkValidity')
@@ -19303,7 +19238,6 @@
 
   @DomName('Plugin.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   MimeType __getter__(String name) native "Plugin___getter___Callback";
 
   @DomName('Plugin.item')
@@ -19379,7 +19313,6 @@
 
   @DomName('PluginArray.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   Plugin __getter__(String name) native "PluginArray___getter___Callback";
 
   @DomName('PluginArray.item')
@@ -19616,6 +19549,10 @@
 class QuoteElement extends _Element_Merged {
   QuoteElement.internal() : super.internal();
 
+  @DomName('HTMLQuoteElement.HTMLQuoteElement')
+  @DocsEditable
+  factory QuoteElement() => document.$dom_createElement("q");
+
   @DomName('HTMLQuoteElement.cite')
   @DocsEditable
   String get cite native "HTMLQuoteElement_cite_Getter";
@@ -19862,13 +19799,13 @@
 
 @DocsEditable
 @DomName('ResourceProgressEvent')
-@Experimental // untriaged
+// https://chromiumcodereview.appspot.com/14773025/
+@deprecated // experimental
 class ResourceProgressEvent extends ProgressEvent {
   ResourceProgressEvent.internal() : super.internal();
 
   @DomName('ResourceProgressEvent.url')
   @DocsEditable
-  @Experimental // untriaged
   String get url native "ResourceProgressEvent_url_Getter";
 
 }
@@ -20462,7 +20399,6 @@
 
   @DomName('RTCStatsResponse.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   RtcStatsReport __getter__(String name) native "RTCStatsResponse___getter___Callback";
 
   @DomName('RTCStatsResponse.namedItem')
@@ -20868,7 +20804,6 @@
 
   @DomName('HTMLSelectElement.__setter__')
   @DocsEditable
-  @Experimental // untriaged
   void __setter__(int index, OptionElement value) native "HTMLSelectElement___setter___Callback";
 
   @DomName('HTMLSelectElement.checkValidity')
@@ -21048,6 +20983,10 @@
 class ShadowElement extends _Element_Merged {
   ShadowElement.internal() : super.internal();
 
+  @DomName('HTMLShadowElement.HTMLShadowElement')
+  @DocsEditable
+  factory ShadowElement() => document.$dom_createElement("shadow");
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -26697,7 +26636,7 @@
 
 @DocsEditable
 @DomName('Entity')
-@Experimental // untriaged
+@deprecated // deprecated
 class _Entity extends Node {
   _Entity.internal() : super.internal();
 
@@ -27157,7 +27096,6 @@
 
   @DomName('NamedNodeMap.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   Node __getter__(String name) native "NamedNodeMap___getter___Callback";
 
   @DomName('NamedNodeMap.getNamedItem')
@@ -27481,7 +27419,6 @@
 
   @DomName('StyleSheetList.__getter__')
   @DocsEditable
-  @Experimental // untriaged
   CssStyleSheet __getter__(String name) native "StyleSheetList___getter___Callback";
 
   @DomName('StyleSheetList.item')
@@ -27497,184 +27434,6 @@
 
 
 @DocsEditable
-@DomName('WebKitCSSFilterValue')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-abstract class _WebKitCSSFilterValue extends _CssValueList {
-  _WebKitCSSFilterValue.internal() : super.internal();
-
-}
-// 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('WebKitCSSMatrix')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-abstract class _WebKitCSSMatrix extends NativeFieldWrapperClass1 {
-  _WebKitCSSMatrix.internal();
-
-  @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
-  @DocsEditable
-  factory _WebKitCSSMatrix([String cssValue]) {
-    return _WebKitCSSMatrix._create_1(cssValue);
-  }
-
-  @DocsEditable
-  static _WebKitCSSMatrix _create_1(cssValue) native "WebKitCSSMatrix__create_1constructorCallback";
-
-}
-// 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('WebKitCSSMixFunctionValue')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-abstract class _WebKitCSSMixFunctionValue extends _CssValueList {
-  _WebKitCSSMixFunctionValue.internal() : super.internal();
-
-}
-// 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('WebKitCSSTransformValue')
-// http://dev.w3.org/csswg/cssom/
-@deprecated // deprecated
-abstract class _WebKitCSSTransformValue extends _CssValueList {
-  _WebKitCSSTransformValue.internal() : super.internal();
-
-}
-// 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('WebKitCSSFilterRule')
-// http://www.w3.org/TR/filter-effects/
-@Experimental
-class _WebKitCssFilterRule extends CssRule {
-  _WebKitCssFilterRule.internal() : super.internal();
-
-  @DomName('WebKitCSSFilterRule.style')
-  @DocsEditable
-  CssStyleDeclaration get style native "WebKitCSSFilterRule_style_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('WebKitCSSKeyframeRule')
-// http://www.w3.org/TR/css3-animations/#CSSKeyframeRule-interface
-@Experimental
-class _WebKitCssKeyframeRule extends CssRule {
-  _WebKitCssKeyframeRule.internal() : super.internal();
-
-  @DomName('WebKitCSSKeyframeRule.keyText')
-  @DocsEditable
-  String get keyText native "WebKitCSSKeyframeRule_keyText_Getter";
-
-  @DomName('WebKitCSSKeyframeRule.keyText')
-  @DocsEditable
-  void set keyText(String value) native "WebKitCSSKeyframeRule_keyText_Setter";
-
-  @DomName('WebKitCSSKeyframeRule.style')
-  @DocsEditable
-  CssStyleDeclaration get style native "WebKitCSSKeyframeRule_style_Getter";
-
-}
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable
-@DomName('WebKitCSSKeyframesRule')
-// http://www.w3.org/TR/css3-animations/#csskeyframesrule
-@Experimental
-class _WebKitCssKeyframesRule extends CssRule {
-  _WebKitCssKeyframesRule.internal() : super.internal();
-
-  @DomName('WebKitCSSKeyframesRule.cssRules')
-  @DocsEditable
-  List<CssRule> get cssRules native "WebKitCSSKeyframesRule_cssRules_Getter";
-
-  @DomName('WebKitCSSKeyframesRule.name')
-  @DocsEditable
-  String get name native "WebKitCSSKeyframesRule_name_Getter";
-
-  @DomName('WebKitCSSKeyframesRule.name')
-  @DocsEditable
-  void set name(String value) native "WebKitCSSKeyframesRule_name_Setter";
-
-  @DomName('WebKitCSSKeyframesRule.__getter__')
-  @DocsEditable
-  @Experimental // untriaged
-  _WebKitCssKeyframeRule __getter__(int index) native "WebKitCSSKeyframesRule___getter___Callback";
-
-  @DomName('WebKitCSSKeyframesRule.deleteRule')
-  @DocsEditable
-  void deleteRule(String key) native "WebKitCSSKeyframesRule_deleteRule_Callback";
-
-  @DomName('WebKitCSSKeyframesRule.findRule')
-  @DocsEditable
-  _WebKitCssKeyframeRule findRule(String key) native "WebKitCSSKeyframesRule_findRule_Callback";
-
-  @DomName('WebKitCSSKeyframesRule.insertRule')
-  @DocsEditable
-  void insertRule(String rule) native "WebKitCSSKeyframesRule_insertRule_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('WebKitCSSRegionRule')
-// http://dev.w3.org/csswg/css-regions/#region-style-rule-interface
-@Experimental
-class _WebKitCssRegionRule extends CssRule {
-  _WebKitCssRegionRule.internal() : super.internal();
-
-  @DomName('WebKitCSSRegionRule.cssRules')
-  @DocsEditable
-  List<CssRule> get cssRules native "WebKitCSSRegionRule_cssRules_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('WorkerContext')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#WorkerGlobalScope-partial
 @Experimental // stable
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index ee98234..9dd0d9a 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -171,10 +171,14 @@
 
   @DomName('IDBCursor.primaryKey')
   @DocsEditable
+  @_annotation_Creates_IDBKey
+  @_annotation_Returns_IDBKey
   final Object primaryKey;
 
   @DomName('IDBCursor.source')
   @DocsEditable
+  @Creates('Null')
+  @Returns('ObjectStore|Index|Null')
   final dynamic source;
 
   @DomName('IDBCursor.advance')
@@ -291,6 +295,8 @@
 
   @DomName('IDBDatabase.version')
   @DocsEditable
+  @Creates('int|String|Null')
+  @Returns('int|String|Null')
   final dynamic version;
 
   @JSName('addEventListener')
@@ -588,6 +594,7 @@
   
   @DomName('IDBIndex.keyPath')
   @DocsEditable
+  @annotation_Creates_SerializedScriptValue
   final dynamic keyPath;
 
   @DomName('IDBIndex.multiEntry')
@@ -674,6 +681,7 @@
 
   @DomName('IDBKeyRange.lower')
   @DocsEditable
+  @annotation_Creates_SerializedScriptValue
   final Object lower;
 
   @DomName('IDBKeyRange.lowerOpen')
@@ -682,6 +690,7 @@
 
   @DomName('IDBKeyRange.upper')
   @DocsEditable
+  @annotation_Creates_SerializedScriptValue
   final Object upper;
 
   @DomName('IDBKeyRange.upperOpen')
@@ -862,6 +871,7 @@
 
   @DomName('IDBObjectStore.keyPath')
   @DocsEditable
+  @annotation_Creates_SerializedScriptValue
   final dynamic keyPath;
 
   @DomName('IDBObjectStore.name')
@@ -1249,10 +1259,14 @@
 
   @DomName('IDBVersionChangeEvent.newVersion')
   @DocsEditable
+  @Creates('int|String|Null')
+  @Returns('int|String|Null')
   final dynamic newVersion;
 
   @DomName('IDBVersionChangeEvent.oldVersion')
   @DocsEditable
+  @Creates('int|String|Null')
+  @Returns('int|String|Null')
   final dynamic oldVersion;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/sdk/lib/io/common.dart b/sdk/lib/io/common.dart
index 3fcee62..31ce72b 100644
--- a/sdk/lib/io/common.dart
+++ b/sdk/lib/io/common.dart
@@ -31,19 +31,26 @@
     case _OSERROR_RESPONSE:
       var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
                             response[_OSERROR_RESPONSE_ERROR_CODE]);
-      return new FileIOException(message, err);
+      return new FileException(message, err);
     case _FILE_CLOSED_RESPONSE:
-      return new FileIOException("File closed");
+      return new FileException("File closed");
     default:
       return new Exception("Unknown error");
   }
 }
 
 /**
+ * Base class for all IO related exceptions.
+ */
+abstract class IOException implements Exception {
+  String toString() => "IOException";
+}
+
+/**
   * An [OSError] object holds information about an error from the
   * operating system.
   */
-class OSError implements Error {
+class OSError {
   /** Constant used to indicate that no OS error code is available. */
   static const int noErrorCode = -1;
 
diff --git a/sdk/lib/io/directory.dart b/sdk/lib/io/directory.dart
index dfe5637..c8423b5 100644
--- a/sdk/lib/io/directory.dart
+++ b/sdk/lib/io/directory.dart
@@ -210,13 +210,13 @@
 }
 
 
-class DirectoryIOException implements Exception {
-  const DirectoryIOException([String this.message = "",
+class DirectoryException implements IOException {
+  const DirectoryException([String this.message = "",
                               String this.path = "",
                               OSError this.osError = null]);
   String toString() {
     StringBuffer sb = new StringBuffer();
-    sb.write("DirectoryIOException");
+    sb.write("DirectoryException");
     if (!message.isEmpty) {
       sb.write(": $message");
       if (path != null) {
diff --git a/sdk/lib/io/directory_impl.dart b/sdk/lib/io/directory_impl.dart
index 4d51796..cdb6df4 100644
--- a/sdk/lib/io/directory_impl.dart
+++ b/sdk/lib/io/directory_impl.dart
@@ -32,7 +32,7 @@
     var result = _setCurrent(path);
     if (result is ArgumentError) throw result;
     if (result is OSError) {
-      throw new DirectoryIOException(
+      throw new DirectoryException(
           "Setting current working directory failed", path, result);
     }
   }
@@ -56,7 +56,7 @@
     }
     var result = _exists(_path);
     if (result is OSError) {
-      throw new DirectoryIOException("Exists failed", _path, result);
+      throw new DirectoryException("Exists failed", _path, result);
     }
     return (result == 1);
   }
@@ -155,7 +155,7 @@
     if (recursive) return createRecursivelySync();
     var result = _create(_path);
     if (result is OSError) {
-      throw new DirectoryIOException("Creation failed", _path, result);
+      throw new DirectoryException("Creation failed", _path, result);
     }
   }
 
@@ -179,7 +179,7 @@
     }
     var result = _createTemp(path);
     if (result is OSError) {
-      throw new DirectoryIOException("Creation of temporary directory failed",
+      throw new DirectoryException("Creation of temporary directory failed",
                                      _path,
                                      result);
     }
@@ -209,7 +209,7 @@
     }
     var result = _delete(_path, recursive);
     if (result is OSError) {
-      throw new DirectoryIOException("Deletion failed", _path, result);
+      throw new DirectoryException("Deletion failed", _path, result);
     }
   }
 
@@ -233,7 +233,7 @@
     }
     var result = _rename(_path, newPath);
     if (result is OSError) {
-      throw new DirectoryIOException("Rename failed", _path, result);
+      throw new DirectoryException("Rename failed", _path, result);
     }
     return new Directory(newPath);
   }
@@ -261,7 +261,7 @@
     responsePort.receive((message, replyTo) {
       if (message is !List || message[RESPONSE_TYPE] is !int) {
         responsePort.close();
-        controller.addError(new DirectoryIOException("Internal error"));
+        controller.addError(new DirectoryException("Internal error"));
         return;
       }
       switch (message[RESPONSE_TYPE]) {
@@ -287,11 +287,11 @@
             var errorPath = message[RESPONSE_PATH];
             if (errorPath == null) errorPath = path;
             controller.addError(
-                new DirectoryIOException("Directory listing failed",
+                new DirectoryException("Directory listing failed",
                                          errorPath,
                                          err));
           } else {
-            controller.addError(new DirectoryIOException("Internal error"));
+            controller.addError(new DirectoryException("Internal error"));
           }
           break;
         case LIST_DONE:
@@ -327,7 +327,7 @@
       case _OSERROR_RESPONSE:
         var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
                               response[_OSERROR_RESPONSE_ERROR_CODE]);
-        return new DirectoryIOException(message, _path, err);
+        return new DirectoryException(message, _path, err);
       default:
         return new Exception("Unknown error");
     }
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index 455aa48..ac1a268 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -60,7 +60,7 @@
    * by [createSync]. Calling [createSync] on an existing file might fail
    * if there are restrictive permissions on the file.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   void createSync();
 
@@ -75,7 +75,7 @@
    * Synchronously delete the file. Only a file or a link to a file
    * can be deleted with this method, not a directory or a broken link.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   void deleteSync();
 
@@ -94,7 +94,7 @@
   /**
    * Synchronously get the length of the file.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   int lengthSync();
 
@@ -109,7 +109,7 @@
    * Get the last-modified time of the file. Throws an exception
    * if the file does not exist.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   DateTime lastModifiedSync();
 
@@ -140,7 +140,7 @@
    *
    * See [open] for information on the [mode] argument.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   RandomAccessFile openSync({FileMode mode: FileMode.READ});
 
@@ -153,7 +153,7 @@
   /**
    * Synchronously get the canonical full path corresponding to the file path.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   String fullPathSync();
 
@@ -201,7 +201,7 @@
   /**
    * Synchronously read the entire file contents as a list of bytes.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   List<int> readAsBytesSync();
 
@@ -218,7 +218,7 @@
    * Synchronously read the entire file contents as a string using the
    * given [Encoding].
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   String readAsStringSync({Encoding encoding: Encoding.UTF_8});
 
@@ -235,7 +235,7 @@
    * Synchronously read the entire file contents as lines of text
    * using the given [Encoding].
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   List<String> readAsLinesSync({Encoding encoding: Encoding.UTF_8});
 
@@ -261,7 +261,7 @@
    * the file if it already exists. In order to append the bytes to an existing
    * file, pass [FileMode.APPEND] as the optional mode parameter.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   void writeAsBytesSync(List<int> bytes, {FileMode mode: FileMode.WRITE});
 
@@ -291,7 +291,7 @@
    * to an existing file, pass [FileMode.APPEND] as the optional mode
    * parameter.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   void writeAsStringSync(String contents,
                          {FileMode mode: FileMode.WRITE,
@@ -319,7 +319,7 @@
   /**
    * Synchronously closes the file.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   void closeSync();
 
@@ -333,7 +333,7 @@
    * Synchronously reads a single byte from the file. If end-of-file
    * has been reached -1 is returned.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   int readByteSync();
 
@@ -346,7 +346,7 @@
    * Synchronously reads a maximum of [bytes] bytes from a file and
    * returns the result in a list of bytes.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   List<int> readSync(int bytes);
 
@@ -368,7 +368,7 @@
    * read into [buffer], otherwise up to [buffer.length]. If [end] == [start]
    * nothing happends.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   int readIntoSync(List<int> buffer, [int start, int end]);
 
@@ -383,7 +383,7 @@
    * Synchronously writes a single byte to the file. Returns the
    * number of bytes successfully written.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   int writeByteSync(int value);
 
@@ -403,7 +403,7 @@
    * start from index 0. If [end] is omitted, it will write to the end of
    * [buffer].
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   void writeFromSync(List<int> buffer, [int start, int end]);
 
@@ -419,7 +419,7 @@
    * Synchronously writes a single string to the file using the given
    * [Encoding].
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   void writeStringSync(String string,
                        {Encoding encoding: Encoding.UTF_8});
@@ -433,7 +433,7 @@
   /**
    * Synchronously gets the current byte position in the file.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   int positionSync();
 
@@ -447,7 +447,7 @@
   /**
    * Synchronously sets the byte position in the file.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   void setPositionSync(int position);
 
@@ -461,7 +461,7 @@
   /**
    * Synchronously truncates (or extends) the file to [length] bytes.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   void truncateSync(int length);
 
@@ -474,7 +474,7 @@
   /**
    * Synchronously gets the length of the file.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   int lengthSync();
 
@@ -488,7 +488,7 @@
   /**
    * Synchronously flushes the contents of the file to disk.
    *
-   * Throws a [FileIOException] if the operation fails.
+   * Throws a [FileException] if the operation fails.
    */
   void flushSync();
 
@@ -504,12 +504,12 @@
 }
 
 
-class FileIOException implements Exception {
-  const FileIOException([String this.message = "",
+class FileException implements IOException {
+  const FileException([String this.message = "",
                          OSError this.osError = null]);
   String toString() {
     StringBuffer sb = new StringBuffer();
-    sb.write("FileIOException");
+    sb.write("FileException");
     if (!message.isEmpty) {
       sb.write(": $message");
       if (osError != null) {
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index b855fef..34808d8 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -393,7 +393,7 @@
     if (mode != FileMode.READ &&
         mode != FileMode.WRITE &&
         mode != FileMode.APPEND) {
-      throw new FileIOException("Unknown file mode. Use FileMode.READ, "
+      throw new FileException("Unknown file mode. Use FileMode.READ, "
                                 "FileMode.WRITE or FileMode.APPEND.");
     }
     var id = _open(_path, mode._mode);
@@ -406,7 +406,7 @@
   static RandomAccessFile _openStdioSync(int fd) {
     var id = _openStdio(fd);
     if (id == 0) {
-      throw new FileIOException("Cannot open stdio file for: $fd");
+      throw new FileException("Cannot open stdio file for: $fd");
     }
     return new _RandomAccessFile(id, "");
   }
@@ -442,7 +442,7 @@
                     Encoding encoding: Encoding.UTF_8}) {
     if (mode != FileMode.WRITE &&
         mode != FileMode.APPEND) {
-      throw new FileIOException(
+      throw new FileException(
           "Wrong FileMode. Use FileMode.WRITE or FileMode.APPEND");
     }
     var consumer = new _FileStreamConsumer(this, mode);
@@ -559,7 +559,7 @@
 
   static throwIfError(Object result, String msg) {
     if (result is OSError) {
-      throw new FileIOException(msg, result);
+      throw new FileException(msg, result);
     }
   }
 
@@ -586,7 +586,7 @@
         _id = result;
         return this;
       } else {
-        throw new FileIOException("Cannot close file '$_path'");
+        throw new FileException("Cannot close file '$_path'");
       }
     });
   }
@@ -597,7 +597,7 @@
     _checkNotClosed();
     var id = _close(_id);
     if (id == -1) {
-      throw new FileIOException("Cannot close file '$_path'");
+      throw new FileException("Cannot close file '$_path'");
     }
     _id = id;
   }
@@ -623,7 +623,7 @@
     _checkNotClosed();
     var result = _readByte(_id);
     if (result is OSError) {
-      throw new FileIOException("readByte failed for file '$_path'", result);
+      throw new FileException("readByte failed for file '$_path'", result);
     }
     return result;
   }
@@ -631,7 +631,7 @@
   Future<List<int>> read(int bytes) {
     _ensureFileService();
     if (bytes is !int) {
-      return new Future.error(new FileIOException(
+      return new Future.error(new FileException(
           "Invalid arguments to read for file '$_path'"));
     }
     if (closed) return _closedException();
@@ -653,12 +653,12 @@
   List<int> readSync(int bytes) {
     _checkNotClosed();
     if (bytes is !int) {
-      throw new FileIOException(
+      throw new FileException(
           "Invalid arguments to readSync for file '$_path'");
     }
     var result = _read(_id, bytes);
     if (result is OSError) {
-      throw new FileIOException("readSync failed for file '$_path'",
+      throw new FileException("readSync failed for file '$_path'",
                                 result);
     }
     return result;
@@ -669,7 +669,7 @@
     if (buffer is !List ||
         (start != null && start is !int) ||
         (end != null && end is !int)) {
-      return new Future.error(new FileIOException(
+      return new Future.error(new FileException(
           "Invalid arguments to readInto for file '$_path'"));
     };
     if (closed) return _closedException();
@@ -706,7 +706,7 @@
     if (buffer is !List ||
         (start != null && start is !int) ||
         (end != null && end is !int)) {
-      throw new FileIOException(
+      throw new FileException(
           "Invalid arguments to readInto for file '$_path'");
     }
     if (start == null) start = 0;
@@ -715,7 +715,7 @@
     _checkReadWriteListArguments(buffer.length, start, end);
     var result = _readInto(_id, buffer, start, end);
     if (result is OSError) {
-      throw new FileIOException("readInto failed for file '$_path'",
+      throw new FileException("readInto failed for file '$_path'",
                                 result);
     }
     return result;
@@ -724,7 +724,7 @@
   Future<RandomAccessFile> writeByte(int value) {
     _ensureFileService();
     if (value is !int) {
-      return new Future.error(new FileIOException(
+      return new Future.error(new FileException(
           "Invalid argument to writeByte for file '$_path'"));
     }
     if (closed) return _closedException();
@@ -746,12 +746,12 @@
   int writeByteSync(int value) {
     _checkNotClosed();
     if (value is !int) {
-      throw new FileIOException(
+      throw new FileException(
           "Invalid argument to writeByte for file '$_path'");
     }
     var result = _writeByte(_id, value);
     if (result is OSError) {
-      throw new FileIOException("writeByte failed for file '$_path'",
+      throw new FileException("writeByte failed for file '$_path'",
                                 result);
     }
     return result;
@@ -762,7 +762,7 @@
     if ((buffer is !List && buffer is !ByteData) ||
         (start != null && start is !int) ||
         (end != null && end is !int)) {
-      return new Future.error(new FileIOException(
+      return new Future.error(new FileException(
           "Invalid arguments to writeFrom for file '$_path'"));
     }
 
@@ -797,7 +797,7 @@
     if (buffer is !List ||
         (start != null && start is !int) ||
         (end != null && end is !int)) {
-      throw new FileIOException(
+      throw new FileException(
           "Invalid arguments to writeFrom for file '$_path'");
     }
     if (start == null) start = 0;
@@ -811,14 +811,14 @@
                             bufferAndStart.start,
                             end - (start - bufferAndStart.start));
     if (result is OSError) {
-      throw new FileIOException("writeFrom failed for file '$_path'", result);
+      throw new FileException("writeFrom failed for file '$_path'", result);
     }
   }
 
   Future<RandomAccessFile> writeString(String string,
                                        {Encoding encoding: Encoding.UTF_8}) {
     if (encoding is! Encoding) {
-      return new Future.error(new FileIOException(
+      return new Future.error(new FileException(
           "Invalid encoding in writeString: $encoding"));
     }
     var data = _encodeString(string, encoding);
@@ -827,7 +827,7 @@
 
   void writeStringSync(String string, {Encoding encoding: Encoding.UTF_8}) {
     if (encoding is! Encoding) {
-      throw new FileIOException(
+      throw new FileException(
           "Invalid encoding in writeStringSync: $encoding");
     }
     var data = _encodeString(string, encoding);
@@ -855,7 +855,7 @@
     _checkNotClosed();
     var result = _position(_id);
     if (result is OSError) {
-      throw new FileIOException("position failed for file '$_path'", result);
+      throw new FileException("position failed for file '$_path'", result);
     }
     return result;
   }
@@ -882,7 +882,7 @@
     _checkNotClosed();
     var result = _setPosition(_id, position);
     if (result is OSError) {
-      throw new FileIOException("setPosition failed for file '$_path'", result);
+      throw new FileException("setPosition failed for file '$_path'", result);
     }
   }
 
@@ -908,7 +908,7 @@
     _checkNotClosed();
     var result = _truncate(_id, length);
     if (result is OSError) {
-      throw new FileIOException("truncate failed for file '$_path'", result);
+      throw new FileException("truncate failed for file '$_path'", result);
     }
   }
 
@@ -933,7 +933,7 @@
     _checkNotClosed();
     var result = _length(_id);
     if (result is OSError) {
-      throw new FileIOException("length failed for file '$_path'", result);
+      throw new FileException("length failed for file '$_path'", result);
     }
     return result;
   }
@@ -959,7 +959,7 @@
     _checkNotClosed();
     var result = _flush(_id);
     if (result is OSError) {
-      throw new FileIOException("flush failed for file '$_path'", result);
+      throw new FileException("flush failed for file '$_path'", result);
     }
   }
 
@@ -975,12 +975,12 @@
 
   void _checkNotClosed() {
     if (closed) {
-      throw new FileIOException("File closed '$_path'");
+      throw new FileException("File closed '$_path'");
     }
   }
 
   Future _closedException() {
-    return new Future.error(new FileIOException("File closed '$_path'"));
+    return new Future.error(new FileException("File closed '$_path'"));
   }
 
   final String _path;
diff --git a/sdk/lib/io/file_system_entity.dart b/sdk/lib/io/file_system_entity.dart
index 0a1ee9e..1723508 100644
--- a/sdk/lib/io/file_system_entity.dart
+++ b/sdk/lib/io/file_system_entity.dart
@@ -371,7 +371,7 @@
 
   static _throwIfError(Object result, String msg) {
     if (result is OSError) {
-      throw new FileIOException(msg, result);
+      throw new FileException(msg, result);
     } else if (result is ArgumentError) {
       throw result;
     }
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index 4ea77f7..b045c11 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -171,6 +171,16 @@
    * current connections handled by the server.
    */
   HttpConnectionsInfo connectionsInfo();
+
+  /**
+   * Set and get the default value of the `Server` header for all responses
+   * generated by this [HttpServer]. The default value is
+   * `Dart/<version> (dart:io)`.
+   *
+   * If the serverHeader is set to `null`, no default `Server` header will be
+   * added to each response.
+   */
+  String serverHeader;
 }
 
 
@@ -879,6 +889,16 @@
    */
   Duration idleTimeout;
 
+  /**
+   * Set and get the default value of the `User-Agent` header for all requests
+   * generated by this [HttpClient]. The default value is
+   * `Dart/<version> (dart:io)`.
+   *
+   * If the userAgent is set to `null`, no default `User-Agent` header will be
+   * added to each request.
+   */
+  String userAgent;
+
   factory HttpClient() => new _HttpClient();
 
   /**
@@ -1174,8 +1194,9 @@
   /**
    * Set this property to the maximum number of redirects to follow
    * when [followRedirects] is [:true:]. If this number is exceeded the
-   * [onError] callback will be called with a [RedirectLimitExceeded]
-   * exception. The default value is 5.
+   * [onError] callback will be called with a [RedirectException].
+   *
+   * The default value is 5.
    */
   int maxRedirects;
 
@@ -1353,27 +1374,21 @@
 }
 
 
-class HttpException implements Exception {
-  const HttpException([String this.message = ""]);
-  String toString() => "HttpException: $message";
+class HttpException implements IOException {
   final String message;
+
+  const HttpException([String this.message = ""]);
+
+  String toString() => "HttpException: $message";
 }
 
 
-class RedirectException extends HttpException {
-  const RedirectException(String message,
-                          List<RedirectInfo> this.redirects) : super(message);
+class RedirectException implements HttpException {
+  final String message;
   final List<RedirectInfo> redirects;
-}
 
+  const RedirectException(String this.message,
+                          List<RedirectInfo> this.redirects);
 
-class RedirectLimitExceededException extends RedirectException {
-  const RedirectLimitExceededException(List<RedirectInfo> redirects)
-      : super("Redirect limit exceeded", redirects);
-}
-
-
-class RedirectLoopException extends RedirectException {
-  const RedirectLoopException(List<RedirectInfo> redirects)
-      : super("Redirect loop detected", redirects);
+  String toString() => "RedirectException: $message";
 }
diff --git a/sdk/lib/io/http_body.dart b/sdk/lib/io/http_body.dart
index b6e106b..47a28f0 100644
--- a/sdk/lib/io/http_body.dart
+++ b/sdk/lib/io/http_body.dart
@@ -6,9 +6,67 @@
 
 
 /**
- * [HttpBodyHandler] is a helper class for parsing and collecting HTTP message
- * data in an easy-to-use [HttpBody] object. The content body is parsed,
- * depending on the 'Content-Type' header field.
+ * [HttpBodyHandler] is a helper class for processing and collecting
+ * HTTP message data in an easy-to-use [HttpBody] object. The content
+ * body is parsed, depending on the `Content-Type` header field. When
+ * the full body is read and parsed the body content is made
+ * available. The class can be used to process both server requests
+ * and client responses.
+ *
+ * The following content types are recognized:
+ *
+ *     text/\*
+ *     application/json
+ *     application/x-www-form-urlencoded
+ *     multipart/form-data
+ *
+ *  For content type `text/\*` the body is decoded into a string. The
+ *  'charset' parameter of the content type specifies the encoding
+ *  used for decoding. If no 'charset' is present the default encoding
+ *  of ISO-8859-1 is used.
+ *
+ *  For content type `application/json` the body is decoded into a
+ *  string which is then parsed as JSON. The resulting body is a
+ *  [Map].  The 'charset' parameter of the content type specifies the
+ *  encoding used for decoding. If no 'charset' is present the default
+ *  encoding of UTF-8 is used.
+ *
+ *  For content type `application/x-www-form-urlencoded` the body is a
+ *  query string which is then split according to the rules for
+ *  splitting a query string. The resulting body is a `Map<String,
+ *  String>`.  If the same name is present several times in the query
+ *  string, then the last value seen for this name will be in the
+ *  resulting map. The encoding US-ASCII is always used for decoding
+ *  the body.
+ *
+ *  For content type `multipart/form-data` the body is parsed into
+ *  it's different fields. The resulting body is a `Map<String,
+ *  dynamic>`, where the value is a [String] for normal fields and a
+ *  [HttpBodyFileUpload] instance for file upload fields. If the same
+ *  name is present several times, then the last value seen for this
+ *  name will be in the resulting map.
+ *
+ *  When using content type `multipart/form-data` the encoding of
+ *  fields with [String] values is determined by the browser sending
+ *  the HTTP request with the form data. The encoding is specified
+ *  either by the attribute `accept-charset` on the HTML form, or by
+ *  the content type of the web page containing the form. If the HTML
+ *  form has an `accept-charset` attribute the browser will use the
+ *  encoding specified there. If the HTML form has no `accept-charset`
+ *  attribute the browser determines the encoding from the content
+ *  type of the web page containing the form. Using a content type of
+ *  `text/html; charset=utf-8` for the page and setting
+ *  `accept-charset` on the HTML form to `utf-8` is recommended as the
+ *  default for [HttpBodyHandler] is UTF-8. It is important to get
+ *  these encoding values right, as the actual `multipart/form-data`
+ *  HTTP request sent by the browser does _not_ contain any
+ *  information on the encoding. If something else than UTF-8 is used
+ *  `defaultEncoding` needs to be set in the [HttpBodyHandler]
+ *  constructor and calls to [processRequest] and [processResponse].
+ *
+ *  For all other content types the body will be treated as
+ *  uninterpreted binary data. The resulting body will be of type
+ *  `List<int>`.
  *
  * To use with the [HttpServer] for request messages, [HttpBodyHandler] can be
  * used as either a [StreamTransformer] or as a per-request handler (see
@@ -31,11 +89,6 @@
  *           ...
  *         });
  *
- * The following mime-types will be handled specially:
- *   - text/\*
- *   - application/json
- *
- * All other mime-types will be returned as [List<int>].
  */
 class HttpBodyHandler
     implements StreamTransformer<HttpRequest, HttpRequestBody> {
@@ -45,9 +98,10 @@
    * Create a new [HttpBodyHandler] to be used with a [Stream]<[HttpRequest]>,
    * e.g. a [HttpServer].
    *
-   * If the page was served using different encoding than UTF-8, set
+   * If the page is served using different encoding than UTF-8, set
    * [defaultEncoding] accordingly. This is required for parsing
-   * 'application/x-www-form-urlencoded' content correctly.
+   * `multipart/form-data` content correctly. See the class comment
+   * for more information on `multipart/form-data`.
    */
   HttpBodyHandler({Encoding defaultEncoding: Encoding.UTF_8})
       : _transformer = new _HttpBodyHandlerTransformer(defaultEncoding);
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index 15d7ee8..b272976 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -216,7 +216,7 @@
       for (var redirect in redirects) {
         if (redirect.location == url) {
           return new Future.error(
-              new RedirectLoopException(redirects));
+              new RedirectException("Redirect loop detected", redirects));
         }
       }
     }
@@ -573,7 +573,7 @@
               },
               onError: (error) {
                 _socketError = true;
-                if (error is SocketIOException &&
+                if (error is SocketException &&
                     _outbound is HttpResponse) {
                   _cancel();
                   _done();
@@ -676,8 +676,11 @@
   _HttpRequest _httpRequest;
 
   _HttpResponse(String protocolVersion,
-                _HttpOutgoing _outgoing)
-      : super(protocolVersion, _outgoing);
+                _HttpOutgoing _outgoing,
+                String serverHeader)
+      : super(protocolVersion, _outgoing) {
+    if (serverHeader != null) headers.set('Server', serverHeader);
+  }
 
   List<Cookie> get cookies {
     if (_cookies == null) _cookies = new List<Cookie>();
@@ -894,7 +897,8 @@
         // End with exception, too many redirects.
         future = response.drain()
             .then((_) => new Future.error(
-                new RedirectLimitExceededException(response.redirects)));
+                new RedirectException("Redirect limit exceeded",
+                                      response.redirects)));
       }
     } else if (response._shouldAuthenticateProxy) {
       future = response._authenticate(true);
@@ -1149,6 +1153,9 @@
     request.headers.host = uri.host;
     request.headers.port = port;
     request.headers.set(HttpHeaders.ACCEPT_ENCODING, "gzip");
+    if (_httpClient.userAgent != null) {
+      request.headers.set('User-Agent', _httpClient.userAgent);
+    }
     if (proxy.isAuthenticated) {
       // If the proxy configuration contains user information use that
       // for proxy basic authorization.
@@ -1227,10 +1234,8 @@
               })
               // If we see a state error, we failed to get the 'first'
               // element.
-              // Transform the error to a HttpParserException, for
-              // consistency.
               .catchError((error) {
-                throw new HttpParserException(
+                throw new HttpException(
                     "Connection closed before data was received");
               }, test: (error) => error is StateError)
               .catchError((error) {
@@ -1346,6 +1351,8 @@
 
   Duration get idleTimeout => _idleTimeout;
 
+  String userAgent = _getHttpVersion();
+
   void set idleTimeout(Duration timeout) {
     _idleTimeout = timeout;
     _idleConnections.values.forEach(
@@ -1356,6 +1363,7 @@
         }));
   }
 
+
   Future<HttpClientRequest> open(String method,
                                  String host,
                                  int port,
@@ -1755,7 +1763,8 @@
           _state = _ACTIVE;
           var outgoing = new _HttpOutgoing(_socket);
           var response = new _HttpResponse(incoming.headers.protocolVersion,
-                                           outgoing);
+                                           outgoing,
+                                           _httpServer.serverHeader);
           var request = new _HttpRequest(response, incoming, _httpServer, this);
           _streamFuture = outgoing.done
               .then((_) {
@@ -1819,6 +1828,7 @@
 
 // HTTP server waiting for socket connections.
 class _HttpServer extends Stream<HttpRequest> implements HttpServer {
+  String serverHeader = _getHttpVersion();
 
   static Future<HttpServer> bind(address, int port, int backlog) {
     return ServerSocket.bind(address, port, backlog: backlog).then((socket) {
@@ -1842,10 +1852,16 @@
         });
   }
 
-  _HttpServer._(this._serverSocket, this._closeServer);
+  _HttpServer._(this._serverSocket, this._closeServer) {
+    _controller = new StreamController<HttpRequest>(sync: true,
+                                                    onCancel: close);
+  }
 
   _HttpServer.listenOn(ServerSocket this._serverSocket)
-      : _closeServer = false;
+      : _closeServer = false {
+    _controller = new StreamController<HttpRequest>(sync: true,
+                                                    onCancel: close);
+  }
 
   StreamSubscription<HttpRequest> listen(void onData(HttpRequest event),
                                          {void onError(error),
@@ -1937,8 +1953,7 @@
 
   // Set of currently connected clients.
   final Set<_HttpConnection> _connections = new Set<_HttpConnection>();
-  final StreamController<HttpRequest> _controller
-      = new StreamController<HttpRequest>(sync: true);
+  StreamController<HttpRequest> _controller;
 
   // TODO(ajohnsen): Use close queue?
 }
@@ -2344,3 +2359,11 @@
   final String method;
   final Uri location;
 }
+
+String _getHttpVersion() {
+  var version = new Options().version;
+  // Only include major and minor version numbers.
+  int index = version.indexOf('.', version.indexOf('.') + 1);
+  version = version.substring(0, index);
+  return 'Dart/$version (dart:io)';
+}
diff --git a/sdk/lib/io/http_parser.dart b/sdk/lib/io/http_parser.dart
index 8edaa0c..bcd27e0 100644
--- a/sdk/lib/io/http_parser.dart
+++ b/sdk/lib/io/http_parser.dart
@@ -273,10 +273,10 @@
     assert(!_parserCalled);
     _parserCalled = true;
     if (_state == _State.CLOSED) {
-      throw new HttpParserException("Data on closed connection");
+      throw new HttpException("Data on closed connection");
     }
     if (_state == _State.FAILURE) {
-      throw new HttpParserException("Data on failed connection");
+      throw new HttpException("Data on failed connection");
     }
     while (_buffer != null &&
            _index < _buffer.length &&
@@ -298,11 +298,11 @@
           } else {
             // Start parsing method.
             if (!_isTokenChar(byte)) {
-              throw new HttpParserException("Invalid request method");
+              throw new HttpException("Invalid request method");
             }
             _method_or_status_code.add(byte);
             if (!_requestParser) {
-              throw new HttpParserException("Invalid response line");
+              throw new HttpException("Invalid response line");
             }
             _state = _State.REQUEST_LINE_METHOD;
           }
@@ -319,7 +319,7 @@
             // method anymore.
             _httpVersionIndex++;
             if (_requestParser) {
-              throw new HttpParserException("Invalid request line");
+              throw new HttpException("Invalid request line");
             }
             _state = _State.RESPONSE_HTTP_VERSION;
           } else {
@@ -333,7 +333,7 @@
               _method_or_status_code.add(byte);
               _httpVersion = _HttpVersion.UNDETERMINED;
               if (!_requestParser) {
-                throw new HttpParserException("Invalid response line");
+                throw new HttpException("Invalid response line");
               }
               _state = _State.REQUEST_LINE_METHOD;
             }
@@ -362,7 +362,7 @@
             // HTTP version parsed.
             _state = _State.RESPONSE_LINE_STATUS_CODE;
           } else {
-            throw new HttpParserException("Invalid response line");
+            throw new HttpException("Invalid response line");
           }
           break;
 
@@ -371,7 +371,7 @@
             _state = _State.REQUEST_LINE_URI;
           } else {
             if (_Const.SEPARATORS_AND_CR_LF.indexOf(byte) != -1) {
-              throw new HttpParserException("Invalid request method");
+              throw new HttpException("Invalid request method");
             }
             _method_or_status_code.add(byte);
           }
@@ -380,13 +380,13 @@
         case _State.REQUEST_LINE_URI:
           if (byte == _CharCode.SP) {
             if (_uri_or_reason_phrase.length == 0) {
-              throw new HttpParserException("Invalid request URI");
+              throw new HttpException("Invalid request URI");
             }
             _state = _State.REQUEST_LINE_HTTP_VERSION;
             _httpVersionIndex = 0;
           } else {
             if (byte == _CharCode.CR || byte == _CharCode.LF) {
-              throw new HttpParserException("Invalid request URI");
+              throw new HttpException("Invalid request URI");
             }
             _uri_or_reason_phrase.add(byte);
           }
@@ -408,7 +408,7 @@
               _persistentConnection = false;
               _httpVersionIndex++;
             } else {
-              throw new HttpParserException("Invalid response line");
+              throw new HttpException("Invalid response line");
             }
           } else {
             _expect(byte, _CharCode.CR);
@@ -425,12 +425,12 @@
         case _State.RESPONSE_LINE_STATUS_CODE:
           if (byte == _CharCode.SP) {
             if (_method_or_status_code.length != 3) {
-              throw new HttpParserException("Invalid response status code");
+              throw new HttpException("Invalid response status code");
             }
             _state = _State.RESPONSE_LINE_REASON_PHRASE;
           } else {
             if (byte < 0x30 && 0x39 < byte) {
-              throw new HttpParserException("Invalid response status code");
+              throw new HttpException("Invalid response status code");
             } else {
               _method_or_status_code.add(byte);
             }
@@ -442,7 +442,7 @@
             _state = _State.RESPONSE_LINE_ENDING;
           } else {
             if (byte == _CharCode.CR || byte == _CharCode.LF) {
-              throw new HttpParserException("Invalid response reason phrase");
+              throw new HttpException("Invalid response reason phrase");
             }
             _uri_or_reason_phrase.add(byte);
           }
@@ -454,7 +454,7 @@
           _statusCode = int.parse(
               new String.fromCharCodes(_method_or_status_code));
           if (_statusCode < 100 || _statusCode > 599) {
-            throw new HttpParserException("Invalid response status code");
+            throw new HttpException("Invalid response status code");
           } else {
             // Check whether this response will never have a body.
             _noMessageBody = _statusCode <= 199 || _statusCode == 204 ||
@@ -479,7 +479,7 @@
             _state = _State.HEADER_VALUE_START;
           } else {
             if (!_isTokenChar(byte)) {
-              throw new HttpParserException("Invalid header field name");
+              throw new HttpException("Invalid header field name");
             }
             _headerField.add(_toLowerCase(byte));
           }
@@ -728,8 +728,7 @@
           !(_state == _State.START && !_requestParser) &&
           !(_state == _State.BODY && !_chunked && _transferLength == -1)) {
         _bodyController.addError(
-              new HttpParserException(
-                  "Connection closed while receiving data"));
+              new HttpException("Connection closed while receiving data"));
       }
       _closeIncoming(true);
       _controller.close();
@@ -738,7 +737,7 @@
     // If the connection is idle the HTTP stream is closed.
     if (_state == _State.START) {
       if (!_requestParser) {
-        error(new HttpParserException(
+        error(new HttpException(
                     "Connection closed before full header was received"));
       }
       _controller.close();
@@ -754,7 +753,7 @@
       _state = _State.FAILURE;
       // Report the error through the error callback if any. Otherwise
       // throw the error.
-      error(new HttpParserException(
+      error(new HttpException(
                   "Connection closed before full header was received"));
       _controller.close();
       return;
@@ -766,7 +765,7 @@
       _state = _State.FAILURE;
       // Report the error through the error callback if any. Otherwise
       // throw the error.
-      error(new HttpParserException(
+      error(new HttpException(
                   "Connection closed before full body was received"));
     }
     _controller.close();
@@ -863,7 +862,7 @@
 
   int _expect(int val1, int val2) {
     if (val1 != val2) {
-      throw new HttpParserException("Failed to parse HTTP");
+      throw new HttpException("Failed to parse HTTP");
     }
   }
 
@@ -875,7 +874,7 @@
     } else if (0x61 <= byte && byte <= 0x66) {
       return byte - 0x61 + 10;  // a - f
     } else {
-      throw new HttpParserException("Failed to parse HTTP");
+      throw new HttpException("Failed to parse HTTP");
     }
   }
 
@@ -988,10 +987,3 @@
   StreamController<_HttpIncoming> _controller;
   StreamController<List<int>> _bodyController;
 }
-
-
-class HttpParserException implements Exception {
-  const HttpParserException([String this.message = ""]);
-  String toString() => "HttpParserException: $message";
-  final String message;
-}
diff --git a/sdk/lib/io/link.dart b/sdk/lib/io/link.dart
index ddca031..955622f 100644
--- a/sdk/lib/io/link.dart
+++ b/sdk/lib/io/link.dart
@@ -68,7 +68,7 @@
    * the link when it has been deleted. This does not delete, or otherwise
    * affect, the target of the link. It also works on broken links, but if
    * the link does not exist or is not actually a link, it completes the
-   * future with a LinkIOException.
+   * future with a LinkException.
    */
   Future<Link> delete();
 
@@ -76,7 +76,7 @@
    * Synchronously deletes the link. This does not delete, or otherwise
    * affect, the target of the link.  It also works on broken links, but if
    * the link does not exist or is not actually a link, it throws a
-   * LinkIOException.
+   * LinkException.
    */
   void deleteSync();
 
@@ -88,7 +88,7 @@
    * directory containing the link.
    *
    * If the link does not exist, or is not a link, the future completes with
-   * a LinkIOException.
+   * a LinkException.
    */
   Future<String> target();
 
@@ -98,7 +98,7 @@
    * If the returned target is a relative path, it is relative to the
    * directory containing the link.
    *
-   * If the link does not exist, or is not a link, throws a LinkIOException.
+   * If the link does not exist, or is not a link, throws a LinkException.
    */
   String targetSync();
 }
@@ -213,7 +213,7 @@
 
   static throwIfError(Object result, String msg) {
     if (result is OSError) {
-      throw new LinkIOException(msg, result);
+      throw new LinkException(msg, result);
     }
   }
 
@@ -235,7 +235,7 @@
       case _OSERROR_RESPONSE:
         var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
                               response[_OSERROR_RESPONSE_ERROR_CODE]);
-        return new LinkIOException(message, err);
+        return new LinkException(message, err);
       default:
         return new Exception("Unknown error");
     }
@@ -243,13 +243,13 @@
 }
 
 
-class LinkIOException implements Exception {
-  const LinkIOException([String this.message = "",
+class LinkException implements IOException {
+  const LinkException([String this.message = "",
                          String this.path = "",
                          OSError this.osError = null]);
   String toString() {
     StringBuffer sb = new StringBuffer();
-    sb.write("LinkIOException");
+    sb.write("LinkException");
     if (!message.isEmpty) {
       sb.write(": $message");
       if (path != null) {
diff --git a/sdk/lib/io/mime_multipart_parser.dart b/sdk/lib/io/mime_multipart_parser.dart
index 1e3c548..e4d8f8a 100644
--- a/sdk/lib/io/mime_multipart_parser.dart
+++ b/sdk/lib/io/mime_multipart_parser.dart
@@ -398,7 +398,7 @@
 }
 
 
-class MimeMultipartException implements Exception {
+class MimeMultipartException implements IOException {
   const MimeMultipartException([String this.message = ""]);
   String toString() => "MimeMultipartException: $message";
   final String message;
diff --git a/sdk/lib/io/options.dart b/sdk/lib/io/options.dart
index 91a8e58..7b483e5 100644
--- a/sdk/lib/io/options.dart
+++ b/sdk/lib/io/options.dart
@@ -41,6 +41,12 @@
    * string is returned.
    */
   String get script;
+
+
+  /**
+   * Returns the version of the current dart runtime.
+   */
+  String get version;
 }
 
 class _OptionsImpl implements Options {
@@ -60,6 +66,8 @@
     return _nativeScript;
   }
 
+  external String get version;
+
   List<String> _arguments = null;
 
   // This arguments singleton is written to by the embedder if applicable.
diff --git a/sdk/lib/io/process.dart b/sdk/lib/io/process.dart
index a8e7bbc..808bce5 100644
--- a/sdk/lib/io/process.dart
+++ b/sdk/lib/io/process.dart
@@ -255,7 +255,7 @@
 }
 
 
-class ProcessException implements Exception {
+class ProcessException implements IOException {
   const ProcessException(String this.executable,
                          List<String> this.arguments,
                          [String this.message = "",
diff --git a/sdk/lib/io/secure_server_socket.dart b/sdk/lib/io/secure_server_socket.dart
index 18966a3..e9da3c6 100644
--- a/sdk/lib/io/secure_server_socket.dart
+++ b/sdk/lib/io/secure_server_socket.dart
@@ -227,18 +227,14 @@
         _controller.add(secureConnection);
       }
     }).catchError((e) {
-      if (_closed) {
-        throw e;
-      } else {
+      if (!_closed) {
         _controller.addError(e);
-        close();
       }
     });
   }
 
   void _onError(e) {
     _controller.addError(e);
-    close();
   }
 
   void _onDone() {
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index 0db4e46..05ec18c 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -614,7 +614,7 @@
 
   List<int> read([int len]) {
     if (_closedRead) {
-      throw new SocketIOException("Reading from a closed socket");
+      throw new SocketException("Reading from a closed socket");
     }
     if (_status != CONNECTED) {
       return null;
@@ -663,7 +663,7 @@
   // up handlers to flush the pipeline when possible.
   int write(List<int> data, [int offset, int bytes]) {
     if (_closedWrite) {
-      _controller.addError(new SocketIOException("Writing to a closed socket"));
+      _controller.addError(new SocketException("Writing to a closed socket"));
       return 0;
     }
     if (_status != CONNECTED) return 0;
@@ -750,7 +750,7 @@
     } else {
       if (_status != CONNECTED) {
         // Cannot happen.
-        throw new SocketIOException("Internal SocketIO Error");
+        throw new SocketException("Internal SocketIO Error");
       }
       try {
         _readEncryptedData();
@@ -783,12 +783,12 @@
 
   void _reportError(e, String message) {
     // TODO(whesse): Call _reportError from all internal functions that throw.
-    if (e is SocketIOException) {
-      e = new SocketIOException('$message (${e.message})', e.osError);
+    if (e is SocketException) {
+      e = new SocketException('$message (${e.message})', e.osError);
     } else if (e is OSError) {
-      e = new SocketIOException(message, e);
+      e = new SocketException(message, e);
     } else {
-      e = new SocketIOException('$message (${e.toString()})', null);
+      e = new SocketException('$message (${e.toString()})', null);
     }
     if (_connectPending) {
       _handshakeComplete.completeError(e);
@@ -811,7 +811,7 @@
       }
     } else if (_status == HANDSHAKE) {
       _reportError(
-          new SocketIOException('Connection terminated during handshake'),
+          new SocketException('Connection terminated during handshake'),
           'handshake error');
     }
   }
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index 040cf39..7164bf1 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -409,12 +409,12 @@
 }
 
 
-class SocketIOException implements Exception {
-  const SocketIOException([String this.message = "",
-                           OSError this.osError = null]);
+class SocketException implements IOException {
+  const SocketException([String this.message = "",
+                         OSError this.osError = null]);
   String toString() {
     StringBuffer sb = new StringBuffer();
-    sb.write("SocketIOException");
+    sb.write("SocketException");
     if (!message.isEmpty) {
       sb.write(": $message");
       if (osError != null) {
diff --git a/sdk/lib/io/websocket.dart b/sdk/lib/io/websocket.dart
index 994fdec..370d694 100644
--- a/sdk/lib/io/websocket.dart
+++ b/sdk/lib/io/websocket.dart
@@ -153,7 +153,7 @@
 }
 
 
-class WebSocketException implements Exception {
+class WebSocketException implements IOException {
   const WebSocketException([String this.message = ""]);
   String toString() => "WebSocketException: $message";
   final String message;
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index 5269d55..a61c68d 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -340,7 +340,7 @@
 
   ScriptProcessorNode createScriptProcessor(int bufferSize,
       [int numberOfInputChannels, int numberOfOutputChannels]) {
-    var function = JS('dynamic', '#.createScriptProcessor || '
+    var function = JS('=Object', '#.createScriptProcessor || '
         '#.createJavaScriptNode', this, this);
     if (numberOfOutputChannels != null) {
       return JS('ScriptProcessorNode', '#.call(#, #, #, #)', function, this,
@@ -1050,7 +1050,6 @@
 
   @DomName('WaveShaperNode.oversample')
   @DocsEditable
-  @Experimental // untriaged
   String oversample;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index 2f3e649..94ece93 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -1316,12 +1316,10 @@
 
   @DomName('WaveShaperNode.oversample')
   @DocsEditable
-  @Experimental // untriaged
   String get oversample native "WaveShaperNode_oversample_Getter";
 
   @DomName('WaveShaperNode.oversample')
   @DocsEditable
-  @Experimental // untriaged
   void set oversample(String value) native "WaveShaperNode_oversample_Setter";
 
 }
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index efa45f5..1cad109 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -677,7 +677,8 @@
 
 @DocsEditable
 @DomName('EXTFragDepth')
-@Experimental // untriaged
+// http://www.khronos.org/registry/webgl/extensions/EXT_frag_depth/
+@Experimental
 class ExtFragDepth native "EXTFragDepth" {
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2295,6 +2296,8 @@
 
   @DomName('WebGLRenderingContext.getBufferParameter')
   @DocsEditable
+  @Creates('int|Null')
+  @Returns('int|Null')
   Object getBufferParameter(int target, int pname) native;
 
   @DomName('WebGLRenderingContext.getContextAttributes')
@@ -2311,6 +2314,8 @@
 
   @DomName('WebGLRenderingContext.getFramebufferAttachmentParameter')
   @DocsEditable
+  @Creates('int|Renderbuffer|Texture|Null')
+  @Returns('int|Renderbuffer|Texture|Null')
   Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native;
 
   @DomName('WebGLRenderingContext.getParameter')
@@ -2325,10 +2330,14 @@
 
   @DomName('WebGLRenderingContext.getProgramParameter')
   @DocsEditable
+  @Creates('int|bool|Null')
+  @Returns('int|bool|Null')
   Object getProgramParameter(Program program, int pname) native;
 
   @DomName('WebGLRenderingContext.getRenderbufferParameter')
   @DocsEditable
+  @Creates('int|Null')
+  @Returns('int|Null')
   Object getRenderbufferParameter(int target, int pname) native;
 
   @DomName('WebGLRenderingContext.getShaderInfoLog')
@@ -2337,6 +2346,8 @@
 
   @DomName('WebGLRenderingContext.getShaderParameter')
   @DocsEditable
+  @Creates('int|Null')
+  @Returns('int|Null')
   Object getShaderParameter(Shader shader, int pname) native;
 
   @DomName('WebGLRenderingContext.getShaderPrecisionFormat')
@@ -2353,10 +2364,14 @@
 
   @DomName('WebGLRenderingContext.getTexParameter')
   @DocsEditable
+  @Creates('int|Null')
+  @Returns('int|Null')
   Object getTexParameter(int target, int pname) native;
 
   @DomName('WebGLRenderingContext.getUniform')
   @DocsEditable
+  @Creates('Null|num|String|bool|=List|Float32List|Int32List|Uint32List')
+  @Returns('Null|num|String|bool|=List|Float32List|Int32List|Uint32List')
   Object getUniform(Program program, UniformLocation location) native;
 
   @DomName('WebGLRenderingContext.getUniformLocation')
@@ -2365,6 +2380,8 @@
 
   @DomName('WebGLRenderingContext.getVertexAttrib')
   @DocsEditable
+  @Creates('Null|num|bool|Float32List|Buffer')
+  @Returns('Null|num|bool|Float32List|Buffer')
   Object getVertexAttrib(int index, int pname) native;
 
   @DomName('WebGLRenderingContext.getVertexAttribOffset')
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index d3e5ddc..a1e5550 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -745,7 +745,8 @@
 
 @DocsEditable
 @DomName('EXTFragDepth')
-@Experimental // untriaged
+// http://www.khronos.org/registry/webgl/extensions/EXT_frag_depth/
+@Experimental
 class ExtFragDepth extends NativeFieldWrapperClass1 {
   ExtFragDepth.internal();
 
diff --git a/tests/compiler/dart2js/backend_htype_list_test.dart b/tests/compiler/dart2js/backend_htype_list_test.dart
deleted file mode 100644
index 67acff3..0000000
--- a/tests/compiler/dart2js/backend_htype_list_test.dart
+++ /dev/null
@@ -1,243 +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.
-
-import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart';
-
-import 'compiler_helper.dart';
-import 'parser_helper.dart';
-
-// Source names used throughout the tests.
-const SourceString x = const SourceString("x");
-const SourceString p1 = const SourceString("p1");
-const SourceString p2 = const SourceString("p2");
-const SourceString p3 = const SourceString("p3");
-
-// Lists of types.
-List<HType> B;
-List<HType> I;
-List<HType> II;
-List<HType> IBS;
-List<HType> IIS;
-List<HType> BII;
-List<HType> IBI;
-List<HType> IIB;
-List<HType> III;
-
-FunctionSignature compileAndFindSignature(String code,
-                                          String className,
-                                          String memberName) {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(code, uri);
-  compiler.runCompiler(uri);
-  var cls = findElement(compiler, className);
-  var member = cls.lookupLocalMember(buildSourceString(memberName));
-  var signature = member.computeSignature(compiler);
-  return signature;
-}
-
-HTypeList createHTypeList(List<HType> types) {
-  HTypeList result = new HTypeList(types.length);
-  result.types.setRange(0, result.length, types);
-  return result;
-}
-
-HTypeList createHTypeListWithNamed(List<HType> types,
-                                   List<SourceString> namedArguments) {
-  HTypeList result = new HTypeList.withNamedArguments(types.length,
-                                                      namedArguments);
-  result.types.setRange(0, result.length, types);
-  return result;
-}
-
-void checkHTypeList(HTypeList types, List<HType> expected) {
-  Expect.equals(expected.length, types.length);
-  for (int i = 0; i < expected.length; i++) {
-    Expect.equals(expected[i], types.types[i]);
-  }
-}
-
-const String TEST_1 = r"""
-  class A {
-    x(p) => null;
-  }
-  main() {
-    new A().x(1);
-  }
-""";
-
-test1() {
-  FunctionSignature signature = compileAndFindSignature(TEST_1, "A", "x");
-  HTypeList types = createHTypeList(I);
-  Selector s = new Selector.call(x, null, 1);
-  types = types.unionWithOptionalParameters(s, signature, null);
-  checkHTypeList(types, I);
-}
-
-const String TEST_2 = r"""
-  class A {
-    x(p1, [p2, p3]) => null;
-  }
-  main() {
-    new A().x(1);
-  }
-""";
-
-test2_1() {
-  FunctionSignature signature = compileAndFindSignature(TEST_2, "A", "x");
-  HTypeList types = createHTypeList(<HType>[HType.INTEGER]);
-  Selector s = new Selector.call(x, null, 1);
-
-  OptionalParameterTypes defaultTypes;
-  defaultTypes = new OptionalParameterTypes(2);
-  defaultTypes.update(0, p2, HType.BOOLEAN);
-  defaultTypes.update(1, p3, HType.STRING);
-
-  HTypeList t2 = types.unionWithOptionalParameters(s, signature, defaultTypes);
-  checkHTypeList(t2, IBS);
-}
-
-test2_2() {
-  FunctionSignature signature = compileAndFindSignature(TEST_2, "A", "x");
-  HTypeList types = createHTypeList(II);
-  Selector s = new Selector.call(x, null, 2);
-
-  OptionalParameterTypes defaultTypes;
-  defaultTypes = new OptionalParameterTypes(2);
-  defaultTypes.update(0, p2, HType.BOOLEAN);
-  defaultTypes.update(1, p3, HType.STRING);
-
-  HTypeList t2 = types.unionWithOptionalParameters(s, signature, defaultTypes);
-  checkHTypeList(t2, IIS);
-}
-
-
-test2_3() {
-  FunctionSignature signature = compileAndFindSignature(TEST_2, "A", "x");
-  HTypeList types = createHTypeList(III);
-  Selector s = new Selector.call(x, null, 3);
-
-  OptionalParameterTypes defaultTypes;
-  defaultTypes = new OptionalParameterTypes(2);
-  defaultTypes.update(0, p2, HType.BOOLEAN);
-  defaultTypes.update(1, p3, HType.STRING);
-
-  HTypeList t2 = types.unionWithOptionalParameters(s, signature, defaultTypes);
-  checkHTypeList(t2, III);
-}
-
-
-const String TEST_3 = r"""
-  class A {
-    x(p1, [p2, p3]) => null;
-  }
-  main() {
-    new A().x(1);
-  }
-""";
-
-test3_1() {
-  FunctionSignature signature = compileAndFindSignature(TEST_3, "A", "x");
-
-  OptionalParameterTypes defaultTypes;
-  defaultTypes = new OptionalParameterTypes(2);
-  defaultTypes.update(0, p2, HType.BOOLEAN);
-  defaultTypes.update(1, p3, HType.STRING);
-
-  HTypeList types;
-  Selector s;
-  HTypeList result;
-
-  s = new Selector.call(x, null, 2, <SourceString>[p2]);
-  types = createHTypeListWithNamed(II, <SourceString>[p2]);
-  result = types.unionWithOptionalParameters(s, signature, defaultTypes);
-  checkHTypeList(result, IIS);
-
-  s = new Selector.call(x, null, 2, <SourceString>[p3]);
-  types = createHTypeListWithNamed(II, <SourceString>[p3]);
-  result = types.unionWithOptionalParameters(s, signature, defaultTypes);
-  checkHTypeList(result, IBI);
-}
-
-test3_2() {
-  FunctionSignature signature = compileAndFindSignature(TEST_2, "A", "x");
-
-  OptionalParameterTypes defaultTypes;
-  defaultTypes = new OptionalParameterTypes(2);
-  defaultTypes.update(0, p2, HType.BOOLEAN);
-  defaultTypes.update(1, p3, HType.STRING);
-
-  HTypeList types;
-  Selector s;
-  HTypeList result;
-
-  s = new Selector.call(x, null, 2, <SourceString>[p2, p3]);
-  types = createHTypeListWithNamed(III, <SourceString>[p2, p3]);
-  result = types.unionWithOptionalParameters(s1, signature, defaultTypes);
-  checkHTypeList(result, III);
-
-  s = new Selector.call(x, null, 2, <SourceString>[p3, p3]);
-  types = createHTypeListWithNamed(III, <SourceString>[p2, p3]);
-  result = types.unionWithOptionalParameters(s2, signature, defaultTypes);
-  checkHTypeList(result, III);
-}
-
-
-const String TEST_4 = r"""
-  class A {
-    x([p1, p2, p3]) => null;
-  }
-  main() {
-    new A().x();
-  }
-""";
-
-test4() {
-  FunctionSignature signature = compileAndFindSignature(TEST_4, "A", "x");
-
-  OptionalParameterTypes defaultTypes;
-  defaultTypes = new OptionalParameterTypes(3);
-  defaultTypes.update(0, p1, HType.INTEGER);
-  defaultTypes.update(1, p2, HType.INTEGER);
-  defaultTypes.update(2, p3, HType.INTEGER);
-
-  HTypeList types;
-  Selector s;
-  HTypeList result;
-
-  s = new Selector.call(x, null, 1, <SourceString>[p1]);
-  types = createHTypeListWithNamed(B, <SourceString>[p1]);
-  result = types.unionWithOptionalParameters(s, signature, defaultTypes);
-  checkHTypeList(result, BII);
-
-  s = new Selector.call(x, null, 1, <SourceString>[p2]);
-  types = createHTypeListWithNamed(B, <SourceString>[p2]);
-  result = types.unionWithOptionalParameters(s, signature, defaultTypes);
-  checkHTypeList(result, IBI);
-
-  s = new Selector.call(x, null, 1, <SourceString>[p3]);
-  types = createHTypeListWithNamed(B, <SourceString>[p3]);
-  result = types.unionWithOptionalParameters(s, signature, defaultTypes);
-  checkHTypeList(result, IIB);
-}
-
-main() {
-  B = <HType>[HType.BOOLEAN];
-  I = <HType>[HType.INTEGER];
-  II = <HType>[HType.INTEGER, HType.INTEGER];
-  IBS = <HType>[HType.INTEGER, HType.BOOLEAN, HType.STRING];
-  IIS = <HType>[HType.INTEGER, HType.INTEGER, HType.STRING];
-  BII = <HType>[HType.BOOLEAN, HType.INTEGER, HType.INTEGER];
-  IBI = <HType>[HType.INTEGER, HType.BOOLEAN, HType.INTEGER];
-  IIB = <HType>[HType.INTEGER, HType.INTEGER, HType.BOOLEAN];
-  III = <HType>[HType.INTEGER, HType.INTEGER, HType.INTEGER];
-
-  test1();
-  test2_1();
-  test2_2();
-  test2_3();
-  test3_1();
-  test4();
-}
diff --git a/tests/compiler/dart2js/call_site_type_inferer_static_test.dart b/tests/compiler/dart2js/call_site_type_inferer_static_test.dart
deleted file mode 100644
index e8a1f0b..0000000
--- a/tests/compiler/dart2js/call_site_type_inferer_static_test.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.
-
-import "package:expect/expect.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart";
-
-import 'compiler_helper.dart';
-import 'parser_helper.dart';
-
-void compileAndFind(String code,
-                    String functionName,
-                    bool disableInlining,
-                    check(compiler, element)) {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(code, uri);
-  compiler.disableInlining = disableInlining;
-  compiler.runCompiler(uri);
-  var fun = findElement(compiler, functionName);
-  return check(compiler, fun);
-}
-
-// The 'f' function has an 'if' to make it non-inlinable.
-const String TEST_ONE = r"""
-  f(p) { if (p == null) return p; return p; }
-  main() { f("s"); }
-""";
-
-const String TEST_TWO = r"""
-  f(p) { if (p == null) return p; return p; }
-  main() { f(1); }
-""";
-
-const String TEST_THREE = r"""
-  f(p) { if (p == null) return p; return p; }
-  main() { f(1); f(2); }
-""";
-
-const String TEST_FOUR = r"""
-  f(p) { if (p == null) return p; return p; }
-  main() { f(1.1); }
-""";
-
-const String TEST_FIVE = r"""
-  f(p) { if (p == null) return p; return p; }
-  main() { f(1); f(2.2); }
-""";
-
-const String TEST_SIX = r"""
-  f(p) { if (p == null) return p; return p; }
-  main() { f(1.1); f(2); }
-""";
-
-const String TEST_SEVEN = r"""
-  f(p) { if (p == null) return p; return p; }
-  main() { f(1); f("s"); }
-""";
-
-const String TEST_EIGHT = r"""
-  f(p1, p2) { if (p1 == null) return p1; return p2; }
-  main() { f(1, 2); f(1, "s"); }
-""";
-
-const String TEST_NINE = r"""
-  f(p1, p2) { if (p1 == null) return p1; return p2; }
-  main() { f("s", 2); f(1, "s"); }
-""";
-
-const String TEST_TEN = r"""
-  f(p) { if (p == null) return p; return p; }
-  g(p) { if (p== null) return null; return p(1); }
-  main() { f(1); g(f); }
-""";
-
-void doTest(String test,
-            bool enableInlining,
-            List<Function> expectedTypes) {
-  compileAndFind(
-    test,
-    'f',
-    enableInlining,
-    (compiler, x) {
-      HTypeList types = compiler.backend.optimisticParameterTypes(x, null);
-      if (expectedTypes != null) {
-        Expect.isFalse(types.allUnknown);
-        Expect.listEquals(
-            expectedTypes.map((f) => f(compiler)).toList(),
-            types.types.map((e) => e.simplify(compiler)).toList());
-      } else {
-        Expect.isTrue(types.allUnknown);
-      }
-  });
-}
-
-void runTest(String test, [List<Function> expectedTypes]) {
-  doTest(test, false, expectedTypes);
-  doTest(test, true, expectedTypes);
-}
-
-void test() {
-  subclassOfInterceptor(compiler) =>
-      findHType(compiler, 'Interceptor', 'nonNullSubclass');
-
-  runTest(TEST_ONE, [(compiler) => HType.STRING]);
-  runTest(TEST_TWO, [(compiler) => HType.INTEGER]);
-  runTest(TEST_THREE, [(compiler) => HType.INTEGER]);
-  runTest(TEST_FOUR, [(compiler) => HType.DOUBLE]);
-  runTest(TEST_FIVE, [(compiler) => HType.NUMBER]);
-  runTest(TEST_SIX, [(compiler) => HType.NUMBER]);
-  runTest(TEST_SEVEN, [subclassOfInterceptor]);
-  runTest(TEST_EIGHT, [(compiler) => HType.INTEGER, subclassOfInterceptor]);
-  runTest(TEST_NINE, [subclassOfInterceptor, subclassOfInterceptor]);
-  runTest(TEST_TEN);
-}
-
-void main() {
-  test();
-}
diff --git a/tests/compiler/dart2js/call_site_type_inferer_test.dart b/tests/compiler/dart2js/call_site_type_inferer_test.dart
deleted file mode 100644
index 7e75dd1..0000000
--- a/tests/compiler/dart2js/call_site_type_inferer_test.dart
+++ /dev/null
@@ -1,293 +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.
-
-import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart';
-
-import 'compiler_helper.dart';
-import 'parser_helper.dart';
-
-void compileAndFind(String code,
-                    String className,
-                    String memberName,
-                    bool disableInlining,
-                    check(compiler, element)) {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(code, uri);
-  compiler.disableInlining = disableInlining;
-  compiler.runCompiler(uri);
-  var cls = findElement(compiler, className);
-  var member = cls.lookupLocalMember(buildSourceString(memberName));
-  return check(compiler, member);
-}
-
-const String TEST_1 = r"""
-  class A {
-    x(p) => p;
-  }
-  main() { new A().x("s"); }
-""";
-
-const String TEST_2 = r"""
-  class A {
-    x(p) => p;
-  }
-  main() { new A().x(1); }
-""";
-
-const String TEST_3 = r"""
-  class A {
-    x(p) => x(p - 1);
-  }
-  main() { new A().x(1); }
-""";
-
-const String TEST_4 = r"""
-  class A {
-    x(p) => x(p - 1);
-  }
-  main() { new A().x(1.5); }
-""";
-
-const String TEST_5 = r"""
-  class A {
-    x(p) => p;
-  }
-  main() {
-    new A().x(1);
-    new A().x(1.5);
-  }
-""";
-
-const String TEST_6 = r"""
-  class A {
-    x(p) => p;
-  }
-  main() {
-    new A().x(1.5);
-    new A().x(1);
-  }
-""";
-
-const String TEST_7a = r"""
-  class A {
-    x(p) => x("x");
-  }
-  main() {
-    new A().x(1);
-  }
-""";
-
-const String TEST_7b = r"""
-  class A {
-    x(p) => x("x");
-  }
-  main() {
-    new A().x({});
-  }
-""";
-
-const String TEST_8 = r"""
-  class A {
-    x(p1, p2, p3) => x(p1, "x", {});
-  }
-  main() {
-    new A().x(1, 2, 3);
-  }
-""";
-
-const String TEST_9 = r"""
-  class A {
-    x(p1, p2) => x(p1, p2);
-  }
-  main() {
-    new A().x(1, 2);
-  }
-""";
-
-const String TEST_10 = r"""
-  class A {
-    x(p1, p2) => x(p1, p2);
-  }
-  void f(p) {
-    p.x("x", "y");
-  }
-  main() {
-    f(null);
-    new A().x(1, 2);
-  }
-""";
-
-const String TEST_11 = r"""
-  class A {
-    x(p1, p2) => x(1, 2);
-  }
-  main() {
-    new A().x("x", "y");
-  }
-""";
-
-const String TEST_12 = r"""
-  class A {
-    x(p1, [p2 = 1]) => 1;
-  }
-  main() {
-    new A().x("x", 1);
-    new A().x("x");
-  }
-""";
-
-const String TEST_13 = r"""
-  class A {
-    x(p) => 1;
-  }
-  f(p) => p.x(2.2);
-  main() {
-    new A().x(1);
-    f(new A());
-  }
-""";
-
-const String TEST_14 = r"""
-  class A {
-    x(p1, [p2 = "s"]) => 1;
-  }
-  main() {
-    new A().x(1);
-  }
-""";
-
-const String TEST_15 = r"""
-  class A {
-    x(p1, [p2 = true]) => 1;
-  }
-  f(p) => p.a("x");
-  main() {
-    new A().x("x");
-    new A().x("x", false);
-    f(null);
-  }
-""";
-
-const String TEST_16 = r"""
-  class A {
-    x(p1, [p2 = 1, p3 = "s"]) => 1;
-  }
-  main() {
-    new A().x(1);
-    new A().x(1, 2);
-    new A().x(1, 2, "x");
-    new A().x(1, p2: 2);
-    new A().x(1, p3: "x");
-    new A().x(1, p3: "x", p2: 2);
-    new A().x(1, p2: 2, p3: "x");
-  }
-""";
-
-const String TEST_17 = r"""
-  class A {
-    x(p1, [p2 = 1, p3 = "s"]) => 1;
-  }
-  main() {
-    new A().x(1, true, 1.1);
-    new A().x(1, false, 2.2);
-    new A().x(1, p3: 3.3, p2: true);
-    new A().x(1, p2: false, p3: 4.4);
-  }
-""";
-
-const String TEST_18 = r"""
-  class A {
-    x(p1, p2) => x(p1, p2);
-  }
-  class B extends A {
-  }
-  main() {
-    new B().x("a", "b");
-    new A().x(1, 2);
-  }
-""";
-
-void doTest(String test,
-            bool disableInlining,
-            List expectedTypes,  // HTypes, or functions constructing HTypes.
-            OptionalParameterTypes defaultTypes) {
-  compileAndFind(
-    test,
-    'A',
-    'x',
-    disableInlining,
-    (compiler, x) {
-      HTypeList types =
-          compiler.backend.optimisticParameterTypes(x, defaultTypes);
-      if (expectedTypes != null) {
-        expectedTypes = expectedTypes
-            .map((e) => e is HType ? e : e(compiler))
-            .toList();
-        Expect.isFalse(types.allUnknown);
-        Expect.equals(expectedTypes.length, types.types.length);
-        Expect.listEquals(expectedTypes,
-            types.types.map((t) => t.simplify(compiler)).toList());
-      } else {
-        Expect.isTrue(types.allUnknown);
-      }
-  });
-}
-
-void runTest(String test,
-             [List<HType> expectedTypes,
-              OptionalParameterTypes defaultTypes]) {
-  doTest(test, true, expectedTypes, defaultTypes);
-}
-
-void test() {
-  OptionalParameterTypes defaultTypes;
-
-  subclassOfInterceptor(compiler) =>
-      findHType(compiler, 'Interceptor', 'nonNullSubclass');
-
-  runTest(TEST_1, [HType.STRING]);
-  runTest(TEST_2, [HType.INTEGER]);
-  runTest(TEST_3, [HType.INTEGER]);
-  runTest(TEST_4, [HType.DOUBLE]);
-  runTest(TEST_5, [HType.NUMBER]);
-  runTest(TEST_6, [HType.NUMBER]);
-  runTest(TEST_7a, [subclassOfInterceptor]);
-  runTest(TEST_7b, [HType.NON_NULL]);
-  runTest(TEST_8, [HType.INTEGER, subclassOfInterceptor, HType.NON_NULL]);
-  runTest(TEST_9, [HType.INTEGER, HType.INTEGER]);
-  runTest(TEST_10, [HType.INTEGER, HType.INTEGER]);
-  runTest(TEST_11, [subclassOfInterceptor, subclassOfInterceptor]);
-
-  defaultTypes = new OptionalParameterTypes(1);
-  defaultTypes.update(0, const SourceString("p2"), HType.INTEGER);
-  runTest(TEST_12, [HType.STRING, HType.INTEGER], defaultTypes);
-
-  runTest(TEST_13, [HType.NUMBER]);
-
-  defaultTypes = new OptionalParameterTypes(1);
-  defaultTypes.update(0, const SourceString("p2"), HType.STRING);
-  runTest(TEST_14, [HType.INTEGER, HType.STRING], defaultTypes);
-
-  defaultTypes = new OptionalParameterTypes(1);
-  defaultTypes.update(0, const SourceString("p2"), HType.BOOLEAN);
-  runTest(TEST_15, [HType.STRING, HType.BOOLEAN], defaultTypes);
-
-  defaultTypes = new OptionalParameterTypes(2);
-  defaultTypes.update(0, const SourceString("p2"), HType.INTEGER);
-  defaultTypes.update(1, const SourceString("p3"), HType.STRING);
-  runTest(TEST_16, [HType.INTEGER, HType.INTEGER, HType.STRING], defaultTypes);
-
-  defaultTypes = new OptionalParameterTypes(2);
-  defaultTypes.update(0, const SourceString("p2"), HType.INTEGER);
-  defaultTypes.update(1, const SourceString("p3"), HType.STRING);
-  runTest(TEST_17, [HType.INTEGER, HType.BOOLEAN, HType.DOUBLE], defaultTypes);
-
-  runTest(TEST_18, [subclassOfInterceptor, subclassOfInterceptor]);
-}
-
-void main() {
-  test();
-}
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index 880a85e..d891603 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -71,7 +71,7 @@
       new leg.ResolutionWorkItem(element, context);
   resolutionWork.run(compiler, compiler.enqueuer.resolution);
   leg.CodegenWorkItem work =
-      new leg.CodegenWorkItem(element, resolutionWork.resolutionTree, context);
+      new leg.CodegenWorkItem(element, context);
   compiler.phase = Compiler.PHASE_COMPILING;
   work.run(compiler, compiler.enqueuer.codegen);
   js.JavaScriptBackend backend = compiler.backend;
diff --git a/tests/compiler/dart2js/field_type_inferer_test.dart b/tests/compiler/dart2js/field_type_inferer_test.dart
deleted file mode 100644
index ee2b5fb..0000000
--- a/tests/compiler/dart2js/field_type_inferer_test.dart
+++ /dev/null
@@ -1,394 +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.
-
-import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
-
-import 'compiler_helper.dart';
-import 'parser_helper.dart';
-
-void compileAndFind(String code,
-                    String className,
-                    String memberName,
-                    bool disableInlining,
-                    check(compiler, element)) {
-  Uri uri = new Uri(scheme: 'source');
-  var compiler = compilerFor(code, uri);
-  compiler.runCompiler(uri);
-  compiler.disableInlining = disableInlining;
-  var cls = findElement(compiler, className);
-  var member = cls.lookupMember(buildSourceString(memberName));
-  return check(compiler.backend, member);
-}
-
-const String TEST_1 = r"""
-  class A {
-    int f;
-  }
-  main() { new A(); }
-""";
-
-const String TEST_2 = r"""
-  class A {
-    int f1;
-    int f2 = 1;
-  }
-  main() { new A(); }
-""";
-
-const String TEST_3 = r"""
-  class A {
-    int f1;
-    int f2;
-    A() : f1 = 1;
-  }
-  main() { new A().f2 = 2; }
-""";
-
-const String TEST_4 = r"""
-  class A {
-    int f1;
-    int f2;
-    A() : f1 = 1;
-  }
-  main() {
-    A a = new A();
-    a.f1 = "a";
-    a.f2 = "a";
-  }
-""";
-
-const String TEST_5 = r"""
-  class A {
-    int f1 = 1;
-    int f2 = 1;
-    A(x) {
-      f1 = "1";
-      if (x) {
-        f2 = "1";
-      } else {
-        f2 = "2";
-      }
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-const String TEST_6 = r"""
-  class A {
-    int f1 = 1;
-    int f2 = 1;
-    A(x) {
-      f1 = "1";
-      if (x) {
-        f2 = "1";
-      } else {
-        f2 = "2";
-      }
-      if (x) {
-        f2 = new List();
-      } else {
-        f2 = new List();
-      }
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-const String TEST_7 = r"""
-  class A {
-    int f1 = 1;
-    int f2 = 1;
-    A(x) {
-      f1 = "1";
-      if (x) {
-        f2 = "1";
-      } else {
-        f2 = "2";
-      }
-      if (x) {
-        f1 = new List();
-        f2 = new List();
-      } else {
-        f2 = new List();
-      }
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-const String TEST_8 = r"""
-  class A {
-    int f;
-    A(x) {
-      if (x) {
-        f = "1";
-      } else {
-      }
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-const String TEST_9 = r"""
-  class A {
-    int f;
-    A(x) {
-      if (x) {
-      } else {
-        f = "1";
-      }
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-const String TEST_10 = r"""
-  class A {
-    int f;
-    A() {
-      f = 1;
-    }
-    m() => f + 1;
-  }
-  void f(x) { x.f = "2"; }
-  main() {
-    A a;
-    f(a);
-    a = new A();
-    a.m();
-  }
-""";
-
-
-const String TEST_11 = r"""
-  class S {
-    int fs = 1;
-    ms() { fs = 1; }
-  }
-
-  class A extends S {
-    m() { ms(); }
-  }
-
-  main() {
-    A a = new A();
-    a.m();
-  }
-""";
-
-const String TEST_12 = r"""
-  class S {
-    int fs = 1;
-    S() { fs = "2"; }
-  }
-
-  class A extends S {
-  }
-
-  main() {
-    A a = new A();
-  }
-""";
-
-const String TEST_13 = r"""
-  class S {
-    int fs;
-    S() { fs = 1; }
-  }
-
-  class A extends S {
-    A() { fs = 1; }
-  }
-
-  main() {
-    A a = new A();
-  }
-""";
-
-const String TEST_14 = r"""
-  class A {
-    var f;
-    A() { f = 1; }
-    A.other() { f = 2; }
-  }
-
-  main() {
-    A a = new A();
-    a = new A.other();
-  }
-""";
-
-const String TEST_15 = r"""
-  class A {
-    var f;
-    A() { f = "1"; }
-    A.other() { f = new List(); }
-  }
-
-  main() {
-    A a = new A();
-    a = new A.other();
-  }
-""";
-
-const String TEST_16 = r"""
-  class A {
-    var f;
-    A() { f = "1"; }
-    A.other() : f = 1 { }
-  }
-
-  main() {
-    A a = new A();
-    a = new A.other();
-  }
-""";
-
-const String TEST_17 = r"""
-  g([p]) => p.f = 1;
-  class A {
-    var f;
-    A(x) {
-      var a;
-      if (x) {
-        a = this;
-      } else {
-        a = g;
-      }
-      a();
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-// In this test this is only used in a field set (f3 = a) and therefore we infer
-// types for f1, f2 and f3.
-const String TEST_18 = r"""
-  class A {
-    var f1;
-    var f2;
-    var f3;
-    A(x) {
-      f1 = 1;
-      var a;
-      if (x) {
-        f2 = "1";
-        a = this;
-      } else {
-        a = 1;
-        f2 = "1";
-      }
-      f3 = a;
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-// In this test this is exposed through a(), and therefore we don't infer
-// any types.
-const String TEST_19 = r"""
-  class A {
-    var f1;
-    var f2;
-    var f3;
-    A(x) {
-      f1 = 1;
-      var a;
-      if (x) {
-        f2 = "1";
-        a = this;
-      } else {
-        a = 1;
-        f2 = "1";
-      }
-      f3 = a;
-      a();
-    }
-  }
-  main() {
-    new A(true);
-    new A(false);
-  }
-""";
-
-void doTest(String test, bool disableInlining, Map<String, dynamic> fields) {
-  fields.forEach((String name, type) {
-    compileAndFind(
-      test,
-      'A',
-      name,
-      disableInlining,
-      (backend, field) {
-        HType inferredType =
-            backend.optimisticFieldType(field).simplify(backend.compiler);
-        if (type is Function) type = type(backend.compiler);
-        Expect.equals(type, inferredType);
-    });
-  });
-}
-
-void runTest(String test, Map<String, HType> fields) {
-  doTest(test, false, fields);
-  doTest(test, true, fields);
-}
-
-void test() {
-  HType interceptorType(compiler) =>
-      findHType(compiler, 'Interceptor', 'nonNullSubclass');
-
-  runTest(TEST_1, {'f': HType.NULL});
-  runTest(TEST_2, {'f1': HType.NULL, 'f2': HType.INTEGER});
-  runTest(TEST_3, {'f1': HType.INTEGER, 'f2': HType.INTEGER_OR_NULL});
-  runTest(TEST_4, {'f1': interceptorType, 'f2': HType.STRING_OR_NULL});
-  runTest(TEST_5, {'f1': HType.STRING, 'f2': HType.STRING});
-  runTest(TEST_6, {'f1': HType.STRING, 'f2': HType.EXTENDABLE_ARRAY});
-  runTest(TEST_7, {'f1': HType.INDEXABLE_PRIMITIVE,
-                   'f2': HType.EXTENDABLE_ARRAY});
-  runTest(TEST_8, {'f': HType.UNKNOWN});
-  runTest(TEST_9, {'f': HType.UNKNOWN});
-  runTest(TEST_10, {'f': HType.UNKNOWN});
-  runTest(TEST_11, {'fs': HType.INTEGER});
-  runTest(TEST_12, {'fs': HType.STRING});
-  // TODO(sgjesse): We should actually infer int.
-  runTest(TEST_13, {'fs': HType.UNKNOWN});
-  // TODO(sgjesse): We should actually infer int.
-  runTest(TEST_14, {'f': HType.UNKNOWN});
-  runTest(TEST_15, {'f': HType.UNKNOWN});
-  runTest(TEST_16, {'f': HType.UNKNOWN});
-  runTest(TEST_17, {'f': HType.UNKNOWN});
-  runTest(TEST_18, {'f1': HType.INTEGER,
-                    'f2': HType.STRING,
-                    'f3': HType.NON_NULL});
-  runTest(TEST_19, {'f1': HType.UNKNOWN,
-                    'f2': HType.UNKNOWN,
-                    'f3': HType.UNKNOWN});
-}
-
-void main() {
-  test();
-}
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 14fa226..4d80094 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -204,8 +204,8 @@
               enableMinification: enableMinification,
               enableConcreteTypeInference: enableConcreteTypeInference,
               maxConcreteTypeSize: maxConcreteTypeSize,
-              disableTypeInference: disableTypeInference,
-              analyzeAll: analyzeAll,
+              disableTypeInferenceFlag: disableTypeInference,
+              analyzeAllFlag: analyzeAll,
               analyzeOnly: analyzeOnly,
               preserveComments: preserveComments) {
     coreLibrary = createLibrary("core", coreSource);
diff --git a/tests/compiler/dart2js/return_type_inferer_test.dart b/tests/compiler/dart2js/return_type_inferer_test.dart
deleted file mode 100644
index 30b854d..0000000
--- a/tests/compiler/dart2js/return_type_inferer_test.dart
+++ /dev/null
@@ -1,97 +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.
-
-import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart';
-
-import 'compiler_helper.dart';
-
-const String TEST_ONE = r"""
-  f(p) { if (p == null) return p; else return p; }
-  main() { f("s"); }
-""";
-
-const String TEST_TWO = r"""
-  f(p) { if (p == null) return p; else return p; }
-  main() { f(1); }
-""";
-
-const String TEST_THREE = r"""
-  f(p) { if (p == null) return p; else return p; }
-  main() { f(1); f(2); }
-""";
-
-const String TEST_FOUR = r"""
-  f(p) { if (p == null) return p; else return p; }
-  main() { f(1.1); }
-""";
-
-const String TEST_FIVE = r"""
-  f(p) { if (p == null) return p; else return p; }
-  main() { f(1); f(2.2); }
-""";
-
-const String TEST_SIX = r"""
-  f(p) { if (p == null) return p; else return p; }
-  main() { f(1.1); f(2); }
-""";
-
-const String TEST_SEVEN = r"""
-  f(p) { if (p == null) return p; else return p; }
-  main() { f(1); f("s"); }
-""";
-
-const String TEST_EIGHT = r"""
-  f(p1, p2) {
-    if (p1 == null) return p1;
-    else return p1;
-  }
-  main() { f(1, 2); f(1, "s"); }
-""";
-
-const String TEST_NINE = r"""
-  f(p1, p2) {
-    if (p1 == null) return p1;
-    else return p1;
-  }
-  main() { f("s", 2); f(1, "s"); }
-""";
-
-const String TEST_TEN = r"""
-  f(p) { if (p == null) return p; else return p; }
-  g(p) { if (p == null) return p; else return p; }
-  main() { f(1); g(f); }
-""";
-
-void runTest(String test, Function findExpectedType) {
-  compileAndCheck(
-    test,
-    'f',
-    (compiler, x) {
-      var backend = compiler.backend;
-      HType type =
-          backend.optimisticReturnTypesWithRecompilationOnTypeChange(null, x);
-      Expect.equals(findExpectedType(compiler), type.simplify(compiler));
-  });
-}
-
-void test() {
-  subclassOfInterceptor(compiler) =>
-      findHType(compiler, 'Interceptor', 'nonNullSubclass');
-
-  runTest(TEST_ONE, (compiler) => HType.STRING);
-  runTest(TEST_TWO, (compiler) => HType.INTEGER);
-  runTest(TEST_THREE, (compiler) => HType.INTEGER);
-  runTest(TEST_FOUR, (compiler) => HType.DOUBLE);
-  runTest(TEST_FIVE, (compiler) => HType.NUMBER);
-  runTest(TEST_SIX, (compiler) => HType.NUMBER);
-  runTest(TEST_SEVEN, subclassOfInterceptor);
-  runTest(TEST_EIGHT, (compiler) => HType.INTEGER);
-  runTest(TEST_NINE, subclassOfInterceptor);
-  runTest(TEST_TEN, (compiler) => HType.UNKNOWN);
-}
-
-void main() {
-  test();
-}
diff --git a/tests/compiler/dart2js/unneeded_part_js_test.dart b/tests/compiler/dart2js/unneeded_part_js_test.dart
new file mode 100644
index 0000000..aa1e641
--- /dev/null
+++ b/tests/compiler/dart2js/unneeded_part_js_test.dart
@@ -0,0 +1,65 @@
+// 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 no parts are emitted when deferred loading isn't used.
+
+import 'package:expect/expect.dart';
+import 'memory_source_file_helper.dart';
+
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+       show NullSink;
+
+import '../../../sdk/lib/_internal/compiler/compiler.dart'
+       show Diagnostic;
+
+import 'dart:async';
+
+main() {
+  Uri script = currentDirectory.resolve(nativeToUriPath(new Options().script));
+  Uri libraryRoot = script.resolve('../../../sdk/');
+  Uri packageRoot = script.resolve('./packages/');
+
+  MemorySourceFileProvider.MEMORY_SOURCE_FILES = MEMORY_SOURCE_FILES;
+  var provider = new MemorySourceFileProvider();
+  void diagnosticHandler(Uri uri, int begin, int end,
+                         String message, Diagnostic kind) {
+    if (kind == Diagnostic.VERBOSE_INFO) {
+      return;
+    }
+    throw '$uri:$begin:$end:$message:$kind';
+  }
+
+  EventSink<String> outputProvider(String name, String extension) {
+    if (name != '') throw 'Attempt to output file "$name.$extension"';
+    return new NullSink('$name.$extension');
+  }
+
+  Compiler compiler = new Compiler(provider.readStringFromUri,
+                                   outputProvider,
+                                   diagnosticHandler,
+                                   libraryRoot,
+                                   packageRoot,
+                                   []);
+  compiler.run(Uri.parse('memory:main.dart'));
+  Expect.isFalse(compiler.compilationFailed);
+}
+
+const Map MEMORY_SOURCE_FILES = const {
+  'main.dart': """
+class Greeting {
+  final message;
+  const Greeting(this.message);
+}
+
+const fisk = const Greeting('Hello, World!');
+
+main() {
+  var x = fisk;
+  if (new DateTime.now().millisecondsSinceEpoch == 42) {
+    x = new Greeting(\"I\'m confused\");
+  }
+  print(x.message);
+}
+""",
+};
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
index c5980fb..3f15bec6 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
@@ -13,16 +13,25 @@
 
 isNoSuchMethodError(e) => e is NoSuchMethodError;
 
+readFoo() {
+  // TODO(ahe): There is a problem with type inference of deferred
+  // function closures.  We think they are never null.
+  if (new DateTime.now().millisecondsSinceEpoch == 87) return null;
+  return foo;
+}
+
 main() {
   print('unittest-suite-wait-for-done');
 
   Expect.throws(() { foo('a'); }, isNoSuchMethodError);
+  Expect.isNull(readFoo());
   int counter = 0;
   lazy.load().then((bool didLoad) {
     Expect.isTrue(didLoad);
     Expect.equals(1, ++counter);
     print('lazy was loaded');
     Expect.equals(42, foo('b'));
+    Expect.isNotNull(readFoo());
   });
   Expect.equals(0, counter);
   lazy.load().then((bool didLoad) {
@@ -30,8 +39,10 @@
     Expect.equals(2, ++counter);
     print('lazy was loaded');
     Expect.equals(42, foo('b'));
+    Expect.isNotNull(readFoo());
     print('unittest-suite-success');
   });
   Expect.equals(0, counter);
   Expect.throws(() { foo('a'); }, isNoSuchMethodError);
+  Expect.isNull(readFoo());
 }
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 55913e5..c155d64 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -104,9 +104,6 @@
 list_insert_test: fail
 list_removeat_test: fail
 
-[ $arch == arm ]
-*: Skip
-
 [ $arch == simarm ]
 *: Skip
 
diff --git a/tests/corelib/map_test.dart b/tests/corelib/map_test.dart
index 05afcf6..4f48be4 100644
--- a/tests/corelib/map_test.dart
+++ b/tests/corelib/map_test.dart
@@ -207,6 +207,41 @@
   Expect.equals(10, map[key1]);
   Expect.equals(10,
       map.putIfAbsent(key1, () => 11));
+
+  // Test Map.addAll.
+  map.clear();
+  otherMap.clear();
+  otherMap[99] = 1;
+  otherMap[50] = 50;
+  otherMap[1] = 99;
+  map.addAll(otherMap);
+  Expect.equals(3, map.length);
+  Expect.equals(1, map[99]);
+  Expect.equals(50, map[50]);
+  Expect.equals(99, map[1]);
+  otherMap[50] = 42;
+  map.addAll(new HashMap.from(otherMap));
+  Expect.equals(3, map.length);
+  Expect.equals(1, map[99]);
+  Expect.equals(42, map[50]);
+  Expect.equals(99, map[1]);
+  otherMap[99] = 7;
+  map.addAll(new SplayTreeMap.from(otherMap));
+  Expect.equals(3, map.length);
+  Expect.equals(7, map[99]);
+  Expect.equals(42, map[50]);
+  Expect.equals(99, map[1]);
+  otherMap.remove(99);
+  map[99] = 0;
+  map.addAll(otherMap);
+  Expect.equals(3, map.length);
+  Expect.equals(0, map[99]);
+  Expect.equals(42, map[50]);
+  Expect.equals(99, map[1]);
+  map.clear();
+  otherMap.clear();
+  map.addAll(otherMap);
+  Expect.equals(0, map.length);
 }
 
 void testDeletedElement(Map map) {
diff --git a/tests/html/documentfragment_test.dart b/tests/html/documentfragment_test.dart
index d384c98..62d4b73 100644
--- a/tests/html/documentfragment_test.dart
+++ b/tests/html/documentfragment_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library DocumentFragmentTest;
-import "package:expect/expect.dart";
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
 import 'util.dart';
diff --git a/tests/html/element_types_test.dart b/tests/html/element_types_test.dart
index f10713b..2638d3a 100644
--- a/tests/html/element_types_test.dart
+++ b/tests/html/element_types_test.dart
@@ -82,229 +82,107 @@
     });
   });
 
+  check(String name, bool fn(), [bool supported = true]) {
+    test(name, () {
+      var expectation = supported ? returnsNormally : throws;
+      expect(() {
+        expect(fn(), isTrue);
+      }, expectation);
+    });
+
+  }
+
   group('constructors', () {
-    test('a', () {
-      expect((new AnchorElement()) is AnchorElement, true);
+    check('a', () => new AnchorElement() is AnchorElement);
+    check('area', () => new AreaElement() is AreaElement);
+    check('audio', () => new AudioElement() is AudioElement);
+    check('body', () => new BodyElement() is BodyElement);
+    check('br', () => new BRElement() is BRElement);
+    check('base', () => new BaseElement() is BaseElement);
+    check('button', () => new ButtonElement() is ButtonElement);
+    check('canvas', () => new CanvasElement() is CanvasElement);
+    check('caption', () => new TableCaptionElement() is TableCaptionElement);
+    check('content', () => new ContentElement() is ContentElement,
+        ContentElement.supported);
+    check('details', () => new DetailsElement() is DetailsElement,
+        DetailsElement.supported);
+    check('datalist', () => new DataListElement() is DataListElement,
+        DataListElement.supported);
+    check('dl', () => new DListElement() is DListElement);
+    check('div', () => new DivElement() is DivElement);
+    check('embed', () => new EmbedElement() is EmbedElement,
+        EmbedElement.supported);
+    check('fieldset', () => new FieldSetElement() is FieldSetElement);
+    check('form', () => new FormElement() is FormElement);
+    check('head', () => new HeadElement() is HeadElement);
+    check('hr', () => new HRElement() is HRElement);
+    check('html', () => new HtmlElement() is HtmlElement);
+    check('h1', () => new HeadingElement.h1() is HeadingElement);
+    check('h2', () => new HeadingElement.h2() is HeadingElement);
+    check('h3', () => new HeadingElement.h3() is HeadingElement);
+    check('h4', () => new HeadingElement.h4() is HeadingElement);
+    check('h5', () => new HeadingElement.h5() is HeadingElement);
+    check('h6', () => new HeadingElement.h6() is HeadingElement);
+    check('iframe', () => new IFrameElement() is IFrameElement);
+    check('img', () => new ImageElement() is ImageElement);
+    check('input', () => new InputElement() is InputElement);
+    check('keygen', () => new KeygenElement() is KeygenElement,
+        KeygenElement.supported);
+    check('li', () => new LIElement() is LIElement);
+    check('label', () => new LabelElement() is LabelElement);
+    check('legen', () => new LegendElement() is LegendElement);
+    check('link', () => new LinkElement() is LinkElement);
+    check('map', () => new MapElement() is MapElement);
+    check('menu', () => new MenuElement() is MenuElement);
+    check('meta', () => new MetaElement() is MetaElement);
+    check('meter', () => new MeterElement() is MeterElement,
+        MeterElement.supported);
+    check('del', () => new Element.tag('del') is ModElement);
+    check('ins', () => new Element.tag('ins') is ModElement);
+    check('object', () => new ObjectElement() is ObjectElement,
+        ObjectElement.supported);
+    check('ol', () => new OListElement() is OListElement);
+    check('optgroup', () => new OptGroupElement() is OptGroupElement);
+    check('option', () => new OptionElement() is OptionElement);
+    check('output', () => new OutputElement() is OutputElement,
+        OutputElement.supported);
+    check('p', () => new ParagraphElement() is ParagraphElement);
+    check('param', () => new ParamElement() is ParamElement);
+    check('pre', () => new PreElement() is PreElement);
+    check('progress', () => new ProgressElement() is ProgressElement,
+        ProgressElement.supported);
+    check('q', () => new QuoteElement() is QuoteElement);
+    check('script', () => new ScriptElement() is ScriptElement);
+    check('select', () => new SelectElement() is SelectElement);
+    check('shadow', () => new ShadowElement() is ShadowElement,
+        ShadowElement.supported);
+    check('source', () => new SourceElement() is SourceElement);
+    check('span', () => new SpanElement() is SpanElement);
+    check('style', () => new StyleElement() is StyleElement);
+    check('table', () => new TableElement() is TableElement);
+    check('template', () => new TemplateElement() is TemplateElement,
+        TemplateElement.supported);
+    check('textarea', () => new TextAreaElement() is TextAreaElement);
+    check('title', () => new TitleElement() is TitleElement);
+    check('td', () => new TableCellElement() is TableCellElement);
+    check('col', () => new TableColElement() is TableColElement);
+    check('colgroup', () => new Element.tag('colgroup') is TableColElement);
+    check('tr', () => new TableRowElement() is TableRowElement);
+    check('tbody', () => new Element.tag('tbody') is TableSectionElement);
+    check('tfoot', () => new Element.tag('tfoot') is TableSectionElement);
+    check('thead', () => new Element.tag('thead') is TableSectionElement);
+    check('track', () => new TrackElement() is TrackElement,
+        TrackElement.supported);
+    group('ul', () {
+      check('ul', () => new UListElement() is UListElement);
+
+      test('accepts li', () {
+        var ul = new UListElement();
+        var li = new LIElement();
+        ul.append(li);
+      });
     });
-    test('area', () {
-      expect((new AreaElement()) is AreaElement, true);
-    });
-    test('audio', () {
-      expect((new AudioElement()) is AudioElement, true);
-    });
-    test('body', () {
-      expect((new BodyElement()) is BodyElement, true);
-    });
-    test('br', () {
-      expect((new BRElement()) is BRElement, true);
-    });
-    test('base', () {
-      expect((new BaseElement()) is BaseElement, true);
-    });
-    test('button', () {
-      expect((new ButtonElement()) is ButtonElement, true);
-    });
-    test('canvas', () {
-      expect((new CanvasElement()) is CanvasElement, true);
-    });
-    test('caption', () {
-      expect((new TableCaptionElement()) is TableCaptionElement, true);
-    });
-    test('content', () {
-      expect((new ContentElement()) is ContentElement,
-          ContentElement.supported);
-    });
-    test('details', () {
-      expect((new DetailsElement()) is DetailsElement,
-          DetailsElement.supported);
-    });
-    test('dl', () {
-      expect((new DListElement()) is DListElement, true);
-    });
-    test('datalist', () {
-      expect((new DataListElement()) is DataListElement,
-          DataListElement.supported);
-    });
-    test('div', () {
-      expect((new DivElement()) is DivElement, true);
-    });
-    test('embed', () {
-      expect((new EmbedElement()) is EmbedElement, EmbedElement.supported);
-    });
-    test('fieldset', () {
-      expect((new FieldSetElement()) is FieldSetElement, true);
-    });
-    test('form', () {
-      expect((new FormElement()) is FormElement, true);
-    });
-    test('head', () {
-      expect((new HeadElement()) is HeadElement, true);
-    });
-    test('hr', () {
-      expect((new HRElement()) is HRElement, true);
-    });
-    test('html', () {
-      expect((new HtmlElement()) is HtmlElement, true);
-    });
-    test('h1', () {
-      expect((new HeadingElement.h1()) is HeadingElement, true);
-      expect(new Element.tag('h1') is HeadingElement, true);
-    });
-    test('h2', () {
-      expect((new HeadingElement.h2()) is HeadingElement, true);
-      expect(new Element.tag('h2') is HeadingElement, true);
-    });
-    test('h3', () {
-      expect((new HeadingElement.h3()) is HeadingElement, true);
-      expect(new Element.tag('h3') is HeadingElement, true);
-    });
-    test('h4', () {
-      expect((new HeadingElement.h4()) is HeadingElement, true);
-      expect(new Element.tag('h4') is HeadingElement, true);
-    });
-    test('h5', () {
-      expect((new HeadingElement.h5()) is HeadingElement, true);
-      expect(new Element.tag('h5') is HeadingElement, true);
-    });
-    test('h6', () {
-      expect((new HeadingElement.h6()) is HeadingElement, true);
-      expect(new Element.tag('h6') is HeadingElement, true);
-    });
-    test('iframe', () {
-      expect((new IFrameElement()) is IFrameElement, true);
-    });
-    test('img', () {
-      expect((new ImageElement()) is ImageElement, true);
-    });
-    test('input', () {
-      expect((new InputElement()) is InputElement, true);
-    });
-    test('keygen', () {
-      expect((new KeygenElement()) is KeygenElement, KeygenElement.supported);
-    });
-    test('li', () {
-      expect((new LIElement()) is LIElement, true);
-    });
-    test('label', () {
-      expect((new LabelElement()) is LabelElement, true);
-    });
-    test('legend', () {
-      expect((new LegendElement()) is LegendElement, true);
-    });
-    test('link', () {
-      expect((new LinkElement()) is LinkElement, true);
-    });
-    test('map', () {
-      expect((new MapElement()) is MapElement, true);
-    });
-    test('menu', () {
-      expect((new MenuElement()) is MenuElement, true);
-    });
-    test('meta', () {
-      expect((new Element.tag('meta')) is MetaElement, true);
-    });
-    test('meter', () {
-      expect((new Element.tag('meter')) is MeterElement, MeterElement.supported);
-    });
-    test('del', () {
-      expect((new Element.tag('del')) is ModElement, true);
-    });
-    test('ins', () {
-      expect((new Element.tag('ins')) is ModElement, true);
-    });
-    test('object', () {
-      expect((new ObjectElement()) is ObjectElement, ObjectElement.supported);
-    });
-    test('ol', () {
-      expect((new OListElement()) is OListElement, true);
-    });
-    test('optgroup', () {
-      expect((new OptGroupElement()) is OptGroupElement, true);
-    });
-    test('option', () {
-      expect((new OptionElement()) is OptionElement, true);
-    });
-    test('output', () {
-      expect((new OutputElement()) is OutputElement, OutputElement.supported);
-    });
-    test('p', () {
-      expect((new ParagraphElement()) is ParagraphElement, true);
-    });
-    test('param', () {
-      expect((new ParamElement()) is ParamElement, true);
-    });
-    test('pre', () {
-      expect((new PreElement()) is PreElement, true);
-    });
-    test('progress', () {
-      expect((new ProgressElement()) is ProgressElement,
-          ProgressElement.supported);
-    });
-    test('q', () {
-      expect((new Element.tag('q')) is QuoteElement, true);
-    });
-    test('script', () {
-      expect((new ScriptElement()) is ScriptElement, true);
-    });
-    test('select', () {
-      expect((new SelectElement()) is SelectElement, true);
-    });
-    test('shadow', () {
-      expect((new Element.tag('shadow')) is ShadowElement,
-          ShadowElement.supported);
-    });
-    test('source', () {
-      expect((new SourceElement()) is SourceElement, true);
-    });
-    test('span', () {
-      expect((new SpanElement()) is SpanElement, true);
-    });
-    test('style', () {
-      expect((new StyleElement()) is StyleElement, true);
-    });
-    test('table', () {
-      expect((new TableElement()) is TableElement, true);
-    });
-    test('template', () {
-      expect((new TemplateElement()) is TemplateElement,
-          TemplateElement.supported);
-    });
-    test('textarea', () {
-      expect((new TextAreaElement()) is TextAreaElement, true);
-    });
-    test('title', () {
-      expect((new TitleElement()) is TitleElement, true);
-    });
-    test('td', () {
-      expect((new TableCellElement()) is TableCellElement, true);
-    });
-    test('col', () {
-      expect((new TableColElement()) is TableColElement, true);
-      expect((new Element.tag('colgroup')) is TableColElement, true);
-    });
-    test('tr', () {
-      expect((new TableRowElement()) is TableRowElement, true);
-    });
-    test('table section', () {
-      expect((new Element.tag('tbody')) is TableSectionElement, true);
-      expect((new Element.tag('tfoot')) is TableSectionElement, true);
-      expect((new Element.tag('thead')) is TableSectionElement, true);
-    });
-    test('track', () {
-      expect((new Element.tag('track')) is TrackElement,
-          TrackElement.supported);
-    });
-    test('ul', () {
-      expect((new UListElement()) is UListElement, true);
-      var ul = new UListElement();
-      var li = new LIElement();
-      ul.append(li);
-    });
-    test('video', () {
-      expect((new VideoElement()) is VideoElement, true);
-    });
-    test('unknown', () {
-      expect((new Element.tag('someunknown')) is UnknownElement, true);
-    });;
+    check('video', () => new VideoElement() is VideoElement);
+    check('unknown', () => new Element.tag('someunknown') is UnknownElement);
   });
 }
diff --git a/tests/html/event_customevent_test.dart b/tests/html/event_customevent_test.dart
index 73ae1d9..dc2951e 100644
--- a/tests/html/event_customevent_test.dart
+++ b/tests/html/event_customevent_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library EventCustomEventTest;
-import "package:expect/expect.dart";
+
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_config.dart';
 import 'dart:html';
diff --git a/tests/html/html.status b/tests/html/html.status
index 3d6077d..545b4c4 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -260,9 +260,6 @@
 speechrecognition_test/supported: Fail
 touchevent_test/supported: Fail
 
-[ $runtime == ie9 && $checked ]
-element_types_test/constructors: Fail # Issue 10796
-
 [ $runtime == opera ]
 blob_constructor_test: Fail
 canvas_test: Fail
diff --git a/tests/html/svgelement_test.dart b/tests/html/svgelement_test.dart
index 256e766..6bc60b0 100644
--- a/tests/html/svgelement_test.dart
+++ b/tests/html/svgelement_test.dart
@@ -422,4 +422,21 @@
       expect(el.classes.length, 0);
     });
   });
+
+  group('getBoundingClientRect', () {
+    test('is a Rect', () {
+      var element = new svg.RectElement();
+      element.attributes['width'] = '100';
+      element.attributes['height'] = '100';
+      var root = new svg.SvgSvgElement();
+      root.append(element);
+
+      document.body.append(root);
+
+      var rect = element.getBoundingClientRect();
+      expect(rect is Rect, isTrue);
+      expect(rect.width, closeTo(100, 1));
+      expect(rect.height, closeTo(100, 1));
+    });
+  });
 }
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 02886a3..e001f6d 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -138,12 +138,21 @@
 [ $compiler == dart2js && ( $runtime == ff || $runtime == safari ) ]
 isolate_stress_test: Pass, Timeout # http://dartbug.com/10697
 
-[ $arch == arm ]
-*: Skip
-
 [ $arch == simarm ]
 *: Skip
 
+[ $arch == arm ]
+count_stream_test: Crash # Issue: 11207
+cross_isolate_message_stream_test: Crash # Issue: 11207
+mandel_isolate_stream_test: Crash # Issue: 11207
+message2_test: Crash # Issue: 11207
+message_stream2_test: Crash # Issue: 11207
+nested_spawn_stream2_test: Crash # Issue: 11207
+nested_spawn_stream_test: Crash # Issue: 11207
+spawn_function_negative_test: Crash # Issue: 11207
+spawn_uri_vm_negative_test: Crash # Issue: 11207
+stream_mangling_test: Crash # Issue: 11207
+
 [ $arch == mips ]
 *: Skip
 
diff --git a/tests/language/cyclic_class_member_test.dart b/tests/language/cyclic_class_member_test.dart
new file mode 100644
index 0000000..63c9651
--- /dev/null
+++ b/tests/language/cyclic_class_member_test.dart
@@ -0,0 +1,17 @@
+// 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 class with a cyclic hierarchy doesn't cause a loop in dart2js.
+
+class A
+    extends A /// 01: compile-time error
+{
+  // When checking that foo isn't overriding an instance method in the
+  // superclass, dart2js might loop.
+  static foo() {}
+}
+
+main() {
+  new A();
+}
diff --git a/tests/language/inferrer_constructor3_test.dart b/tests/language/inferrer_constructor3_test.dart
new file mode 100644
index 0000000..b39012b
--- /dev/null
+++ b/tests/language/inferrer_constructor3_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for dart2js that used to optimistically infer the
+// wrong types for fields because of generative constructors being
+// inlined.
+
+import "package:expect/expect.dart";
+import "compiler_annotations.dart";
+
+class A {
+  var field;
+  A(this.field);
+}
+
+var c = () => new List(42)[0];
+
+main() {
+  bar();
+  // Defeat type inferencing.
+  new A(c());
+  doIt();
+  bar();
+}
+
+@DontInline
+doIt() {
+  () => 42;
+  var c = new A(null);
+  Expect.throws(() => c.field + 42, (e) => e is NoSuchMethodError);
+}
+
+@DontInline
+bar() {
+  () => 42;
+  return inlineLevel1();
+}
+
+inlineLevel1() {
+  return inlineLevel2();
+}
+
+inlineLevel2() {
+  return inlineLevel3();
+}
+
+inlineLevel3() {
+  return inlineLevel4();
+}
+
+inlineLevel4() {
+  return new A(42);
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index f988626..305a45a 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -548,11 +548,6 @@
 stack_overflow_test: Crash, Pass
 stack_overflow_stacktrace_test: Crash, Pass
 
-# math_vm_test and double_modulo test fail on SIMARM because the simulator
-# isn't implementing the softfp calling convention correctly.
-math_vm_test: Fail, Pass
-double_modulo_test: Fail, Pass
-
 [ $arch == mips ]
 *: Skip
 
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 48bf4fc..ebaff6e 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -26,7 +26,6 @@
 call_nonexistent_static_test/09: fail
 call_nonexistent_static_test/10: fail
 call_through_getter_test: fail
-callable_test/none: fail
 cast_test/04: fail
 cast_test/05: fail
 class_cycle_test/03: fail
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index e9b7cf7..31cf098 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -26,7 +26,6 @@
 call_nonexistent_static_test/09: fail
 call_nonexistent_static_test/10: fail
 call_through_getter_test: fail
-callable_test/none: fail
 cast_test/04: fail
 cast_test/05: fail
 class_cycle_test/03: fail
diff --git a/tests/language/string_overflow.dart b/tests/language/string_overflow.dart
new file mode 100644
index 0000000..fd1f285
--- /dev/null
+++ b/tests/language/string_overflow.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test to ensure that the VM does not have an integer overflow issue
+// when concatenating strings.
+
+import "package:expect/expect.dart";
+
+main()
+{
+  String a = "a";
+  for( ; a.length < 256 * 1024 * 1024 ; )
+    a = a + a;
+
+  var exception_thrown = false;
+  try {
+    var concat = "$a$a$a$a$a$a$a$a";
+  } on OutOfMemoryError catch (exc) {
+    exception_thrown = true;
+  }
+  Expect.isTrue(exception_thrown);
+}
+
diff --git a/tests/language/type_propagation2_test.dart b/tests/language/type_propagation2_test.dart
new file mode 100644
index 0000000..a09041b9
--- /dev/null
+++ b/tests/language/type_propagation2_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for dart2js that used to infinite loop on
+// speculatively propagating types.
+
+class Bar {
+  noSuchMethod(e) => null;
+}
+
+main() {
+  var d = new Bar();
+
+  while (false) {
+    // [input] will change from indexable to unknown: the use line 20
+    // changes its decision because [a2] changes its type from unknown to
+    // null.
+    var input = ((x) {})(null);
+    var p2 = input.keys.firstWhere(null);
+    var a2 = input.keys.firstWhere(null);
+    print(input[a2] == p2);
+  }
+}
diff --git a/tests/lib/async/future_test.dart b/tests/lib/async/future_test.dart
index 7af6893..0074d81 100644
--- a/tests/lib/async/future_test.dart
+++ b/tests/lib/async/future_test.dart
@@ -10,7 +10,7 @@
 
 const Duration MS = const Duration(milliseconds: 1);
 
-testValue() {
+void testValue() {
   final future = new Future<String>.value("42");
   var port = new ReceivePort();
   future.then((x) {
@@ -19,7 +19,7 @@
   });
 }
 
-testSync() {
+void testSync() {
   compare(func) {
     // Compare the results of the following two futures.
     Future f1 = new Future.sync(func);
@@ -52,14 +52,14 @@
   Expect.isTrue(hasExecuted);
 }
 
-testNeverComplete() {
+void testNeverComplete() {
   final completer = new Completer<int>();
   final future = completer.future;
   future.then((v) => Expect.fails("Value not expected"));
   future.catchError((e) => Expect.fails("Value not expected"));
 }
 
-testComplete() {
+void testComplete() {
   final completer = new Completer<int>();
   final future = completer.future;
   Expect.isFalse(completer.isCompleted);
@@ -72,7 +72,7 @@
 
 // Tests for [then]
 
-testCompleteWithSuccessHandlerBeforeComplete() {
+void testCompleteWithSuccessHandlerBeforeComplete() {
   final completer = new Completer<int>();
   final future = completer.future;
 
@@ -89,7 +89,7 @@
   Expect.isNull(after);
 }
 
-testCompleteWithSuccessHandlerAfterComplete() {
+void testCompleteWithSuccessHandlerAfterComplete() {
   final completer = new Completer<int>();
   final future = completer.future;
 
@@ -105,7 +105,7 @@
     });
 }
 
-testCompleteManySuccessHandlers() {
+void testCompleteManySuccessHandlers() {
   final completer = new Completer<int>();
   final future = completer.future;
   int before;
@@ -129,7 +129,7 @@
 
 // Tests for [catchError]
 
-testException() {
+void testException() {
   final completer = new Completer<int>();
   final future = completer.future;
   final ex = new Exception();
@@ -144,7 +144,7 @@
   completer.completeError(ex);
 }
 
-testExceptionHandler() {
+void testExceptionHandler() {
   final completer = new Completer<int>();
   final future = completer.future;
   final ex = new Exception();
@@ -163,7 +163,7 @@
   });
 }
 
-testExceptionHandlerReturnsTrue() {
+void testExceptionHandlerReturnsTrue() {
   final completer = new Completer<int>();
   final future = completer.future;
   final ex = new Exception();
@@ -178,7 +178,7 @@
   Expect.isFalse(reached);
 }
 
-testExceptionHandlerReturnsTrue2() {
+void testExceptionHandlerReturnsTrue2() {
   final completer = new Completer<int>();
   final future = completer.future;
   final ex = new Exception();
@@ -196,7 +196,7 @@
   });
 }
 
-testExceptionHandlerReturnsFalse() {
+void testExceptionHandlerReturnsFalse() {
   final completer = new Completer<int>();
   final future = completer.future;
   final ex = new Exception();
@@ -213,7 +213,7 @@
   Expect.isFalse(reached);
 }
 
-testFutureAsStreamCompleteAfter() {
+void testFutureAsStreamCompleteAfter() {
   var completer = new Completer();
   bool gotValue = false;
   var port = new ReceivePort();
@@ -230,7 +230,7 @@
   completer.complete("value");
 }
 
-testFutureAsStreamCompleteBefore() {
+void testFutureAsStreamCompleteBefore() {
   var completer = new Completer();
   bool gotValue = false;
   var port = new ReceivePort();
@@ -247,7 +247,7 @@
       });
 }
 
-testFutureAsStreamCompleteImmediate() {
+void testFutureAsStreamCompleteImmediate() {
   bool gotValue = false;
   var port = new ReceivePort();
   new Future.value("value").asStream().listen(
@@ -262,7 +262,7 @@
       });
 }
 
-testFutureAsStreamCompleteErrorAfter() {
+void testFutureAsStreamCompleteErrorAfter() {
   var completer = new Completer();
   bool gotError = false;
   var port = new ReceivePort();
@@ -282,7 +282,7 @@
   completer.completeError("error");
 }
 
-testFutureAsStreamWrapper() {
+void testFutureAsStreamWrapper() {
   var completer = new Completer();
   bool gotValue = false;
   var port = new ReceivePort();
@@ -301,7 +301,7 @@
         });
 }
 
-testFutureWhenCompleteValue() {
+void testFutureWhenCompleteValue() {
   var port = new ReceivePort();
   int counter = 2;
   countDown() {
@@ -317,7 +317,7 @@
   completer.complete(42);
 }
 
-testFutureWhenCompleteError() {
+void testFutureWhenCompleteError() {
   var port = new ReceivePort();
   int counter = 2;
   countDown() {
@@ -333,7 +333,7 @@
   completer.completeError("error");
 }
 
-testFutureWhenCompleteValueNewError() {
+void testFutureWhenCompleteValueNewError() {
   var port = new ReceivePort();
   int counter = 2;
   countDown() {
@@ -352,7 +352,7 @@
   completer.complete(42);
 }
 
-testFutureWhenCompleteErrorNewError() {
+void testFutureWhenCompleteErrorNewError() {
   var port = new ReceivePort();
   int counter = 2;
   countDown() {
@@ -371,7 +371,7 @@
   completer.completeError("error");
 }
 
-testFutureWhenCompletePreValue() {
+void testFutureWhenCompletePreValue() {
   var port = new ReceivePort();
   int counter = 2;
   countDown() {
@@ -389,7 +389,7 @@
   });
 }
 
-testFutureWhenValueFutureValue() {
+void testFutureWhenValueFutureValue() {
 
   var port = new ReceivePort();
   int counter = 3;
@@ -414,7 +414,7 @@
   completer.complete(42);
 }
 
-testFutureWhenValueFutureError() {
+void testFutureWhenValueFutureError() {
   var port = new ReceivePort();
   int counter = 3;
   countDown(int expect) {
@@ -440,7 +440,7 @@
   completer.complete(42);
 }
 
-testFutureWhenErrorFutureValue() {
+void testFutureWhenErrorFutureValue() {
   var port = new ReceivePort();
   int counter = 3;
   countDown(int expect) {
@@ -466,7 +466,7 @@
   completer.completeError("Error");
 }
 
-testFutureWhenErrorFutureError() {
+void testFutureWhenErrorFutureError() {
   var port = new ReceivePort();
   int counter = 3;
   countDown(int expect) {
@@ -492,7 +492,7 @@
   completer.completeError("Error");
 }
 
-testFutureThenThrowsAsync() {
+void testFutureThenThrowsAsync() {
   final completer = new Completer<int>();
   final future = completer.future;
   int error = 42;
@@ -507,7 +507,7 @@
   completer.complete(0);
 }
 
-testFutureCatchThrowsAsync() {
+void testFutureCatchThrowsAsync() {
   final completer = new Completer<int>();
   final future = completer.future;
   int error = 42;
@@ -522,7 +522,7 @@
   completer.completeError(0);
 }
 
-testFutureCatchRethrowsAsync() {
+void testFutureCatchRethrowsAsync() {
   final completer = new Completer<int>();
   final future = completer.future;
   var error;
@@ -538,7 +538,7 @@
   completer.completeError(0);
 }
 
-testFutureWhenThrowsAsync() {
+void testFutureWhenThrowsAsync() {
   final completer = new Completer<int>();
   final future = completer.future;
   var error = 42;
@@ -553,7 +553,7 @@
   completer.complete(0);
 }
 
-testCompleteWithError() {
+void testCompleteWithError() {
   final completer = new Completer<int>();
   final future = completer.future;
   var error = 42;
@@ -567,7 +567,7 @@
   completer.completeError(error);
 }
 
-testChainedFutureValue() {
+void testChainedFutureValue() {
   final completer = new Completer();
   final future = completer.future;
   var port = new ReceivePort();
@@ -580,7 +580,7 @@
   completer.complete(21);
 }
 
-testChainedFutureValueDelay() {
+void testChainedFutureValueDelay() {
   final completer = new Completer();
   final future = completer.future;
   var port = new ReceivePort();
@@ -594,7 +594,7 @@
   completer.complete(21);
 }
 
-testChainedFutureValue2Delay() {
+void testChainedFutureValue2Delay() {
   var port = new ReceivePort();
 
   new Future.delayed(const Duration(milliseconds: 10))
@@ -603,7 +603,8 @@
       port.close();
     });
 }
-testChainedFutureError() {
+
+void testChainedFutureError() {
   final completer = new Completer();
   final future = completer.future;
   var port = new ReceivePort();
@@ -616,6 +617,22 @@
   completer.complete(21);
 }
 
+void testChainedFutureCycle() {
+  var port = new ReceivePort();  // Keep alive until port is closed.
+  var completer = new Completer();
+  var future, future2;
+  future  = completer.future.then((_) => future2);
+  future2 = completer.future.then((_) => future);
+  completer.complete(42);
+  int ctr = 2;
+  void receiveError(e) {
+    Expect.isTrue(e is StateError);
+    if (--ctr == 0) port.close();
+  }
+  future.catchError(receiveError);
+  future.catchError(receiveError);
+}
+
 main() {
   testValue();
   testSync();
@@ -657,6 +674,5 @@
   testChainedFutureValue();
   testChainedFutureValueDelay();
   testChainedFutureError();
+  testChainedFutureCycle();
 }
-
-
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index b746139..093283e 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -21,19 +21,17 @@
 
 [ $compiler == dart2js && $minified ]
 mirrors/mirrors_resolve_fields_test: Fail # Issue 6490
+mirrors/disable_tree_shaking_test: Fail # Issue 6490
 
 [ $csp ]
 mirrors/metadata_test: Fail # Issue 6490
 mirrors/reflect_runtime_type_test: Fail # Issue 6490
 mirrors/reflect_uninstantiated_class_test: Fail # Issue 6490
-
+mirrors/superclass_test: Fail # Issue 6490
 
 [ $compiler == dart2js && $checked ]
 async/stream_event_transform_test: Fail # Issue 7733.
 
-[ $compiler == dart2js && $unchecked && ($runtime == d8 || $runtime == chrome || $runtime == drt) ]
-crypto/sha1_test: Fail # V8 bug: https://code.google.com/p/v8/issues/detail?id=2692
-
 [ $compiler == dart2js && $jscl ]
 async/future_test: Fail # Timer interface not supported; dartbug.com/7728.
 async/slow_consumer2_test: Fail # Timer interface not supported; dartbug.com/7728.
@@ -57,8 +55,6 @@
 async/stream_periodic5_test: Fail # Timer interface not supported; dartbug.com/7728.
 
 [ $compiler == dart2js && $browser ]
-crypto/sha256_test: Slow, Pass
-crypto/sha1_test: Slow, Pass
 async/timer_not_available_test: Fail, OK # only meant to test when there is no way to
                                          # implement timer (currently only in d8)
 
@@ -75,12 +71,9 @@
 typed_data/float32x4_unbox_regress_test: Fail  # Issue 10961
 mirrors/reflect_runtime_type_test: Fail
 mirrors/reflect_uninstantiated_class_test: Fail
+mirrors/disable_tree_shaking_test: Fail
 
 
-[ $runtime == safari]
- # Bug in JSC: the test only passes when being debugged.
-crypto/hmac_md5_test: Fail, Pass
-
 [ $runtime == ff ]
 # FF setTimeout can fire early: https://bugzilla.mozilla.org/show_bug.cgi?id=291386
 multiple_timer_test: Pass, Fail
@@ -105,6 +98,7 @@
 [ $runtime == vm || ($compiler == none && $runtime == drt) ]
 async/run_async3_test: Fail # _enqueueImmediate runs after Timer. http://dartbug.com/9001.
 mirrors/metadata_test: Fail # http://dartbug.com/10906
+mirrors/superclass_test: Fail # http://dartbug.com/11142
 
 [ $compiler == none && $runtime == drt ]
 async/timer_isolate_test: Skip # See Issue 4997
@@ -117,12 +111,29 @@
 async/multiple_timer_test: Fail, Pass # See Issue 10982
 async/timer_test: Fail, Pass # See Issue 10982
 
-[ $arch == arm ]
-*: Skip
-
 [ $arch == simarm ]
 *: Skip
 
+[ $arch == arm ]
+async/slow_consumer2_test: Crash # Issue: 11207
+async/slow_consumer3_test: Crash # Issue: 11207
+async/slow_consumer_test: Crash # Issue: 11207
+async/stream_controller_async_test: Crash # Issue: 11207
+async/stream_from_iterable_test: Crash # Issue: 11207
+async/stream_periodic3_test: Crash # Issue: 11207
+async/stream_periodic4_test: Crash # Issue: 11207
+async/stream_periodic5_test: Crash # Issue: 11207
+async/stream_state_nonzero_timer_test: Crash # Issue: 11207
+async/stream_state_test: Crash # Issue: 11207
+async/stream_subscription_as_future_test: Crash # Issue: 11207
+async/stream_transform_test: Crash # Issue: 11207
+math/pi_test: Fail # Issue: 11207
+math/random_test: Fail # Issue: 11207
+typed_data/float32x4_list_test: Crash # Issue: 11207
+typed_data/float32x4_test: Crash # Issue: 11207
+typed_data/float32x4_unbox_phi_test: Crash # Issue: 11207
+typed_data/float32x4_unbox_regress_test: Crash # Issue: 11207
+
 [ $arch == mips ]
 *: Skip
 
diff --git a/tests/lib/mirrors/disable_tree_shaking_test.dart b/tests/lib/mirrors/disable_tree_shaking_test.dart
new file mode 100644
index 0000000..b34f352
--- /dev/null
+++ b/tests/lib/mirrors/disable_tree_shaking_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.
+
+// Ensure that reflection works on methods that would otherwise be
+// tree-shaken away.
+
+import "dart:mirrors";
+
+class Foo {
+  Foo();
+  foo() => 42;
+}
+
+main() {
+  // Do NOT instantiate Foo.
+  var m = reflectClass(Foo);
+  var instanceMirror = m.newInstance(new Symbol(''), []);
+  var result = instanceMirror.invoke(new Symbol('foo'), []).reflectee;
+  if (result != 42) {
+    throw 'Expected 42, but got $result';
+  }
+}
diff --git a/tests/lib/mirrors/generic_list_test.dart b/tests/lib/mirrors/generic_list_test.dart
new file mode 100644
index 0000000..79d5e94
--- /dev/null
+++ b/tests/lib/mirrors/generic_list_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.superclass;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+class Foo<T> {
+  List<T> makeList() {
+    if (new DateTime.now().millisecondsSinceEpoch == 42) return [];
+    return new List<T>();
+  }
+}
+
+main() {
+  List<String> list = new Foo<String>().makeList();
+  var cls = reflectClass(list.runtimeType);
+  Expect.isNotNull(cls, 'Failed to reflect on MyClass.');
+}
diff --git a/tests/lib/mirrors/superclass_test.dart b/tests/lib/mirrors/superclass_test.dart
new file mode 100644
index 0000000..a558c9d
--- /dev/null
+++ b/tests/lib/mirrors/superclass_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.superclass;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+class MyClass {
+}
+
+main() {
+  var cls = reflectClass(MyClass);
+  Expect.isNotNull(cls, 'Failed to reflect on MyClass.');
+  var superclass = cls.superclass;
+  Expect.isNotNull(superclass, 'Failed to obtain superclass of MyClass.');
+  Expect.equals(
+      reflectClass(Object), superclass, 'Superclass of MyClass is not Object.');
+  Expect.isNull(superclass.superclass, 'Superclass of Object is not null.');
+}
diff --git a/tests/standalone/io/directory_error_test.dart b/tests/standalone/io/directory_error_test.dart
index 123954c..9026513 100644
--- a/tests/standalone/io/directory_error_test.dart
+++ b/tests/standalone/io/directory_error_test.dart
@@ -15,7 +15,7 @@
 
 
 bool checkCreateInNonExistentFileException(e) {
-  Expect.isTrue(e is DirectoryIOException);
+  Expect.isTrue(e is DirectoryException);
   Expect.isTrue(e.osError != null);
   Expect.isTrue(e.toString().indexOf("Creation failed") != -1);
   if (Platform.operatingSystem == "linux") {
@@ -43,7 +43,7 @@
 
 
 bool checkCreateTempInNonExistentFileException(e) {
-  Expect.isTrue(e is DirectoryIOException);
+  Expect.isTrue(e is DirectoryException);
   Expect.isTrue(e.osError != null);
   if (Platform.operatingSystem == "linux") {
     Expect.equals(2, e.osError.errorCode);
@@ -70,7 +70,7 @@
 
 
 bool checkDeleteNonExistentFileException(e) {
-  Expect.isTrue(e is DirectoryIOException);
+  Expect.isTrue(e is DirectoryException);
   Expect.isTrue(e.osError != null);
   // File not not found has error code 2 on all supported platforms.
   Expect.equals(2, e.osError.errorCode);
@@ -92,7 +92,7 @@
 
 
 bool checkDeleteRecursivelyNonExistentFileException(e) {
-  Expect.isTrue(e is DirectoryIOException);
+  Expect.isTrue(e is DirectoryException);
   Expect.isTrue(e.osError != null);
   Expect.isTrue(e.toString().indexOf("Deletion failed") != -1);
   // File not not found has error code 2 on all supported platforms.
@@ -115,7 +115,7 @@
 
 
 bool checkListNonExistentFileException(e) {
-  Expect.isTrue(e is DirectoryIOException);
+  Expect.isTrue(e is DirectoryException);
   Expect.isTrue(e.osError != null);
   Expect.isTrue(e.toString().indexOf("Directory listing failed") != -1);
   if (Platform.operatingSystem == "linux") {
@@ -137,7 +137,7 @@
 
 void testListNonExistent(Directory temp, Function done) {
   Directory nonExistent = new Directory("${temp.path}/nonExistent");
-  Expect.throws(() => nonExistent.listSync(), (e) => e is DirectoryIOException);
+  Expect.throws(() => nonExistent.listSync(), (e) => e is DirectoryException);
   nonExistent.list().listen(
       (_) => Expect.fail("listing should not succeed"),
       onError: (e) {
@@ -151,11 +151,11 @@
   Directory nonExistent = new Directory("${temp.path}/nonExistent");
   var newPath = "${temp.path}/nonExistent2";
   Expect.throws(() => nonExistent.renameSync(newPath),
-                (e) => e is DirectoryIOException);
+                (e) => e is DirectoryException);
   var renameDone = nonExistent.rename(newPath);
   renameDone.then((ignore) => Expect.fail('rename non existent'))
             .catchError((error) {
-              Expect.isTrue(error is DirectoryIOException);
+              Expect.isTrue(error is DirectoryException);
             done();
   });
 }
@@ -167,11 +167,11 @@
   f.createSync();
   var d = new Directory(f.path);
   Expect.throws(() => d.renameSync(newPath),
-                (e) => e is DirectoryIOException);
+                (e) => e is DirectoryException);
   var renameDone = d.rename(newPath);
   renameDone.then((ignore) => Expect.fail('rename file as directory'))
             .catchError((error) {
-              Expect.isTrue(error is DirectoryIOException);
+              Expect.isTrue(error is DirectoryException);
               done();
             });
 }
@@ -183,11 +183,11 @@
   var fileName = '${temp.path}/x';
   new File(fileName).createSync();
   Expect.throws(() => temp1.renameSync(fileName),
-                (e) => e is DirectoryIOException);
+                (e) => e is DirectoryException);
   var renameDone = temp1.rename(fileName);
   renameDone.then((ignore) => Expect.fail('rename dir overwrite file'))
             .catchError((error) {
-              Expect.isTrue(error is DirectoryIOException);
+              Expect.isTrue(error is DirectoryException);
               temp1.deleteSync(recursive: true);
               done();
             });
diff --git a/tests/standalone/io/directory_list_nonexistent_test.dart b/tests/standalone/io/directory_list_nonexistent_test.dart
index 1e58f63..b514924 100644
--- a/tests/standalone/io/directory_list_nonexistent_test.dart
+++ b/tests/standalone/io/directory_list_nonexistent_test.dart
@@ -15,9 +15,9 @@
   var keepAlive = new ReceivePort();
   new Directory("").createTemp().then((d) {
     d.delete().then((ignore) {
-      Expect.throws(() => d.listSync(), (e) => e is DirectoryIOException);
+      Expect.throws(() => d.listSync(), (e) => e is DirectoryException);
       Expect.throws(() => d.listSync(recursive: true),
-                    (e) => e is DirectoryIOException);
+                    (e) => e is DirectoryException);
       keepAlive.close();
     });
   });
@@ -38,9 +38,9 @@
       }
       var long = new Directory("${buffer.toString()}");
       Expect.throws(() => long.listSync(),
-                    (e) => e is DirectoryIOException);
+                    (e) => e is DirectoryException);
       Expect.throws(() => long.listSync(recursive: true),
-                    (e) => e is DirectoryIOException);
+                    (e) => e is DirectoryException);
       d.deleteSync(recursive: true);
       keepAlive.close();
     });
diff --git a/tests/standalone/io/directory_test.dart b/tests/standalone/io/directory_test.dart
index e455343..6592281 100644
--- a/tests/standalone/io/directory_test.dart
+++ b/tests/standalone/io/directory_test.dart
@@ -90,7 +90,7 @@
       stream.listen(
           (_) => Expect.fail("Listing of non-existing directory should fail"),
           onError: (error) {
-            Expect.isTrue(error is DirectoryIOException);
+            Expect.isTrue(error is DirectoryException);
           });
     }
     new Directory("").createTemp().then((d) {
@@ -109,7 +109,7 @@
         stream.listen(
           (_) => Expect.fail("Listing of non-existing directory should fail"),
           onError: (error) {
-            Expect.isTrue(error is DirectoryIOException);
+            Expect.isTrue(error is DirectoryException);
             if (++errors == 2) {
               d.delete(recursive: true).then((_) {
                 port.close();
@@ -140,7 +140,7 @@
       future.then((ignore) {
         Expect.fail("Deletion of non-existing directory should fail");
       }).catchError((error) {
-        Expect.isTrue(error is DirectoryIOException);
+        Expect.isTrue(error is DirectoryException);
       });
     }
 
@@ -168,7 +168,7 @@
           var long = new Directory("${buffer.toString()}");
           var errors = 0;
           onError(error) {
-            Expect.isTrue(error is DirectoryIOException);
+            Expect.isTrue(error is DirectoryException);
             if (++errors == 2) {
               d.delete(recursive: true).then((ignore) => port.close());
             }
@@ -473,7 +473,7 @@
   var location = illegalTempDirectoryLocation();
   if (location != null) {
     Expect.throws(new Directory(location).createTempSync,
-                  (e) => e is DirectoryIOException);
+                  (e) => e is DirectoryException);
   }
 }
 
@@ -537,7 +537,7 @@
   file.createSync();
   Expect.isTrue(file.existsSync());
   Expect.throws(new Directory(path).createSync,
-                (e) => e is DirectoryIOException);
+                (e) => e is DirectoryException);
   temp.deleteSync(recursive: true);
 }
 
@@ -554,7 +554,7 @@
       subDir.create()
         .then((_) { Expect.fail("dir create should fail on existing file"); })
         .catchError((error) {
-          Expect.isTrue(error is DirectoryIOException);
+          Expect.isTrue(error is DirectoryException);
           temp.delete(recursive: true).then((_) {
             port.close();
           });
diff --git a/tests/standalone/io/file_error_test.dart b/tests/standalone/io/file_error_test.dart
index 8af6f1f..27753d6 100644
--- a/tests/standalone/io/file_error_test.dart
+++ b/tests/standalone/io/file_error_test.dart
@@ -14,7 +14,7 @@
 
 
 bool checkNonExistentFileException(e, str) {
-  Expect.isTrue(e is FileIOException);
+  Expect.isTrue(e is FileException);
   Expect.isTrue(e.osError != null);
   Expect.isTrue(e.toString().indexOf(str) != -1);
   // File not not found has error code 2 on all supported platforms.
@@ -105,7 +105,7 @@
 
 
 bool checkCreateInNonExistentDirectoryException(e) {
-  Expect.isTrue(e is FileIOException);
+  Expect.isTrue(e is FileException);
   Expect.isTrue(e.osError != null);
   Expect.isTrue(e.toString().indexOf("Cannot create file") != -1);
   if (Platform.operatingSystem == "linux") {
@@ -141,7 +141,7 @@
 }
 
 bool checkFullPathOnNonExistentDirectoryException(e) {
-  Expect.isTrue(e is FileIOException);
+  Expect.isTrue(e is FileException);
   Expect.isTrue(e.osError != null);
   Expect.isTrue(e.toString().indexOf("Cannot retrieve full path") != -1);
   // File not not found has error code 2 on all supported platforms.
@@ -235,7 +235,7 @@
 }
 
 bool checkWriteReadOnlyFileException(e) {
-  Expect.isTrue(e is FileIOException);
+  Expect.isTrue(e is FileException);
   Expect.isTrue(e.osError != null);
   Expect.isTrue(e.osError.errorCode != OSError.noErrorCode);
   return true;
@@ -313,7 +313,7 @@
 }
 
 bool checkFileClosedException(e) {
-  Expect.isTrue(e is FileIOException);
+  Expect.isTrue(e is FileException);
   Expect.isTrue(e.toString().indexOf("File closed") != -1);
   Expect.isTrue(e.osError == null);
   return true;
@@ -405,7 +405,7 @@
       var closeFuture = openedFile.close();
       closeFuture.then((ignore) => null)
       .catchError((error) {
-        Expect.isTrue(error is FileIOException);
+        Expect.isTrue(error is FileException);
         port.send(null);
       });
     });
@@ -417,7 +417,7 @@
     var openedFile = file.openSync();
     openedFile.closeSync();
     Expect.throws(openedFile.closeSync,
-                  (e) => e is FileIOException);
+                  (e) => e is FileException);
     port.send(null);
   });
 }
@@ -427,7 +427,7 @@
     var bigint = 100000000000000000000000000000000000000000;
     var openedFile = file.openSync();
     Expect.throws(() => openedFile.readSync(bigint),
-                  (e) => e is FileIOException);
+                  (e) => e is FileException);
     openedFile.closeSync();
     port.send(null);
   });
@@ -438,7 +438,7 @@
     var openedFile = file.openSync();
     openedFile.closeSync();
     Expect.throws(() => openedFile.readSync(1),
-                  (e) => e is FileIOException);
+                  (e) => e is FileException);
     port.send(null);
   });
 }
diff --git a/tests/standalone/io/file_invalid_arguments_test.dart b/tests/standalone/io/file_invalid_arguments_test.dart
index 273a8c7..3ae9a9c 100644
--- a/tests/standalone/io/file_invalid_arguments_test.dart
+++ b/tests/standalone/io/file_invalid_arguments_test.dart
@@ -15,7 +15,7 @@
     file.readSync(arg);
     Expect.fail('exception expected');
   } catch (e) {
-    Expect.isTrue(e is FileIOException);
+    Expect.isTrue(e is FileException);
     Expect.isTrue(e.toString().contains('Invalid arguments'));
   }
 
@@ -25,7 +25,7 @@
     Expect.fail('exception expected');
   }).catchError((error) {
     errors++;
-    Expect.isTrue(error is FileIOException);
+    Expect.isTrue(error is FileException);
     Expect.isTrue(error.toString().contains('Invalid arguments'));
     file.close().then((ignore) {
       Expect.equals(1, errors);
@@ -42,7 +42,7 @@
     file.readIntoSync(buffer, start, end);
     Expect.fail('exception expected');
   } catch (e) {
-    Expect.isTrue(e is FileIOException);
+    Expect.isTrue(e is FileException);
     Expect.isTrue(e.toString().contains('Invalid arguments'));
   }
 
@@ -52,7 +52,7 @@
     Expect.fail('exception expected');
   }).catchError((error) {
     errors++;
-    Expect.isTrue(error is FileIOException);
+    Expect.isTrue(error is FileException);
     Expect.isTrue(error.toString().contains('Invalid arguments'));
     file.close().then((ignore) {
       Expect.equals(1, errors);
@@ -69,7 +69,7 @@
     file.writeByteSync(value);
     Expect.fail('exception expected');
   } catch (e) {
-    Expect.isTrue(e is FileIOException);
+    Expect.isTrue(e is FileException);
     Expect.isTrue(e.toString().contains('Invalid argument'));
   }
 
@@ -77,7 +77,7 @@
   writeByteFuture.then((ignore) {
     Expect.fail('exception expected');
   }).catchError((error) {
-    Expect.isTrue(error is FileIOException);
+    Expect.isTrue(error is FileException);
     Expect.isTrue(error.toString().contains('Invalid argument'));
     file.close().then((ignore) {
       port.close();
@@ -93,7 +93,7 @@
     file.writeFromSync(buffer, start, end);
     Expect.fail('exception expected');
   } catch (e) {
-    Expect.isTrue(e is FileIOException);
+    Expect.isTrue(e is FileException);
     Expect.isTrue(e.toString().contains('Invalid arguments'));
   }
 
@@ -101,7 +101,7 @@
   writeFromFuture.then((ignore) {
     Expect.fail('exception expected');
   }).catchError((error) {
-    Expect.isTrue(error is FileIOException);
+    Expect.isTrue(error is FileException);
     Expect.isTrue(error.toString().contains('Invalid arguments'));
     file.close().then((ignore) {
       port.close();
@@ -117,14 +117,14 @@
     file.writeStringSync(string, encoding: encoding);
     Expect.fail('exception expected');
   } catch (e) {
-    Expect.isTrue(e is FileIOException);
+    Expect.isTrue(e is FileException);
   }
 
   var writeStringFuture = file.writeString(string, encoding: encoding);
   writeStringFuture.then((ignore) {
     Expect.fail('exception expected');
   }).catchError((error) {
-    Expect.isTrue(error is FileIOException);
+    Expect.isTrue(error is FileException);
     file.close().then((ignore) {
       port.close();
     });
diff --git a/tests/standalone/io/file_test.dart b/tests/standalone/io/file_test.dart
index 64cedd8..b931475 100644
--- a/tests/standalone/io/file_test.dart
+++ b/tests/standalone/io/file_test.dart
@@ -713,7 +713,7 @@
     openedFile.closeSync();
     try {
       openedFile.readByteSync();
-    } on FileIOException catch (ex) {
+    } on FileException catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -723,7 +723,7 @@
     exceptionCaught = false;
     try {
       openedFile.writeByteSync(1);
-    } on FileIOException catch (ex) {
+    } on FileException catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -733,7 +733,7 @@
     exceptionCaught = false;
     try {
       openedFile.writeStringSync("Test");
-    } on FileIOException catch (ex) {
+    } on FileException catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -744,7 +744,7 @@
     try {
       List<int> buffer = new List<int>(100);
       openedFile.readIntoSync(buffer, 0, 10);
-    } on FileIOException catch (ex) {
+    } on FileException catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -755,7 +755,7 @@
     try {
       List<int> buffer = new List<int>(100);
       openedFile.writeFromSync(buffer, 0, 10);
-    } on FileIOException catch (ex) {
+    } on FileException catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -765,7 +765,7 @@
     exceptionCaught = false;
     try {
       openedFile.positionSync();
-    } on FileIOException catch (ex) {
+    } on FileException catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -775,7 +775,7 @@
     exceptionCaught = false;
     try {
       openedFile.lengthSync();
-    } on FileIOException catch (ex) {
+    } on FileException catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -785,7 +785,7 @@
     exceptionCaught = false;
     try {
       openedFile.flushSync();
-    } on FileIOException catch (ex) {
+    } on FileException catch (ex) {
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
@@ -922,7 +922,7 @@
       f.openSync();
       Expect.fail("Expected exception opening directory as file");
     } catch (e) {
-      Expect.isTrue(e is FileIOException);
+      Expect.isTrue(e is FileException);
     }
   }
 
@@ -1086,9 +1086,9 @@
       Expect.equals(1, message);
     });
     var f = new File('.');
-    Expect.throws(f.readAsBytesSync, (e) => e is FileIOException);
-    Expect.throws(f.readAsStringSync, (e) => e is FileIOException);
-    Expect.throws(f.readAsLinesSync, (e) => e is FileIOException);
+    Expect.throws(f.readAsBytesSync, (e) => e is FileException);
+    Expect.throws(f.readAsStringSync, (e) => e is FileException);
+    Expect.throws(f.readAsLinesSync, (e) => e is FileException);
     var readAsBytesFuture = f.readAsBytes();
     readAsBytesFuture.then((bytes) => Expect.fail("no bytes expected"))
     .catchError((e) {
diff --git a/tests/standalone/io/http_client_connect_test.dart b/tests/standalone/io/http_client_connect_test.dart
index 67ee2a5..c4c4798 100644
--- a/tests/standalone/io/http_client_connect_test.dart
+++ b/tests/standalone/io/http_client_connect_test.dart
@@ -76,7 +76,7 @@
         Expect.fail("Request not expected");
       })
         .catchError((error) => port.close(),
-                    test: (error) => error is HttpParserException);
+                    test: (error) => error is HttpException);
   });
 }
 
diff --git a/tests/standalone/io/http_content_length_test.dart b/tests/standalone/io/http_content_length_test.dart
index 335121d..645e8e8 100644
--- a/tests/standalone/io/http_content_length_test.dart
+++ b/tests/standalone/io/http_content_length_test.dart
@@ -1,6 +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.
+//
+// VMOptions=
+// VMOptions=--short_socket_read
+// VMOptions=--short_socket_write
+// VMOptions=--short_socket_read --short_socket_write
 
 import "package:expect/expect.dart";
 import "dart:async";
@@ -8,7 +13,7 @@
 import "dart:io";
 
 void testNoBody(int totalConnections, bool explicitContentLength) {
-  var errors = 0;
+  int count = 0;
   HttpServer.bind("127.0.0.1", 0, backlog: totalConnections).then((server) {
     server.listen(
         (HttpRequest request) {
@@ -22,6 +27,9 @@
             })
             .catchError((error) {
               Expect.isTrue(error is HttpException);
+              if (++count == totalConnections) {
+                server.close();
+              }
             });
           // write with content length 0 closes the connection and
           // reports an error.
@@ -42,7 +50,6 @@
           Expect.fail(msg);
         });
 
-    int count = 0;
     HttpClient client = new HttpClient();
     for (int i = 0; i < totalConnections; i++) {
       client.get("127.0.0.1", server.port, "/")
@@ -55,14 +62,7 @@
           .then((response) {
             Expect.equals("0", response.headers.value('content-length'));
             Expect.equals(0, response.contentLength);
-            response.listen(
-                (d) {},
-                onDone: () {
-                  if (++count == totalConnections) {
-                    client.close();
-                    server.close();
-                  }
-                });
+            response.drain();
           })
           .catchError((e) {
             String msg = "Unexpected error $e";
@@ -258,7 +258,9 @@
 
 void main() {
   testNoBody(5, false);
+  testNoBody(25, false);
   testNoBody(5, true);
+  testNoBody(25, true);
   testBody(5, false);
   testBody(5, true);
   testBodyChunked(5, false);
diff --git a/tests/standalone/io/http_date_test.dart b/tests/standalone/io/http_date_test.dart
index df88afe..f3205ab 100644
--- a/tests/standalone/io/http_date_test.dart
+++ b/tests/standalone/io/http_date_test.dart
@@ -6,6 +6,7 @@
 import "dart:async";
 import "dart:math";
 
+part '../../../sdk/lib/io/common.dart';
 part "../../../sdk/lib/io/io_sink.dart";
 part "../../../sdk/lib/io/http.dart";
 part "../../../sdk/lib/io/http_impl.dart";
diff --git a/tests/standalone/io/http_detach_socket_test.dart b/tests/standalone/io/http_detach_socket_test.dart
index 2345079..1ced3d8 100644
--- a/tests/standalone/io/http_detach_socket_test.dart
+++ b/tests/standalone/io/http_detach_socket_test.dart
@@ -13,6 +13,7 @@
 
 void testServerDetachSocket() {
   HttpServer.bind("127.0.0.1", 0).then((server) {
+    server.serverHeader = null;
     server.listen((request) {
       var response = request.response;
       response.contentLength = 0;
@@ -89,6 +90,7 @@
     });
 
     var client = new HttpClient();
+    client.userAgent = null;
     client.get("127.0.0.1", server.port, "/")
       .then((request) => request.close())
       .then((response) {
diff --git a/tests/standalone/io/http_headers_test.dart b/tests/standalone/io/http_headers_test.dart
index b477497..a6cca81 100644
--- a/tests/standalone/io/http_headers_test.dart
+++ b/tests/standalone/io/http_headers_test.dart
@@ -6,6 +6,7 @@
 import 'dart:async';
 import 'dart:math';
 
+part '../../../sdk/lib/io/common.dart';
 part "../../../sdk/lib/io/io_sink.dart";
 part "../../../sdk/lib/io/http.dart";
 part "../../../sdk/lib/io/http_headers.dart";
diff --git a/tests/standalone/io/http_parser_test.dart b/tests/standalone/io/http_parser_test.dart
index a2ebc78..8ff7713 100644
--- a/tests/standalone/io/http_parser_test.dart
+++ b/tests/standalone/io/http_parser_test.dart
@@ -8,6 +8,7 @@
 import 'dart:typed_data';
 import 'dart:isolate';
 
+part '../../../sdk/lib/io/common.dart';
 part '../../../sdk/lib/io/io_sink.dart';
 part '../../../sdk/lib/io/http.dart';
 part '../../../sdk/lib/io/http_impl.dart';
diff --git a/tests/standalone/io/http_redirect_test.dart b/tests/standalone/io/http_redirect_test.dart
index f67ff751..d0b78a0 100644
--- a/tests/standalone/io/http_redirect_test.dart
+++ b/tests/standalone/io/http_redirect_test.dart
@@ -391,7 +391,7 @@
         Expect.equals(5, error.redirects.length);
         server.close();
         client.close();
-      }, test: (e) => e is RedirectLimitExceededException);
+      }, test: (e) => e is RedirectException);
   });
 }
 
@@ -406,7 +406,7 @@
         Expect.equals(2, error.redirects.length);
         server.close();
         client.close();
-      }, test: (e) => e is RedirectLoopException);
+      }, test: (e) => e is RedirectException);
   });
 }
 
diff --git a/tests/standalone/io/http_server_response_test.dart b/tests/standalone/io/http_server_response_test.dart
index f31d183..307cec1 100644
--- a/tests/standalone/io/http_server_response_test.dart
+++ b/tests/standalone/io/http_server_response_test.dart
@@ -43,12 +43,12 @@
               client.close();
             },
             onError: (error) {
-              Expect.isTrue(error is HttpParserException);
+              Expect.isTrue(error is HttpException);
             });
       })
       .catchError((error) {
          client.close();
-      }, test: (e) => e is HttpParserException);
+      }, test: (e) => e is HttpException);
   });
 }
 
diff --git a/tests/standalone/io/http_shutdown_test.dart b/tests/standalone/io/http_shutdown_test.dart
index f6b1424..dd5b622 100644
--- a/tests/standalone/io/http_shutdown_test.dart
+++ b/tests/standalone/io/http_shutdown_test.dart
@@ -173,7 +173,7 @@
             return request.close();
           })
         .then((response) { })
-        .catchError((e) { }, test: (e) => e is HttpParserException);
+        .catchError((e) { }, test: (e) => e is HttpException);
     }
     bool clientClosed = false;
     new Timer.periodic(new Duration(milliseconds: 100), (timer) {
diff --git a/tests/standalone/io/raw_secure_server_socket_test.dart b/tests/standalone/io/raw_secure_server_socket_test.dart
index a07083b..a886f7d 100644
--- a/tests/standalone/io/raw_secure_server_socket_test.dart
+++ b/tests/standalone/io/raw_secure_server_socket_test.dart
@@ -33,7 +33,7 @@
   RawSecureServerSocket.bind("ko.faar.__hest__", 0, CERTIFICATE).then((_) {
     Expect.fail("Failure expected");
   }).catchError((error) {
-    Expect.isTrue(error is SocketIOException);
+    Expect.isTrue(error is SocketException);
     port.toSendPort().send(1);
   });
 
@@ -41,7 +41,7 @@
   RawSecureServerSocket.bind("8.8.8.8", 0, CERTIFICATE).then((_) {
     Expect.fail("Failure expected");
   }).catchError((error) {
-    Expect.isTrue(error is SocketIOException);
+    Expect.isTrue(error is SocketException);
     port.toSendPort().send(1);
   });
 
@@ -61,7 +61,7 @@
     })
     .catchError((error) {
       Expect.notEquals('windows', Platform.operatingSystem);
-      Expect.isTrue(error is SocketIOException);
+      Expect.isTrue(error is SocketException);
       s.close();
       port.toSendPort().send(1);
     });
@@ -83,7 +83,7 @@
   });
 }
 
-void testSimpleConnectFail(String certificate) {
+void testSimpleConnectFail(String certificate, bool cancelOnError) {
   ReceivePort port = new ReceivePort();
   RawSecureServerSocket.bind(HOST_NAME, 0, certificate).then((server) {
     var clientEndFuture = RawSecureSocket.connect(HOST_NAME, server.port)
@@ -91,15 +91,19 @@
         Expect.fail("No client connection expected.");
       })
       .catchError((error) {
-        Expect.isTrue(error is SocketIOException);
+        Expect.isTrue(error is SocketException);
       });
     server.listen((serverEnd) {
       Expect.fail("No server connection expected.");
     },
     onError: (error) {
-      Expect.isTrue(error is SocketIOException);
-      clientEndFuture.then((_) => port.close());
-    });
+      Expect.isTrue(error is SocketException);
+      clientEndFuture.then((_) {
+        if (!cancelOnError) server.close();
+        port.close();
+      });
+    },
+    cancelOnError: cancelOnError);
   });
 }
 
@@ -445,8 +449,10 @@
   testInvalidBind();
   testSimpleConnect(CERTIFICATE);
   testSimpleConnect("CN=localhost");
-  testSimpleConnectFail("not_a_nickname");
-  testSimpleConnectFail("CN=notARealDistinguishedName");
+  testSimpleConnectFail("not_a_nickname", false);
+  testSimpleConnectFail("CN=notARealDistinguishedName", false);
+  testSimpleConnectFail("not_a_nickname", true);
+  testSimpleConnectFail("CN=notARealDistinguishedName", true);
   testServerListenAfterConnect();
   testSimpleReadWrite(true, true, false);
   testSimpleReadWrite(true, false, false);
diff --git a/tests/standalone/io/raw_socket_test.dart b/tests/standalone/io/raw_socket_test.dart
index ed5c494..609b96f 100644
--- a/tests/standalone/io/raw_socket_test.dart
+++ b/tests/standalone/io/raw_socket_test.dart
@@ -35,7 +35,7 @@
   RawServerSocket.bind("ko.faar.__hest__", 0)
       .then((_) { Expect.fail("Failure expected"); } )
       .catchError((error) {
-        Expect.isTrue(error is SocketIOException);
+        Expect.isTrue(error is SocketException);
         port.toSendPort().send(1);
       });
 
@@ -43,7 +43,7 @@
   RawServerSocket.bind("8.8.8.8", 0)
       .then((_) { Expect.fail("Failure expected"); } )
       .catchError((error) {
-        Expect.isTrue(error is SocketIOException);
+        Expect.isTrue(error is SocketException);
         port.toSendPort().send(1);
       });
 
@@ -61,7 +61,7 @@
             })
             .catchError((error) {
               Expect.notEquals('windows', Platform.operatingSystem);
-              Expect.isTrue(error is SocketIOException);
+              Expect.isTrue(error is SocketException);
               port.toSendPort().send(1);
             });
       });
diff --git a/tests/standalone/io/secure_no_builtin_roots_database_test.dart b/tests/standalone/io/secure_no_builtin_roots_database_test.dart
index dcdb2be..b5a06af 100644
--- a/tests/standalone/io/secure_no_builtin_roots_database_test.dart
+++ b/tests/standalone/io/secure_no_builtin_roots_database_test.dart
@@ -14,7 +14,7 @@
       .then((request) => request.close())
       .then((response) => Expect.fail("Unexpected successful connection"))
       .catchError((error) {
-        Expect.isTrue(error is SocketIOException);
+        Expect.isTrue(error is SocketException);
         keepAlive.close();
         client.close();
       });
diff --git a/tests/standalone/io/secure_no_builtin_roots_test.dart b/tests/standalone/io/secure_no_builtin_roots_test.dart
index a71c5fc..9bc5ef6 100644
--- a/tests/standalone/io/secure_no_builtin_roots_test.dart
+++ b/tests/standalone/io/secure_no_builtin_roots_test.dart
@@ -14,7 +14,7 @@
       .then((request) => request.close())
       .then((response) => Expect.fail("Unexpected successful connection"))
       .catchError((error) {
-        Expect.isTrue(error is SocketIOException);
+        Expect.isTrue(error is SocketException);
         keepAlive.close();
         client.close();
       });
diff --git a/tests/standalone/io/secure_server_socket_test.dart b/tests/standalone/io/secure_server_socket_test.dart
index 478a53a..a7c0801 100644
--- a/tests/standalone/io/secure_server_socket_test.dart
+++ b/tests/standalone/io/secure_server_socket_test.dart
@@ -33,7 +33,7 @@
   SecureServerSocket.bind("ko.faar.__hest__", 0, CERTIFICATE).then((_) {
     Expect.fail("Failure expected");
   }).catchError((error) {
-    Expect.isTrue(error is SocketIOException);
+    Expect.isTrue(error is SocketException);
     port.toSendPort().send(1);
   });
 
@@ -41,7 +41,7 @@
   SecureServerSocket.bind("8.8.8.8", 0, CERTIFICATE).then((_) {
     Expect.fail("Failure expected");
   }).catchError((error) {
-    Expect.isTrue(error is SocketIOException);
+    Expect.isTrue(error is SocketException);
     port.toSendPort().send(1);
   });
 
@@ -60,7 +60,7 @@
       port.toSendPort().send(1);
     }).catchError((error) {
       Expect.notEquals('windows', Platform.operatingSystem);
-      Expect.isTrue(error is SocketIOException);
+      Expect.isTrue(error is SocketException);
       s.close();
       port.toSendPort().send(1);
     });
@@ -82,7 +82,7 @@
   });
 }
 
-void testSimpleConnectFail(String certificate) {
+void testSimpleConnectFail(String certificate, bool cancelOnError) {
   ReceivePort port = new ReceivePort();
   SecureServerSocket.bind(HOST_NAME, 0, certificate).then((server) {
     var clientEndFuture = SecureSocket.connect(HOST_NAME, server.port)
@@ -90,15 +90,19 @@
         Expect.fail("No client connection expected.");
       })
       .catchError((error) {
-        Expect.isTrue(error is SocketIOException);
+        Expect.isTrue(error is SocketException);
       });
     server.listen((serverEnd) {
       Expect.fail("No server connection expected.");
     },
     onError: (error) {
-      Expect.isTrue(error is SocketIOException);
-      clientEndFuture.then((_) => port.close());
-    });
+      Expect.isTrue(error is SocketException);
+      clientEndFuture.then((_) {
+        if (!cancelOnError) server.close();
+        port.close();
+      });
+    },
+    cancelOnError: cancelOnError);
   });
 }
 
@@ -198,8 +202,10 @@
   testInvalidBind();
   testSimpleConnect(CERTIFICATE);
   testSimpleConnect("CN=localhost");
-  testSimpleConnectFail("not_a_nickname");
-  testSimpleConnectFail("CN=notARealDistinguishedName");
+  testSimpleConnectFail("not_a_nickname", false);
+  testSimpleConnectFail("CN=notARealDistinguishedName", false);
+  testSimpleConnectFail("not_a_nickname", true);
+  testSimpleConnectFail("CN=notARealDistinguishedName", true);
   testServerListenAfterConnect();
   testSimpleReadWrite();
 }
diff --git a/tests/standalone/io/socket_exception_test.dart b/tests/standalone/io/socket_exception_test.dart
index 79f5b72..41290d6 100644
--- a/tests/standalone/io/socket_exception_test.dart
+++ b/tests/standalone/io/socket_exception_test.dart
@@ -20,7 +20,7 @@
       server.close();
       try {
         server.close();
-      } on SocketIOException catch(ex) {
+      } on SocketException catch(ex) {
         exceptionCaught = true;
       } catch (ex) {
         wrongExceptionCaught = true;
@@ -31,7 +31,7 @@
       // Test invalid host.
       ServerSocket.bind("__INVALID_HOST__", 0)
         .then((server) { })
-        .catchError((e) => e is SocketIOException);
+        .catchError((e) => e is SocketException);
     });
   }
 
@@ -70,7 +70,7 @@
         client.close();
         try {
           client.close();
-        } on SocketIOException catch(ex) {
+        } on SocketException catch(ex) {
           exceptionCaught = true;
         } catch (ex) {
           wrongExceptionCaught = true;
@@ -79,7 +79,7 @@
         Expect.isFalse(wrongExceptionCaught);
         try {
           client.destroy();
-        } on SocketIOException catch(ex) {
+        } on SocketException catch(ex) {
           exceptionCaught = true;
         } catch (ex) {
           print(ex);
@@ -164,7 +164,7 @@
         client.listen(
             (data) => Expect.fail("Unexpected data"),
             onError: (error) {
-              Expect.isTrue(error is SocketIOException);
+              Expect.isTrue(error is SocketException);
               errors++;
             },
             onDone: () {
@@ -184,7 +184,7 @@
               Expect.fail("Expected error");
             },
             onError: (error) {
-              Expect.isTrue(error is SocketIOException);
+              Expect.isTrue(error is SocketException);
               port.close();
             });
       });
@@ -218,7 +218,7 @@
 
     Socket.connect("hede.hule.hest", 1234)
         .then((socket) => Expect.fail("Connection completed"))
-        .catchError((e) => port.close(), test: (e) => e is SocketIOException);
+        .catchError((e) => port.close(), test: (e) => e is SocketException);
 
   }
 
diff --git a/tests/standalone/io/socket_invalid_arguments_test.dart b/tests/standalone/io/socket_invalid_arguments_test.dart
index e3b8714..24025ae 100644
--- a/tests/standalone/io/socket_invalid_arguments_test.dart
+++ b/tests/standalone/io/socket_invalid_arguments_test.dart
@@ -20,7 +20,7 @@
 testSocketCreation(host, port) {
   Socket.connect(host, port)
       .then((socket) => Expect.fail("Shouldn't get connected"))
-      .catchError((e) => null, test: (e) => e is SocketIOException)
+      .catchError((e) => null, test: (e) => e is SocketException)
       .catchError((e) => null, test: (e) => e is ArgumentError);
 }
 
diff --git a/tests/standalone/io/socket_test.dart b/tests/standalone/io/socket_test.dart
index e9f2077..32e7742 100644
--- a/tests/standalone/io/socket_test.dart
+++ b/tests/standalone/io/socket_test.dart
@@ -35,7 +35,7 @@
   ServerSocket.bind("ko.faar.__hest__", 0)
       .then((_) { Expect.fail("Failure expected"); } )
       .catchError((error) {
-        Expect.isTrue(error is SocketIOException);
+        Expect.isTrue(error is SocketException);
         port.toSendPort().send(1);
       });
 
@@ -43,7 +43,7 @@
   ServerSocket.bind("8.8.8.8", 0)
       .then((_) { Expect.fail("Failure expected"); } )
       .catchError((error) {
-        Expect.isTrue(error is SocketIOException);
+        Expect.isTrue(error is SocketException);
         port.toSendPort().send(1);
       });
 
@@ -61,7 +61,7 @@
             })
             .catchError((error) {
               Expect.notEquals('windows', Platform.operatingSystem);
-              Expect.isTrue(error is SocketIOException);
+              Expect.isTrue(error is SocketException);
               port.toSendPort().send(1);
             });
       });
diff --git a/tests/standalone/io/url_encoding_test.dart b/tests/standalone/io/url_encoding_test.dart
index cbe2130..f16a2ec 100644
--- a/tests/standalone/io/url_encoding_test.dart
+++ b/tests/standalone/io/url_encoding_test.dart
@@ -6,6 +6,7 @@
 import "dart:async";
 import "dart:utf";
 
+part '../../../sdk/lib/io/common.dart';
 part '../../../sdk/lib/io/io_sink.dart';
 part "../../../sdk/lib/io/http.dart";
 part "../../../sdk/lib/io/http_impl.dart";
diff --git a/tests/standalone/io/web_socket_protocol_processor_test.dart b/tests/standalone/io/web_socket_protocol_processor_test.dart
index 2aa9fb9..f5c362f 100644
--- a/tests/standalone/io/web_socket_protocol_processor_test.dart
+++ b/tests/standalone/io/web_socket_protocol_processor_test.dart
@@ -10,6 +10,7 @@
 import "dart:typed_data";
 import "dart:isolate";
 
+part '../../../sdk/lib/io/common.dart';
 part "../../../sdk/lib/io/http.dart";
 part "../../../sdk/lib/io/buffer_list.dart";
 part "../../../sdk/lib/io/io_sink.dart";
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 5a03bd8..e690afa 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -16,11 +16,6 @@
 # Skip this because it is leaving temp directories behind when it fails.
 io/skipping_dart2js_compilations_test: Skip
 
-io/http_content_length_test: Pass, Fail # Issue 10934
-
-[ $runtime == vm && ( $system == windows ) ]
-io/raw_socket_test: Pass, Fail # Issue 8901
-
 [ $runtime == vm ]
 package/package_isolate_test: Fail # http://dartbug.com/7520.
 # The test is flaky, and is timing out, causing buildbot cycle times to rise.
@@ -164,12 +159,123 @@
 # Skip until we stabilize language tests.
 *: Skip
 
-[ $arch == arm ]
-*: Skip
-
 [ $arch == simarm ]
 *: Skip
 
+[ $arch == arm ]
+constant_left_shift_test: Fail # Issue: 11207
+coverage_test: Crash # Issue: 11207
+debugger/basic_debugger_test: Crash # Issue: 11207
+debugger/closure_debugger_test: Crash # Issue: 11207
+deoptimization_test: Crash # Issue: 11207
+float_array_test: Crash # Issue: 11207
+http_launch_test: Crash # Issue: 11207
+io/dart_std_io_pipe_test: Crash # Issue: 11207
+io/delete_symlink_test: Crash # Issue: 11207
+io/directory_test: Crash # Issue: 11207
+io/echo_server_stream_test: Crash # Issue: 11207
+io/file_error_test: Crash # Issue: 11207
+io/file_fuzz_test: Crash # Issue: 11207
+io/file_non_ascii_test: Crash # Issue: 11207
+io/file_read_special_device_test: Fail # Issue: 11207
+io/file_stat_test: Crash # Issue: 11207
+io/file_system_async_links_test: Crash # Issue: 11207
+io/file_test: Crash # Issue: 11207
+io/file_write_as_test: Crash # Issue: 11207
+io/http_10_test: Crash # Issue: 11207
+io/http_advanced_test: Crash # Issue: 11207
+io/http_auth_digest_test: Crash # Issue: 11207
+io/http_auth_test: Crash # Issue: 11207
+io/http_basic_test: Crash # Issue: 11207
+io/http_body_test: Crash # Issue: 11207
+io/http_client_connect_test: Crash # Issue: 11207
+io/http_client_request_test: Crash # Issue: 11207
+io/http_client_timeout_test: Crash # Issue: 11207
+io/http_close_test: Crash # Issue: 11207
+io/http_compression_test: Crash # Issue: 11207
+io/http_connection_close_test: Crash # Issue: 11207
+io/http_connection_header_test: Crash # Issue: 11207
+io/http_connection_info_test: Crash # Issue: 11207
+io/http_content_length_test: Crash # Issue: 11207
+io/http_cookie_test: Crash # Issue: 11207
+io/http_detach_socket_test: Crash # Issue: 11207
+io/http_headers_state_test: Crash # Issue: 11207
+io/http_head_test: Crash # Issue: 11207
+io/http_keep_alive_test: Crash # Issue: 11207
+io/http_multipart_test: Crash # Issue: 11207
+io/http_proxy_test: Crash # Issue: 11207
+io/http_read_test: Crash # Issue: 11207
+io/http_redirect_test: Crash # Issue: 11207
+io/http_request_pipeling_test: Crash # Issue: 11207
+io/https_client_certificate_test: Crash # Issue: 11207
+io/http_server_early_client_close2_test: Crash # Issue: 11207
+io/http_server_early_client_close_test: Crash # Issue: 11207
+io/http_server_early_server_close_test: Crash # Issue: 11207
+io/http_server_response_test: Crash # Issue: 11207
+io/http_server_test: Crash # Issue: 11207
+io/http_session_test: Crash # Issue: 11207
+io/http_shutdown_test: Crash # Issue: 11207
+io/https_server_test: Crash # Issue: 11207
+io/http_stream_close_test: Crash # Issue: 11207
+io/link_async_test: Crash # Issue: 11207
+io/link_test: Crash # Issue: 11207
+io/pipe_server_test: Crash # Issue: 11207
+io/process_check_arguments_test: Crash # Issue: 11207
+io/process_environment_test: Crash # Issue: 11207
+io/process_exit_test: Crash # Issue: 11207
+io/process_invalid_arguments_test: Crash # Issue: 11207
+io/process_path_environment_test: Crash # Issue: 11207
+io/process_path_test: Crash # Issue: 11207
+io/process_pid_test: Crash # Issue: 11207
+io/process_run_output_test: Crash # Issue: 11207
+io/process_segfault_test: Crash # Issue: 11207
+io/process_set_exit_code_test: Crash # Issue: 11207
+io/process_shell_test: Crash # Issue: 11207
+io/process_stderr_test: Crash # Issue: 11207
+io/process_stdin_transform_unsubscribe_test: Crash # Issue: 11207
+io/process_stdout_test: Crash # Issue: 11207
+io/process_working_directory_test: Crash # Issue: 11207
+io/raw_secure_server_closing_test: Crash # Issue: 11207
+io/raw_secure_server_socket_argument_test: Crash # Issue: 11207
+io/raw_secure_server_socket_test: Crash # Issue: 11207
+io/raw_secure_socket_pause_test: Crash # Issue: 11207
+io/raw_secure_socket_test: Crash # Issue: 11207
+io/raw_socket_test: Crash # Issue: 11207
+io/regress_10026_test: Crash # Issue: 11207
+io/regress_7191_test: Crash # Issue: 11207
+io/regress_8828_test: Crash # Issue: 11207
+io/regress_9194_test: Crash # Issue: 11207
+io/secure_builtin_roots_database_test: Crash # Issue: 11207
+io/secure_builtin_roots_test: Crash # Issue: 11207
+io/secure_client_raw_server_test: Crash # Issue: 11207
+io/secure_client_server_test: Crash # Issue: 11207
+io/secure_multiple_client_server_test: Crash # Issue: 11207
+io/secure_no_builtin_roots_database_test: Crash # Issue: 11207
+io/secure_no_builtin_roots_test: Crash # Issue: 11207
+io/secure_server_client_certificate_test: Crash # Issue: 11207
+io/secure_server_closing_test: Crash # Issue: 11207
+io/secure_server_socket_test: Crash # Issue: 11207
+io/secure_session_resume_test: Crash # Issue: 11207
+io/secure_socket_argument_test: Crash # Issue: 11207
+io/secure_socket_bad_certificate_test: Crash # Issue: 11207
+io/secure_socket_test: Crash # Issue: 11207
+io/socket_close_test: Crash # Issue: 11207
+io/socket_exception_test: timeout # Issue: 11207
+io/socket_invalid_arguments_test: Crash # Issue: 11207
+io/socket_ipv6_test: Crash # Issue: 11207
+io/socket_test: Crash # Issue: 11207
+io/socket_upgrade_to_secure_test: Crash # Issue: 11207
+io/status_file_parser_test: Crash # Issue: 11207
+io/stdout_stderr_test: Crash # Issue: 11207
+io/stream_pipe_test: Crash # Issue: 11207
+io/test_extension_fail_test: Crash # Issue: 11207
+io/test_extension_test: Crash # Issue: 11207
+io/web_socket_protocol_processor_test: Crash # Issue: 11207
+io/web_socket_test: Crash # Issue: 11207
+left_shift_bit_and_op_test: Fail # Issue: 11207
+typed_data_test: Crash # Issue: 11207
+
+
 [ $arch == mips ]
 *: Skip
 
diff --git a/tools/VERSION b/tools/VERSION
index 708e4dc..6a33a33 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 5
-BUILD 16
+BUILD 17
 PATCH 0
diff --git a/tools/build.py b/tools/build.py
index 71b9247..c666fbab 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -119,7 +119,8 @@
 def SetTools(arch, toolchainprefix):
   toolsOverride = None
   if arch == 'arm' and toolchainprefix == None:
-    toolchainprefix = DEFAULT_ARM_CROSS_COMPILER_PATH + "/bin/arm-linux-gnueabi"
+    toolchainprefix = (DEFAULT_ARM_CROSS_COMPILER_PATH +
+                       "/bin/arm-linux-gnueabihf")
   if toolchainprefix:
     toolsOverride = {
       "CC.target"  :  toolchainprefix + "-gcc",
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 224f22e..5e3e72f 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -299,59 +299,32 @@
     "support_level": "experimental"
   },
   "CSSFilterRule": {
+    "comment": "http://www.w3.org/TR/filter-effects/",
     "members": {
-      "style": {
-        "support_level": "untriaged"
-      }
+      "style": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "CSSFilterValue": {
+    "comment": "http://dev.w3.org/csswg/cssom/",
+    "dart_action": "suppress",
     "members": {
-      "CSS_FILTER_BLUR": {
-        "support_level": "untriaged"
-      },
-      "CSS_FILTER_BRIGHTNESS": {
-        "support_level": "untriaged"
-      },
-      "CSS_FILTER_CONTRAST": {
-        "support_level": "untriaged"
-      },
-      "CSS_FILTER_CUSTOM": {
-        "support_level": "untriaged"
-      },
-      "CSS_FILTER_DROP_SHADOW": {
-        "support_level": "untriaged"
-      },
-      "CSS_FILTER_GRAYSCALE": {
-        "support_level": "untriaged"
-      },
-      "CSS_FILTER_HUE_ROTATE": {
-        "support_level": "untriaged"
-      },
-      "CSS_FILTER_INVERT": {
-        "support_level": "untriaged"
-      },
-      "CSS_FILTER_OPACITY": {
-        "support_level": "untriaged"
-      },
-      "CSS_FILTER_REFERENCE": {
-        "support_level": "untriaged"
-      },
-      "CSS_FILTER_SATURATE": {
-        "support_level": "untriaged"
-      },
-      "CSS_FILTER_SEPIA": {
-        "support_level": "untriaged"
-      },
-      "__getter__": {
-        "support_level": "untriaged"
-      },
-      "operationType": {
-        "support_level": "untriaged"
-      }
+      "CSS_FILTER_BLUR": {},
+      "CSS_FILTER_BRIGHTNESS": {},
+      "CSS_FILTER_CONTRAST": {},
+      "CSS_FILTER_CUSTOM": {},
+      "CSS_FILTER_DROP_SHADOW": {},
+      "CSS_FILTER_GRAYSCALE": {},
+      "CSS_FILTER_HUE_ROTATE": {},
+      "CSS_FILTER_INVERT": {},
+      "CSS_FILTER_OPACITY": {},
+      "CSS_FILTER_REFERENCE": {},
+      "CSS_FILTER_SATURATE": {},
+      "CSS_FILTER_SEPIA": {},
+      "__getter__": {},
+      "operationType": {}
     },
-    "support_level": "untriaged"
+    "support_level": "deprecated"
   },
   "CSSFontFaceLoadEvent": {
     "comment": "http://www.w3.org/TR/css3-fonts/",
@@ -387,140 +360,64 @@
     "support_level": "stable"
   },
   "CSSKeyframeRule": {
+    "comment": "http://www.w3.org/TR/css3-animations/#CSSKeyframeRule-interface",
     "members": {
-      "keyText": {
-        "support_level": "untriaged"
-      },
-      "style": {
-        "support_level": "untriaged"
-      }
+      "keyText": {},
+      "style": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "CSSKeyframesRule": {
+    "comment": "http://www.w3.org/TR/css3-animations/#csskeyframesrule",
     "members": {
-      "__getter__": {
-        "support_level": "untriaged"
-      },
-      "cssRules": {
-        "support_level": "untriaged"
-      },
-      "deleteRule": {
-        "support_level": "untriaged"
-      },
-      "findRule": {
-        "support_level": "untriaged"
-      },
-      "insertRule": {
-        "support_level": "untriaged"
-      },
-      "name": {
-        "support_level": "untriaged"
-      }
+      "__getter__": {},
+      "cssRules": {},
+      "deleteRule": {},
+      "findRule": {},
+      "insertRule": {},
+      "name": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "CSSMatrix": {
+    "comment": "http://dev.w3.org/csswg/cssom/",
+    "dart_action": "suppress",
     "members": {
       "CSSMatrix": {},
-      "a": {
-        "support_level": "untriaged"
-      },
-      "b": {
-        "support_level": "untriaged"
-      },
-      "c": {
-        "support_level": "untriaged"
-      },
-      "d": {
-        "support_level": "untriaged"
-      },
-      "e": {
-        "support_level": "untriaged"
-      },
-      "f": {
-        "support_level": "untriaged"
-      },
-      "inverse": {
-        "support_level": "untriaged"
-      },
-      "m11": {
-        "support_level": "untriaged"
-      },
-      "m12": {
-        "support_level": "untriaged"
-      },
-      "m13": {
-        "support_level": "untriaged"
-      },
-      "m14": {
-        "support_level": "untriaged"
-      },
-      "m21": {
-        "support_level": "untriaged"
-      },
-      "m22": {
-        "support_level": "untriaged"
-      },
-      "m23": {
-        "support_level": "untriaged"
-      },
-      "m24": {
-        "support_level": "untriaged"
-      },
-      "m31": {
-        "support_level": "untriaged"
-      },
-      "m32": {
-        "support_level": "untriaged"
-      },
-      "m33": {
-        "support_level": "untriaged"
-      },
-      "m34": {
-        "support_level": "untriaged"
-      },
-      "m41": {
-        "support_level": "untriaged"
-      },
-      "m42": {
-        "support_level": "untriaged"
-      },
-      "m43": {
-        "support_level": "untriaged"
-      },
-      "m44": {
-        "support_level": "untriaged"
-      },
-      "multiply": {
-        "support_level": "untriaged"
-      },
-      "rotate": {
-        "support_level": "untriaged"
-      },
-      "rotateAxisAngle": {
-        "support_level": "untriaged"
-      },
-      "scale": {
-        "support_level": "untriaged"
-      },
-      "setMatrixValue": {
-        "support_level": "untriaged"
-      },
-      "skewX": {
-        "support_level": "untriaged"
-      },
-      "skewY": {
-        "support_level": "untriaged"
-      },
-      "toString": {
-        "support_level": "untriaged"
-      },
-      "translate": {
-        "support_level": "untriaged"
-      }
+      "a": {},
+      "b": {},
+      "c": {},
+      "d": {},
+      "e": {},
+      "f": {},
+      "inverse": {},
+      "m11": {},
+      "m12": {},
+      "m13": {},
+      "m14": {},
+      "m21": {},
+      "m22": {},
+      "m23": {},
+      "m24": {},
+      "m31": {},
+      "m32": {},
+      "m33": {},
+      "m34": {},
+      "m41": {},
+      "m42": {},
+      "m43": {},
+      "m44": {},
+      "multiply": {},
+      "rotate": {},
+      "rotateAxisAngle": {},
+      "scale": {},
+      "setMatrixValue": {},
+      "skewX": {},
+      "skewY": {},
+      "toString": {},
+      "translate": {}
     },
-    "support_level": "untriaged"
+    "support_level": "deprecated"
   },
   "CSSMediaRule": {
     "comment": "http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule",
@@ -533,8 +430,10 @@
     "support_level": "stable"
   },
   "CSSMixFunctionValue": {
+    "comment": "http://dev.w3.org/csswg/cssom/",
+    "dart_action": "suppress",
     "members": {},
-    "support_level": "untriaged"
+    "support_level": "deprecated"
   },
   "CSSPageRule": {
     "comment": "http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPageRule",
@@ -590,12 +489,11 @@
     "support_level": "deprecated"
   },
   "CSSRegionRule": {
+    "comment": "http://dev.w3.org/csswg/css-regions/#region-style-rule-interface",
     "members": {
-      "cssRules": {
-        "support_level": "untriaged"
-      }
+      "cssRules": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "CSSRule": {
     "comment": "http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule",
@@ -650,9 +548,7 @@
   "CSSStyleDeclaration": {
     "comment": "http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface",
     "members": {
-      "__setter__": {
-        "support_level": "untriaged"
-      },
+      "__setter__": {},
       "cssText": {},
       "getPropertyCSSValue": {
         "comment": "http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface",
@@ -707,78 +603,34 @@
     "support_level": "standard"
   },
   "CSSTransformValue": {
+    "comment": "http://dev.w3.org/csswg/cssom/",
+    "dart_action": "suppress",
     "members": {
-      "CSS_MATRIX": {
-        "support_level": "untriaged"
-      },
-      "CSS_MATRIX3D": {
-        "support_level": "untriaged"
-      },
-      "CSS_PERSPECTIVE": {
-        "support_level": "untriaged"
-      },
-      "CSS_ROTATE": {
-        "support_level": "untriaged"
-      },
-      "CSS_ROTATE3D": {
-        "support_level": "untriaged"
-      },
-      "CSS_ROTATEX": {
-        "support_level": "untriaged"
-      },
-      "CSS_ROTATEY": {
-        "support_level": "untriaged"
-      },
-      "CSS_ROTATEZ": {
-        "support_level": "untriaged"
-      },
-      "CSS_SCALE": {
-        "support_level": "untriaged"
-      },
-      "CSS_SCALE3D": {
-        "support_level": "untriaged"
-      },
-      "CSS_SCALEX": {
-        "support_level": "untriaged"
-      },
-      "CSS_SCALEY": {
-        "support_level": "untriaged"
-      },
-      "CSS_SCALEZ": {
-        "support_level": "untriaged"
-      },
-      "CSS_SKEW": {
-        "support_level": "untriaged"
-      },
-      "CSS_SKEWX": {
-        "support_level": "untriaged"
-      },
-      "CSS_SKEWY": {
-        "support_level": "untriaged"
-      },
-      "CSS_TRANSLATE": {
-        "support_level": "untriaged"
-      },
-      "CSS_TRANSLATE3D": {
-        "support_level": "untriaged"
-      },
-      "CSS_TRANSLATEX": {
-        "support_level": "untriaged"
-      },
-      "CSS_TRANSLATEY": {
-        "support_level": "untriaged"
-      },
-      "CSS_TRANSLATEZ": {
-        "support_level": "untriaged"
-      },
-      "__getter__": {
-        "support_level": "untriaged"
-      },
-      "operationType": {
-        "support_level": "untriaged"
-      }
+      "CSS_MATRIX": {},
+      "CSS_MATRIX3D": {},
+      "CSS_PERSPECTIVE": {},
+      "CSS_ROTATE": {},
+      "CSS_ROTATE3D": {},
+      "CSS_ROTATEX": {},
+      "CSS_ROTATEY": {},
+      "CSS_ROTATEZ": {},
+      "CSS_SCALE": {},
+      "CSS_SCALE3D": {},
+      "CSS_SCALEX": {},
+      "CSS_SCALEY": {},
+      "CSS_SCALEZ": {},
+      "CSS_SKEW": {},
+      "CSS_SKEWX": {},
+      "CSS_SKEWY": {},
+      "CSS_TRANSLATE": {},
+      "CSS_TRANSLATE3D": {},
+      "CSS_TRANSLATEX": {},
+      "CSS_TRANSLATEY": {},
+      "CSS_TRANSLATEZ": {},
+      "__getter__": {},
+      "operationType": {}
     },
-    "support_level": "untriaged"
+    "support_level": "deprecated"
   },
   "CSSUnknownRule": {
     "comment": "http://dev.w3.org/csswg/cssom/#the-cssstylesheet-interface",
@@ -1340,9 +1192,7 @@
   "DOMNamedFlowCollection": {
     "comment": "http://dev.w3.org/csswg/css-regions/#dom-named-flow-collection",
     "members": {
-      "__getter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
       "item": {},
       "length": {},
       "namedItem": {}
@@ -1369,9 +1219,7 @@
   "DOMSettableTokenList": {
     "comment": "http://dev.w3.org/html5/spec-LC/common-dom-interfaces.html#domsettabletokenlist-0",
     "members": {
-      "__getter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
       "value": {}
     },
     "support_level": "stable"
@@ -1388,15 +1236,9 @@
   "DOMStringMap": {
     "comment": "http://dev.w3.org/html5/spec-LC/common-dom-interfaces.html#domstringmap-0",
     "members": {
-      "__delete__": {
-        "support_level": "untriaged"
-      },
-      "__getter__": {
-        "support_level": "untriaged"
-      },
-      "__setter__": {
-        "support_level": "untriaged"
-      }
+      "__delete__": {},
+      "__getter__": {},
+      "__setter__": {}
     },
     "support_level": "stable"
   },
@@ -1424,9 +1266,7 @@
         "comment": "http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem",
         "support_level": "experimental"
       },
-      "__getter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
       "addEventListener": {},
       "alert": {},
       "applicationCache": {},
@@ -2122,8 +1962,7 @@
         "support_level": "experimental"
       },
       "preferredStylesheetSet": {
-        "comment": "http://dev.w3.org/csswg/cssom/#widl-Document-preferredStyleSheetSet",
-        "dart_action": "private"
+        "comment": "http://dev.w3.org/csswg/cssom/#widl-Document-preferredStyleSheetSet"
       },
       "queryCommandEnabled": {},
       "queryCommandIndeterm": {},
@@ -2139,8 +1978,7 @@
         "support_level": "experimental"
       },
       "selectedStylesheetSet": {
-        "comment": "http://dev.w3.org/csswg/cssom/#widl-Document-selectedStyleSheetSet",
-        "dart_action": "private"
+        "comment": "http://dev.w3.org/csswg/cssom/#widl-Document-selectedStyleSheetSet"
       },
       "styleSheets": {},
       "title": {},
@@ -2320,8 +2158,9 @@
     "support_level": "stable"
   },
   "EXTFragDepth": {
+    "comment": "http://www.khronos.org/registry/webgl/extensions/EXT_frag_depth/",
     "members": {},
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "EXTTextureFilterAnisotropic": {
     "comment": "http://www.khronos.org/registry/webgl/extensions/EXT_texture_filter_anisotropic/",
@@ -2656,12 +2495,13 @@
     "support_level": "stable"
   },
   "Entity": {
+    "dart_action": "suppress",
     "members": {
       "notationName": {},
       "publicId": {},
       "systemId": {}
     },
-    "support_level": "untriaged"
+    "support_level": "deprecated"
   },
   "EntityReference": {
     "dart_action": "suppress",
@@ -3206,9 +3046,7 @@
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dom-document-all",
     "dart_action": "suppress",
     "members": {
-      "__getter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
       "item": {},
       "length": {},
       "namedItem": {},
@@ -3451,9 +3289,7 @@
   "HTMLCollection": {
     "comment": "http://www.w3.org/TR/domcore/#interface-htmlcollection",
     "members": {
-      "__getter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
       "item": {},
       "length": {},
       "namedItem": {}
@@ -3662,12 +3498,8 @@
     "dart_action": "unstable",
     "members": {
       "HTMLEmbedElement": {},
-      "__getter__": {
-        "support_level": "untriaged"
-      },
-      "__setter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
+      "__setter__": {},
       "align": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLEmbedElement-partial",
         "dart_action": "suppress",
@@ -3717,9 +3549,7 @@
   "HTMLFormControlsCollection": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection-0",
     "members": {
-      "__getter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
       "namedItem": {}
     },
     "support_level": "stable"
@@ -3728,9 +3558,7 @@
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#the-form-element",
     "members": {
       "HTMLFormElement": {},
-      "__getter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
       "acceptCharset": {},
       "action": {},
       "autocomplete": {
@@ -4150,7 +3978,8 @@
       "href": {},
       "hreflang": {},
       "import": {
-        "support_level": "untriaged"
+        "comment": "https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html#interface-import",
+        "support_level": "experimental"
       },
       "media": {},
       "rel": {},
@@ -4375,6 +4204,7 @@
   "HTMLMetaElement": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#the-meta-element",
     "members": {
+      "HTMLMetaElement": {},
       "content": {},
       "httpEquiv": {},
       "name": {},
@@ -4433,12 +4263,8 @@
     "dart_action": "unstable",
     "members": {
       "HTMLObjectElement": {},
-      "__getter__": {
-        "support_level": "untriaged"
-      },
-      "__setter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
+      "__setter__": {},
       "align": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#HTMLObjectElement-partial",
         "dart_action": "suppress",
@@ -4632,6 +4458,7 @@
   "HTMLQuoteElement": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/grouping-content.html#the-blockquote-element",
     "members": {
+      "HTMLQuoteElement": {},
       "cite": {}
     },
     "support_level": "stable"
@@ -4671,9 +4498,7 @@
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#the-select-element",
     "members": {
       "HTMLSelectElement": {},
-      "__setter__": {
-        "support_level": "untriaged"
-      },
+      "__setter__": {},
       "autofocus": {},
       "checkValidity": {},
       "disabled": {},
@@ -4704,6 +4529,7 @@
   "HTMLShadowElement": {
     "comment": "https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-element",
     "members": {
+      "HTMLShadowElement": {},
       "olderShadowRoot": {},
       "resetStyleInheritance": {}
     },
@@ -5468,24 +5294,17 @@
     "support_level": "stable"
   },
   "MIDIAccess": {
+    "comment": "http://webaudio.github.io/web-midi-api/#midiaccess-interface",
     "members": {
-      "addEventListener": {
-        "support_level": "untriaged"
-      },
-      "dispatchEvent": {
-        "support_level": "untriaged"
-      },
-      "inputs": {
-        "support_level": "untriaged"
-      },
-      "outputs": {
-        "support_level": "untriaged"
-      },
-      "removeEventListener": {
-        "support_level": "untriaged"
-      }
+      "addEventListener": {},
+      "dispatchEvent": {},
+      "inputs": {},
+      "onconnect": {},
+      "ondisconnect": {},
+      "outputs": {},
+      "removeEventListener": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "MIDIConnectionEvent": {
     "comment": "http://webaudio.github.io/web-midi-api/#midiconnectionevent-interface",
@@ -5501,7 +5320,9 @@
   },
   "MIDIInput": {
     "comment": "http://webaudio.github.io/web-midi-api/#idl-def-MIDIInput",
-    "members": {},
+    "members": {
+      "onmidimessage": {}
+    },
     "support_level": "experimental"
   },
   "MIDIMessageEvent": {
@@ -5635,6 +5456,9 @@
       "dispatchEvent": {},
       "error": {},
       "keySystem": {},
+      "onwebkitkeyadded": {},
+      "onwebkitkeyerror": {},
+      "onwebkitkeymessage": {},
       "removeEventListener": {},
       "sessionId": {},
       "update": {}
@@ -5829,9 +5653,7 @@
   },
   "MimeTypeArray": {
     "members": {
-      "__getter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
       "item": {},
       "length": {},
       "namedItem": {}
@@ -5956,9 +5778,7 @@
     "comment": "http://dom.spec.whatwg.org/#namednodemap",
     "dart_action": "suppress",
     "members": {
-      "__getter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
       "getNamedItem": {},
       "getNamedItemNS": {},
       "item": {},
@@ -6081,15 +5901,9 @@
         "dart_action": "experimental",
         "support_level": "nonstandard"
       },
-      "constraintName": {
-        "support_level": "untriaged"
-      },
-      "message": {
-        "support_level": "untriaged"
-      },
-      "name": {
-        "support_level": "untriaged"
-      }
+      "constraintName": {},
+      "message": {},
+      "name": {}
     },
     "support_level": "experimental"
   },
@@ -6676,9 +6490,7 @@
   },
   "Plugin": {
     "members": {
-      "__getter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
       "description": {},
       "filename": {},
       "item": {},
@@ -6690,9 +6502,7 @@
   },
   "PluginArray": {
     "members": {
-      "__getter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
       "item": {},
       "length": {},
       "namedItem": {},
@@ -6918,9 +6728,7 @@
   "RTCStatsResponse": {
     "comment": "http://dev.w3.org/2011/webrtc/editor/webrtc.html#widl-RTCStatsReport-RTCStats-getter-DOMString-id",
     "members": {
-      "__getter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
       "namedItem": {},
       "result": {}
     },
@@ -7038,12 +6846,12 @@
     "support_level": "stable"
   },
   "ResourceProgressEvent": {
+    "comment": "https://chromiumcodereview.appspot.com/14773025/",
+    "dart_action": "suppress",
     "members": {
-      "url": {
-        "support_level": "untriaged"
-      }
+      "url": {}
     },
-    "support_level": "untriaged"
+    "support_level": "experimental"
   },
   "SQLError": {
     "comment": "http://www.w3.org/TR/webdatabase/#sqlerror",
@@ -10493,15 +10301,9 @@
     "comment": "http://www.w3.org/TR/webstorage/#the-storage-interface",
     "dart_action": "unstable",
     "members": {
-      "__delete__": {
-        "support_level": "untriaged"
-      },
-      "__getter__": {
-        "support_level": "untriaged"
-      },
-      "__setter__": {
-        "support_level": "untriaged"
-      },
+      "__delete__": {},
+      "__getter__": {},
+      "__setter__": {},
       "clear": {},
       "getItem": {},
       "key": {},
@@ -10595,9 +10397,7 @@
   "StyleSheetList": {
     "comment": "http://dev.w3.org/csswg/cssom/#the-stylesheetlist-sequence",
     "members": {
-      "__getter__": {
-        "support_level": "untriaged"
-      },
+      "__getter__": {},
       "item": {},
       "length": {}
     },
@@ -10948,9 +10748,7 @@
     "comment": "https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#dfn-WaveShaperNode",
     "members": {
       "curve": {},
-      "oversample": {
-        "support_level": "untriaged"
-      }
+      "oversample": {}
     },
     "support_level": "experimental"
   },
@@ -11556,137 +11354,6 @@
     "members": {},
     "support_level": "experimental"
   },
-  "WebKitCSSFilterRule": {
-    "comment": "http://www.w3.org/TR/filter-effects/",
-    "members": {
-      "style": {}
-    },
-    "support_level": "experimental"
-  },
-  "WebKitCSSFilterValue": {
-    "comment": "http://dev.w3.org/csswg/cssom/",
-    "dart_action": "suppress",
-    "members": {
-      "CSS_FILTER_BLUR": {},
-      "CSS_FILTER_BRIGHTNESS": {},
-      "CSS_FILTER_CONTRAST": {},
-      "CSS_FILTER_CUSTOM": {},
-      "CSS_FILTER_DROP_SHADOW": {},
-      "CSS_FILTER_GRAYSCALE": {},
-      "CSS_FILTER_HUE_ROTATE": {},
-      "CSS_FILTER_INVERT": {},
-      "CSS_FILTER_OPACITY": {},
-      "CSS_FILTER_REFERENCE": {},
-      "CSS_FILTER_SATURATE": {},
-      "CSS_FILTER_SEPIA": {},
-      "operationType": {}
-    },
-    "support_level": "deprecated"
-  },
-  "WebKitCSSKeyframeRule": {
-    "comment": "http://www.w3.org/TR/css3-animations/#CSSKeyframeRule-interface",
-    "members": {
-      "keyText": {},
-      "style": {}
-    },
-    "support_level": "experimental"
-  },
-  "WebKitCSSKeyframesRule": {
-    "comment": "http://www.w3.org/TR/css3-animations/#csskeyframesrule",
-    "members": {
-      "__getter__": {
-        "support_level": "untriaged"
-      },
-      "cssRules": {},
-      "deleteRule": {},
-      "findRule": {},
-      "insertRule": {},
-      "name": {}
-    },
-    "support_level": "experimental"
-  },
-  "WebKitCSSMatrix": {
-    "comment": "http://dev.w3.org/csswg/cssom/",
-    "dart_action": "suppress",
-    "members": {
-      "WebKitCSSMatrix": {},
-      "a": {},
-      "b": {},
-      "c": {},
-      "d": {},
-      "e": {},
-      "f": {},
-      "inverse": {},
-      "m11": {},
-      "m12": {},
-      "m13": {},
-      "m14": {},
-      "m21": {},
-      "m22": {},
-      "m23": {},
-      "m24": {},
-      "m31": {},
-      "m32": {},
-      "m33": {},
-      "m34": {},
-      "m41": {},
-      "m42": {},
-      "m43": {},
-      "m44": {},
-      "multiply": {},
-      "rotate": {},
-      "rotateAxisAngle": {},
-      "scale": {},
-      "setMatrixValue": {},
-      "skewX": {},
-      "skewY": {},
-      "toString": {},
-      "translate": {}
-    },
-    "support_level": "deprecated"
-  },
-  "WebKitCSSMixFunctionValue": {
-    "comment": "http://dev.w3.org/csswg/cssom/",
-    "dart_action": "suppress",
-    "members": {},
-    "support_level": "deprecated"
-  },
-  "WebKitCSSRegionRule": {
-    "comment": "http://dev.w3.org/csswg/css-regions/#region-style-rule-interface",
-    "members": {
-      "cssRules": {}
-    },
-    "support_level": "experimental"
-  },
-  "WebKitCSSTransformValue": {
-    "comment": "http://dev.w3.org/csswg/cssom/",
-    "dart_action": "suppress",
-    "members": {
-      "CSS_MATRIX": {},
-      "CSS_MATRIX3D": {},
-      "CSS_PERSPECTIVE": {},
-      "CSS_ROTATE": {},
-      "CSS_ROTATE3D": {},
-      "CSS_ROTATEX": {},
-      "CSS_ROTATEY": {},
-      "CSS_ROTATEZ": {},
-      "CSS_SCALE": {},
-      "CSS_SCALE3D": {},
-      "CSS_SCALEX": {},
-      "CSS_SCALEY": {},
-      "CSS_SCALEZ": {},
-      "CSS_SKEW": {},
-      "CSS_SKEWX": {},
-      "CSS_SKEWY": {},
-      "CSS_TRANSLATE": {},
-      "CSS_TRANSLATE3D": {},
-      "CSS_TRANSLATEX": {},
-      "CSS_TRANSLATEY": {},
-      "CSS_TRANSLATEZ": {},
-      "operationType": {}
-    },
-    "support_level": "deprecated"
-  },
   "WebKitMediaSource": {
     "comment": "https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#mediasource",
     "members": {
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index e54caf0..34d151a 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -56,6 +56,10 @@
       "@Returns('String|CanvasGradient|CanvasPattern')",
     ],
 
+    'CustomEvent.detail': [
+      "@Creates('Null')",
+    ],
+
     # Normally DOMWindow is nevernull, but starting from a <template> element in
     # JavaScript, this will be null:
     #     template.content.ownerDocument.defaultView
@@ -75,6 +79,10 @@
       "@Creates('SqlDatabase')",
     ],
 
+    'DOMWindow.showModalDialog': [
+      "@Creates('Null')",
+    ],
+
     # To be in callback with the browser-created Event, we had to have called
     # addEventListener on the target, so we avoid
     'Event.currentTarget': [
@@ -88,19 +96,20 @@
       "@Returns('EventTarget|=Object')",
     ],
 
-    'MouseEvent.relatedTarget': [
-      "@Creates('Node')",
-      "@Returns('EventTarget|=Object')",
-    ],
-
-    # Touch targets are Elements in a Document, or the Document.
-    'Touch.target': [
-      "@Creates('Element|Document')",
-      "@Returns('Element|Document')",
+    'File.lastModifiedDate': [
+      "@Creates('Null')", # JS date object.
     ],
 
     'FileReader.result': ["@Creates('String|ByteBuffer|Null')"],
 
+    'FocusEvent.relatedTarget': [
+      "@Creates('Null')",
+    ],
+
+    'HTMLInputElement.valueAsDate': [
+      "@Creates('Null')", # JS date object.
+    ],
+
     # Rather than have the result of an IDBRequest as a union over all possible
     # results, we mark the result as instantiating any classes, and mark
     # each operation with the classes that it could cause to be asynchronously
@@ -138,9 +147,35 @@
       "@_annotation_Returns_IDBKey",
     ],
 
-    '+IDBRequest': [
-      "@Returns('Request')",
-      "@Creates('Request')",
+    'IDBCursor.primaryKey': [
+      "@_annotation_Creates_IDBKey",
+      "@_annotation_Returns_IDBKey",
+    ],
+
+    'IDBCursor.source': [
+      "@Creates('Null')",
+      "@Returns('ObjectStore|Index|Null')",
+    ],
+
+    'IDBDatabase.version': [
+      "@Creates('int|String|Null')",
+      "@Returns('int|String|Null')",
+    ],
+
+    'IDBIndex.keyPath': [
+      "@annotation_Creates_SerializedScriptValue",
+    ],
+
+    'IDBKeyRange.lower': [
+      "@annotation_Creates_SerializedScriptValue",
+    ],
+
+    'IDBKeyRange.upper': [
+      "@annotation_Creates_SerializedScriptValue",
+    ],
+
+    'IDBObjectStore.keyPath': [
+      "@annotation_Creates_SerializedScriptValue",
     ],
 
     '+IDBOpenDBRequest': [
@@ -148,16 +183,46 @@
       "@Creates('Request')",
     ],
 
+    '+IDBRequest': [
+      "@Returns('Request')",
+      "@Creates('Request')",
+    ],
+
+    'IDBVersionChangeEvent.newVersion': [
+      "@Creates('int|String|Null')",
+      "@Returns('int|String|Null')",
+    ],
+
+    'IDBVersionChangeEvent.oldVersion': [
+      "@Creates('int|String|Null')",
+      "@Returns('int|String|Null')",
+    ],
+
     'MessageEvent.ports': ["@Creates('=List')"],
 
     'MessageEvent.data': [
       "@annotation_Creates_SerializedScriptValue",
       "@annotation_Returns_SerializedScriptValue",
     ],
+
+    'Metadata.modificationTime': [
+      "@Creates('Null')", # JS date object.
+    ],
+
+    'MouseEvent.relatedTarget': [
+      "@Creates('Node')",
+      "@Returns('EventTarget|=Object')",
+    ],
+
     'PopStateEvent.state': [
       "@annotation_Creates_SerializedScriptValue",
       "@annotation_Returns_SerializedScriptValue",
     ],
+
+    'RTCStatsReport.timestamp': [
+      "@Creates('Null')", # JS date object.
+    ],
+
     'SerializedScriptValue': [
       "@annotation_Creates_SerializedScriptValue",
       "@annotation_Returns_SerializedScriptValue",
@@ -165,6 +230,56 @@
 
     'SQLResultSetRowList.item': ["@Creates('=Object')"],
 
+    # Touch targets are Elements in a Document, or the Document.
+    'Touch.target': [
+      "@Creates('Element|Document')",
+      "@Returns('Element|Document')",
+    ],
+
+    'TrackEvent.track': [
+      "@Creates('Null')",
+    ],
+
+    'WebGLRenderingContext.getBufferParameter': [
+      "@Creates('int|Null')",
+      "@Returns('int|Null')",
+    ],
+
+    'WebGLRenderingContext.getFramebufferAttachmentParameter': [
+      "@Creates('int|Renderbuffer|Texture|Null')",
+      "@Returns('int|Renderbuffer|Texture|Null')",
+    ],
+
+    'WebGLRenderingContext.getProgramParameter': [
+      "@Creates('int|bool|Null')",
+      "@Returns('int|bool|Null')",
+    ],
+
+    'WebGLRenderingContext.getRenderbufferParameter': [
+      "@Creates('int|Null')",
+      "@Returns('int|Null')",
+    ],
+
+    'WebGLRenderingContext.getShaderParameter': [
+      "@Creates('int|Null')",
+      "@Returns('int|Null')",
+    ],
+
+    'WebGLRenderingContext.getTexParameter': [
+      "@Creates('int|Null')",
+      "@Returns('int|Null')",
+    ],
+
+    'WebGLRenderingContext.getUniform': [
+      "@Creates('Null|num|String|bool|=List|Float32List|Int32List|Uint32List')",
+      "@Returns('Null|num|String|bool|=List|Float32List|Int32List|Uint32List')",
+    ],
+
+    'WebGLRenderingContext.getVertexAttrib': [
+      "@Creates('Null|num|bool|Float32List|Buffer')",
+      "@Returns('Null|num|bool|Float32List|Buffer')",
+    ],
+
     'WebGLRenderingContext.getParameter': [
       # Taken from http://www.khronos.org/registry/webgl/specs/latest/
       # Section 5.14.3 Setting and getting state
@@ -610,6 +725,8 @@
         annotations.append('@deprecated // %s' % support_level)
         # TODO (blois): suppress generation of these APIs as a separate CL.
         pass
+      elif dart_action == 'stable':
+        pass
       else:
         _logger.warn('Unknown dart_action - %s:%s' % (interface_id, member_id))
     elif support_level == 'untriaged':
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 05e0b21..b4bccf9 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -458,7 +458,7 @@
     metadata = ''
     if '_RenamingAnnotation' in dir(self):
       metadata = (self._RenamingAnnotation(info.declared_name, html_name) +
-          self._Metadata(info.type_name, info.declared_name))
+          self._Metadata(info.type_name, info.declared_name, None))
     self._members_emitter.Emit(
         '\n'
         '  $METADATA$MODIFIERS$TYPE$FUTURE_GENERIC $NAME($PARAMS) {\n'
diff --git a/tools/dom/scripts/htmleventgenerator.py b/tools/dom/scripts/htmleventgenerator.py
index c2ead7c..da50b72 100644
--- a/tools/dom/scripts/htmleventgenerator.py
+++ b/tools/dom/scripts/htmleventgenerator.py
@@ -155,10 +155,16 @@
   'IDBOpenDBRequest.upgradeneeded': ('upgradeNeeded', 'VersionChangeEvent'),
   'IDBRequest.success': ('success', 'Event'),
   'IDBTransaction.complete': ('complete', 'Event'),
+  'MediaKeySession.webkitkeyadded': ('keyAdded', 'MediaKeyEvent'),
+  'MediaKeySession.webkitkeyerror': ('keyError', 'MediaKeyEvent'),
+  'MediaKeySession.webkitkeymessage': ('keyMessage', 'MediaKeyEvent'),
   'MediaStream.addtrack': ('addTrack', 'Event'),
   'MediaStream.removetrack': ('removeTrack', 'Event'),
   'MediaStreamTrack.mute': ('mute', 'Event'),
   'MediaStreamTrack.unmute': ('unmute', 'Event'),
+  'MIDIAccess.connect': ('connect', 'MidiConnectionEvent'),
+  'MIDIAccess.disconnect': ('disconnect', 'MidiConnectionEvent'),
+  'MIDIInput.midimessage': ('midiMessage', 'MidiMessageEvent'),
   'MIDIPort.disconnect': ('disconnect', 'MidiConnectionEvent'),
   'Notification.click': ('click', 'Event'),
   'Notification.close': ('close', 'Event'),
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index d9a9d48..59d7edc 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -57,10 +57,6 @@
     'SVGSVGElement': 'SvgSvgElement', # Manual to avoid name conflicts.
     'StringCallback': '_StringCallback',
     'WebGLVertexArrayObjectOES': 'VertexArrayObject',
-    'WebKitCSSFilterRule': '_WebKitCssFilterRule',
-    'WebKitCSSKeyframeRule': '_WebKitCssKeyframeRule',
-    'WebKitCSSKeyframesRule': '_WebKitCssKeyframesRule',
-    'WebKitCSSRegionRule': '_WebKitCssRegionRule',
     'XMLHttpRequest': 'HttpRequest',
     'XMLHttpRequestProgressEvent': 'HttpRequestProgressEvent',
     'XMLHttpRequestUpload': 'HttpRequestUpload',
@@ -119,10 +115,6 @@
   'SVGVKernElement',
   'SharedWorker', # Workers
   'SharedWorkerContext', # Workers
-  'WebKitCSSFilterValue',
-  'WebKitCSSMatrix',
-  'WebKitCSSMixFunctionValue',
-  'WebKitCSSTransformValue',
   'WorkerContext', # Workers
   'WorkerLocation', # Workers
   'WorkerNavigator', # Workers
@@ -592,6 +584,7 @@
     'HTMLTitleElement.text',
     'HTMLUListElement.compact',
     'HTMLUListElement.type',
+    'Location.valueOf',
     'MessageEvent.webkitInitMessageEvent',
     'MouseEvent.x',
     'MouseEvent.y',
diff --git a/tools/dom/scripts/logging.conf b/tools/dom/scripts/logging.conf
index 6dbf12e..bc2e8cc 100644
--- a/tools/dom/scripts/logging.conf
+++ b/tools/dom/scripts/logging.conf
@@ -1,5 +1,5 @@
 [loggers]
-keys=root,pegparser,database,databasebuilder,dartgenerator,dartmetadata,snippet_manager,htmlrenamer,fremontcutbuilder
+keys=root,pegparser,database,databasebuilder,dartgenerator,dartmetadata,snippet_manager,htmlrenamer,fremontcutbuilder, systemhtml
 
 [handlers]
 keys=consoleHandler
@@ -65,6 +65,12 @@
 handlers=consoleHandler
 qualname=dartmetadata
 
+[logger_systemhtml]
+level=INFO
+propagate=0
+handlers=consoleHandler
+qualname=systemhtml
+
 [formatter_simpleFormatter]
 format=%(name)s - %(levelname)s - %(message)s
 datefmt=
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index cc0d179..304c145 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -7,11 +7,15 @@
 Dart:html APIs from the IDL database."""
 
 import emitter
+import logging
 import monitored
 import os
+import re
 from generator import *
 from htmldartgenerator import *
 
+_logger = logging.getLogger('systemhtml')
+
 HTML_LIBRARY_NAMES = ['chrome', 'html', 'indexed_db', 'svg',
                       'web_audio', 'web_gl', 'web_sql']
 
@@ -163,6 +167,7 @@
   'HTMLLinkElement': 'link',
   'HTMLMapElement': 'map',
   'HTMLMenuElement': 'menu',
+  'HTMLMetaElement': 'meta',
   'HTMLMeterElement': 'meter',
   'HTMLOListElement': 'ol',
   'HTMLObjectElement': 'object',
@@ -172,8 +177,10 @@
   'HTMLParamElement': 'param',
   'HTMLPreElement': 'pre',
   'HTMLProgressElement': 'progress',
+  'HTMLQuoteElement': 'q',
   'HTMLScriptElement': 'script',
   'HTMLSelectElement': 'select',
+  'HTMLShadowElement': 'shadow',
   'HTMLSourceElement': 'source',
   'HTMLSpanElement': 'span',
   'HTMLStyleElement': 'style',
@@ -794,7 +801,7 @@
 
     output_type = self.SecureOutputType(attribute.type.id)
     input_type = self._NarrowInputType(attribute.type.id)
-    metadata = self._Metadata(attribute.type.id, attribute.id)
+    metadata = self._Metadata(attribute.type.id, attribute.id, output_type)
     rename = self._RenamingAnnotation(attribute.id, html_name)
     if not read_only:
       self._members_emitter.Emit(
@@ -867,7 +874,7 @@
         "\n  @JSName('$NAME')"
         '\n  $(METADATA)final $NATIVE_TYPE _get_$HTML_NAME;'
         '\n',
-        METADATA=self._Metadata(attr.type.id, html_name),
+        METADATA=self._Metadata(attr.type.id, html_name, conversion.input_type),
         CONVERT=conversion.function_name,
         HTML_NAME=html_name,
         NAME=attr.id,
@@ -916,7 +923,8 @@
         '\n'
         '  $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n',
         RENAME=self._RenamingAnnotation(info.declared_name, html_name),
-        METADATA=self._Metadata(info.type_name, info.declared_name),
+        METADATA=self._Metadata(info.type_name, info.declared_name,
+            self.SecureOutputType(info.type_name)),
         MODIFIERS='static ' if info.IsStatic() else '',
         TYPE=self.SecureOutputType(info.type_name),
         NAME=html_name,
@@ -998,14 +1006,14 @@
       self._members_emitter.Emit(
           '  $RENAME$METADATA$MODIFIERS$TYPE$TARGET($PARAMS) native;\n',
           RENAME=self._RenamingAnnotation(info.declared_name, target),
-          METADATA=self._Metadata(info.type_name, info.declared_name),
+          METADATA=self._Metadata(info.type_name, info.declared_name, None),
           MODIFIERS='static ' if info.IsStatic() else '',
           TYPE=TypeOrNothing(native_return_type),
           TARGET=target,
           PARAMS=', '.join(target_parameters))
 
     declaration = '%s%s%s %s(%s)' % (
-        self._Metadata(info.type_name, info.declared_name),
+        self._Metadata(info.type_name, info.declared_name, return_type),
         'static ' if info.IsStatic() else '',
         return_type,
         html_name,
@@ -1053,7 +1061,7 @@
       return  "@JSName('%s')\n  " % idl_name
     return ''
 
-  def _Metadata(self, idl_type, idl_member_name, indent='  '):
+  def _Metadata(self, idl_type, idl_member_name, dart_type, indent='  '):
     anns = self._metadata.GetDart2JSMetadata(
         idl_type, self._library_name, self._interface, idl_member_name)
 
@@ -1066,6 +1074,13 @@
           "@Returns('%s')" % native_type,
           "@Creates('%s')" % native_type,
         ]
+    if dart_type == 'dynamic' or dart_type == 'Object':
+      def js_type_annotation(ann):
+        return re.search('^@.*Returns', ann) or re.search('^@.*Creates', ann)
+      if not filter(js_type_annotation, anns):
+        _logger.warn('Member with wildcard native type: %s.%s' %
+            (self._interface.id, idl_member_name))
+
     return self._metadata.FormatMetadata(anns, indent);
 
   def CustomJSMembers(self):
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index b843324..b9885df 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -92,4 +92,5 @@
   return JS('var', r'ReceivePortSync.dispatchCall(#, #)', id, message);
 }
 
-spawnDomFunction(Function f) => IsolateNatives.spawnDomFunction(f);
+Future<SendPort> spawnDomFunction(Function f) =>
+  new Future.value(IsolateNatives.spawnDomFunction(f));
diff --git a/tools/dom/templates/html/impl/impl_AudioContext.darttemplate b/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
index 9100aba..a500495 100644
--- a/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
+++ b/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
@@ -20,7 +20,7 @@
 
   ScriptProcessorNode createScriptProcessor(int bufferSize,
       [int numberOfInputChannels, int numberOfOutputChannels]) {
-    var function = JS('dynamic', '#.createScriptProcessor || '
+    var function = JS('=Object', '#.createScriptProcessor || '
         '#.createJavaScriptNode', this, this);
     if (numberOfOutputChannels != null) {
       return JS('ScriptProcessorNode', '#.call(#, #, #, #)', function, this,
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index cea6c05..a6e165d 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -410,8 +410,7 @@
   Rect get offset => new Rect(offsetLeft, offsetTop, offsetWidth, offsetHeight);
 
   /**
-   * Adds the specified text as a text node after the last child of this
-   * element.
+   * Adds the specified text after the last child of this element.
    */
   void appendText(String text) {
     this.insertAdjacentText('beforeend', text);
@@ -550,7 +549,7 @@
     return 'transitionend';
   }
   /**
-   * Creates a text node and inserts it into the DOM at the specified location.
+   * Inserts text into the DOM at the specified location.
    *
    * To see the possible values for [where], read the doc for
    * [insertAdjacentHtml].
diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi
index adcbbdf..ba2445a 100644
--- a/tools/gyp/configurations_make.gypi
+++ b/tools/gyp/configurations_make.gypi
@@ -51,7 +51,6 @@
             '-marm',
             '-march=armv7-a',
             '-mfpu=vfp',
-            '-mfloat-abi=softfp',
             '-Wno-psabi', # suppresses va_list warning
             '-fno-strict-overflow',
           ],
diff --git a/tools/make_links.py b/tools/make_links.py
index 965d04f..66f94e6 100644
--- a/tools/make_links.py
+++ b/tools/make_links.py
@@ -11,15 +11,23 @@
 the name of the target link.
 
 Usage:
-  python tools/make_links.py TARGET SOURCES...
+  python tools/make_links.py OPTIONS TARGET SOURCES...
 '''
 
+import optparse
 import os
 import subprocess
 import sys
 import utils
 
 
+def get_options():
+  result = optparse.OptionParser()
+  result.add_option("--timestamp_file", "",
+      help='Create a timestamp file when done creating the links.',
+      default='')
+  return result.parse_args()
+
 def make_link(source, target):
   if os.path.islink(target):
     print 'Removing %s' % target
@@ -39,12 +47,20 @@
   else:
     return subprocess.call(['ln', '-s', source, target])
 
+def create_timestamp_file(options):
+  if options.timestamp_file != '':
+    dir_name = os.path.dirname(options.timestamp_file)
+    if not os.path.exists(dir_name):
+      os.mkdir(dir_name)
+    open(options.timestamp_file, 'w').close()
+  
 
 def main(argv):
-  target = os.path.relpath(argv[1])
+  (options, args) = get_options()
+  target = os.path.relpath(args[0])
   if not os.path.exists(target):
     os.makedirs(target)
-  for source in argv[2:]:
+  for source in args[1:]:
     # Assume the source directory is named ".../NAME/lib".
     (name, lib) = os.path.split(source)
     if lib != 'lib':
@@ -58,6 +74,7 @@
     exit_code = make_link(source, os.path.join(target, name))
     if exit_code != 0:
       return exit_code
+  create_timestamp_file(options)
   return 0
 
 
diff --git a/tools/testing/dart/browser_test.dart b/tools/testing/dart/browser_test.dart
index 2e9ec0a..3d9dbd9 100644
--- a/tools/testing/dart/browser_test.dart
+++ b/tools/testing/dart/browser_test.dart
@@ -29,6 +29,8 @@
   </script>
   <script type="text/javascript"
           src="/root_dart/pkg/browser/lib/dart.js"></script>
+  <script type="text/javascript"
+          src="/root_dart/pkg/browser/lib/interop.js"></script>
 </body>
 </html>
 """;
diff --git a/utils/compiler/compiler.gyp b/utils/compiler/compiler.gyp
index 8c95316..e5eb4ab 100644
--- a/utils/compiler/compiler.gyp
+++ b/utils/compiler/compiler.gyp
@@ -12,6 +12,7 @@
       'type': 'none',
       'dependencies': [
         '../../runtime/dart-runtime.gyp:dart',
+        '../../pkg/pkg.gyp:pkg_packages',
       ],
       'actions': [
         {
@@ -21,6 +22,7 @@
             '../../sdk/lib/_internal/libraries.dart',
             '<!@(["python", "../../tools/list_files.py", "\\.dart$", "../../sdk/lib/_internal/compiler", "../../runtime/lib", "../../sdk/lib/_internal/dartdoc"])',
             'create_snapshot.dart',
+            '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
           ],
           'outputs': [
             '<(SHARED_INTERMEDIATE_DIR)/utils_wrapper.dart.snapshot',
diff --git a/utils/compiler/create_snapshot.dart b/utils/compiler/create_snapshot.dart
index d3a460e..e48900f 100644
--- a/utils/compiler/create_snapshot.dart
+++ b/utils/compiler/create_snapshot.dart
@@ -58,7 +58,7 @@
 Future createSnapshot(var options, var dart_file, var packageRoot) {
   return Process.run(options.executable,
                      ["--package-root=$packageRoot",
-                      "--generate-script-snapshot=$dart_file.snapshot",
+                      "--snapshot=$dart_file.snapshot",
                       dart_file])
       .then((result) {
         if (result.exitCode != 0) {
diff --git a/utils/pub/pub.gyp b/utils/pub/pub.gyp
index d15bcdb..fd5e147 100644
--- a/utils/pub/pub.gyp
+++ b/utils/pub/pub.gyp
@@ -27,7 +27,7 @@
           'action': [
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
             '--package-root=<(PRODUCT_DIR)/packages/',
-            '--generate-script-snapshot=<(SHARED_INTERMEDIATE_DIR)/pub.dart.snapshot',
+            '--snapshot=<(SHARED_INTERMEDIATE_DIR)/pub.dart.snapshot',
             '../../sdk/lib/_internal/pub/bin/pub.dart',
           ],
         },